Unity 之基于URP使用UniStorm Weather System天气系统

内容将会持续更新,有错误的地方欢迎指正,谢谢!

Unity 之基于URP使用UniStorm Weather System天气系统


|-----------------------------------------------------|
| TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 ------ 不断努力,不断进步,不断探索 |

|----------------------------------------------------------------------|
| TechX ------ 心探索、心进取! 助力快速实现 UniStorm 基于URP的天气系统 为初学者节省宝贵的学习时间,避免困惑! |

前言:

Unity 版本:2021.3.38f1

UniStorm-Volumetric-Clouds-Sky-v5.3.1.unitypackage

在URP中使用UniStorm URP System时,需要先搭建好URP的环境,这里不在赘述,不清楚的童鞋,可以去网上找一下教程。

我这里做测试时使用的Unity版本是2021.3.38f1,UniStorm 插件可以去官网 Asset Store下载。

TechX 教程效果:


文章目录


一、导入UniStorm-Volumetric-Clouds-Sky-v5.3.1.unitypackage插件

将UniStorm包导入到Unity中,导入之后可以看到UniStorm Weather System文件夹,其中可以看到URP Support文件夹,表示这个插件支持URP。


二、安装UniStorm URP Support

找到位于 UniStorm Weather System>URP Support>UniStorm URP Support 下的 UnityPackage,并将其导入到当前项目中(您可以通过在 Unity 中双击 UniStorm URP Support UnityPackage 文件来导入)。

这将更新多个脚本和着色器以与 URP 兼容,添加一些新脚本,并向管道资源添加一些图像效果。


三、配置URP管线资源

打开Project Settings面板,从Graphics选项中找到当前使用的渲染管线。

1、设置UniversalRenderPipelineAsset

选择当前的渲染管线UniversalRenderPipelineAsset,在Inspector面板上找到属性Depth Texture并勾选。

2、设置UniversalRenderPipelineAsset_Renderer

选择当前的渲染管线UniversalRenderPipelineAsset,在Inspector面板上找到Renderer List列表并选中UniversalRenderPipelineAsset_Renderer。

如下图所示,设置Rendering下的Rendering Path为Forward,设置Depth Priming Mode 为Forced。

设置Compatibility下的Internediate Texture 为Always,这将使添加的Render Features可见

3、添加URP Renderer Features

在完成设置之后你可以转到"Window">"UniStorm">"Add URP Renderer Features"。这会自动将添加所需的渲染器功能添加到你的通用渲染管道资产中。


四、UniStorm URP Support 示例场景

你现在可以测试位于 UniStorm Weather System>URP Support>Scene 下的 UniStorm URP Support示例场景。

场景中UniStorm URP System为天气系统管理脚本,在这里可以对天气系统进行各种各样的配置。


五、UniStorm System 示例演示

这里以5种天气的切换为例,可以切换晴天、雾天、小雨、中雨和大雨,同时还可以切换时间段,正午、黄昏和傍晚。

csharp 复制代码
/// <summary>
/// 天气类型
/// </summary>
public enum WeatherType : int
{
    Sun = 1,    //晴天
    Fog = 2,    //雾天
    LightRain = 3,    //小雨
    ModerateRain = 4,    //中雨
    HeavyRain = 5,    //大雨
}

/// <summary>
/// 当前天气的时间段
/// </summary>
public enum WeatherTimeType : int
{
    Noon = 1,    //正午
    Dusk = 2,    //黄昏
    Evening = 3,    //傍晚
}
 
public class WeatherControl : MonoBehaviour
{
    /// <summary>
    /// 根据天气时间和天气类型改变天气
    /// </summary>
    /// <param name="weatherType"></param>
    /// <param name="weatherTimeType"></param>
    public void ChangeWeather(WeatherType weatherType, WeatherTimeType weatherTimeType)
    {
        ChangeWeatherTimeType(weatherTimeType);

        ChangeWeatherType(GetWeather(weatherType),true);
    }

    private void ChangeWeatherType(UniStorm.WeatherType weatherType,bool isInstantly=false)
    {
        if (isInstantly)
        {
            //Change Weather UI Instantly
            UniStormManager.Instance.ChangeWeatherInstantly(weatherType);
        }
        else
        {
            //Change Weather UI With Transition
            UniStormManager.Instance.ChangeWeatherWithTransition(weatherType);
        }           
    }       

    private void ChangeWeatherTimeType(WeatherTimeType dayTime)
    {
        switch (dayTime)
        {
            case WeatherTimeType.Noon:
                UniStormSystem.Instance.m_TimeFloat = 0.5f;
                break;
            case WeatherTimeType.Dusk:
                UniStormSystem.Instance.m_TimeFloat = 0.729f;
                break;
            case WeatherTimeType.Evening:
                UniStormSystem.Instance.m_TimeFloat = 0.8125f;
                break;
        }
    }

    /// <summary>
    /// 获取所有类型的天气
    /// </summary>
    /// <returns></returns>
    private List<UniStorm.WeatherType> GetAllWeatherTypes()
    {
        return UniStormSystem.Instance.AllWeatherTypes;
    }

    /// <summary>
    /// Sun-Mostly Clear    Fog-Foggy   LightRain-Light Rain    ModerateRain Rain    HeavyRain Heavy Rain
    /// </summary>
    /// <param name="weatherType"></param>
    /// <returns></returns>
    private UniStorm.WeatherType GetWeather(WeatherType weatherType)
    {
        string weathName = "";
        switch (weatherType)
        {
            case WeatherType.Sun:
                weathName = "Clear";
                break;
            case WeatherType.Fog:
                weathName = "Foggy";
                break;
            case WeatherType.LightRain:
                weathName = "Light Rain";
                break;
            case WeatherType.ModerateRain:
                weathName = "Rain";
                break;
            case WeatherType.HeavyRain:
                weathName = "Heavy Rain";
                break;
        }

        return GetWeatherByName(weathName);
    }

    /// <summary>
    /// 获取天气的名称
    /// </summary>
    /// <param name="weatherType"></param>
    /// <returns></returns>
    private UniStorm.WeatherType GetWeatherByName(string weatherName)
    {
        List<UniStorm.WeatherType> weatherTypes = GetAllWeatherTypes();
        IEnumerable<UniStorm.WeatherType> vs = weatherTypes.Where((item) => item.WeatherTypeName == weatherName);
        UniStorm.WeatherType weatherType = null;
        if (vs.Count() > 0)
        {
            weatherType = vs.FirstOrDefault();
        }
        return weatherType;
    }
}

|-----------------------------------------------|
| TechX ------ 心探索、心进取! 每一次跌倒都是一次成长 每一次努力都是一次进步 |


END 感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

相关推荐
Doc.S1 小时前
多无人机任务自定义(基于ZJU-FAST-Lab / EGO-Planner-v2)
游戏引擎·无人机·cocos2d
那个村的李富贵3 小时前
Unity打包Webgl后 本地运行测试
unity·webgl
nnsix4 小时前
Unity OpenXR开发HTC Vive Cosmos
unity·游戏引擎
nnsix4 小时前
Unity OpenXR,扳机键交互UI时,必须按下扳机才触发
unity·游戏引擎
nnsix4 小时前
Unity XR 编辑器VR设备模拟功能
unity·编辑器·xr
老朱佩琪!4 小时前
Unity访问者模式
unity·游戏引擎·访问者模式
不定时总结的那啥5 小时前
Unity实现点击Console消息自动选中预制体的方法
unity·游戏引擎
nnsix5 小时前
Unity OpenXR 关闭手柄的震动
unity·游戏引擎
CreasyChan5 小时前
Unity 中的反射使用详解
unity·c#·游戏引擎·游戏开发
Jessica巨人5 小时前
Shader显示为黑色
unity·shader