Unity中的Unistorm3.0天气系统笔记

这篇具有很好参考价值的文章主要介绍了Unity中的Unistorm3.0天气系统笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unistorm是Unity中的一个天气系统,它功能强大,效果优美。本文所述UniStorm为3.0版本,仅用于学习之用。

一、如何设置【白天】、【黑夜】和【天气类型】?

在Running模式下,按下Esc按键,会【弹出】或者【隐藏】天气设置界面

  • 第一个滑动条为:当下的时辰【对应从早到晚的进度】
  • 第二个下拉框为:天气的类型
  • 第三个按钮:确定按钮
    Unity中的Unistorm3.0天气系统笔记,unity,UniStorm,天气系统

二、如何禁用时间流淌(Time Flow)功能?

有时候,用户操作的慢了,天气突然从白天变成黑夜,乌漆嘛黑的伸手不见五指。为了防止这种尴尬,所以有时候需要关闭时间流淌的功能。
【UniStorm System】->【Time】->【Time Flow】 设置成[Disabled]
Unity中的Unistorm3.0天气系统笔记,unity,UniStorm,天气系统

三、模拟飞机在云团中穿行时,如何制作一个全景包围球?

需求:UniStorm中的天空盒是一个半球,如果要模拟飞机在云团中穿行,那么需要一整个球把飞机包住。
解决:在运行状态下,再复制出一个天气半球,并设置两个半球是合在一起的。
Unity中的Unistorm3.0天气系统笔记,unity,UniStorm,天气系统

(1)云层的天空半球

/// <summary>
/// 云层组件
/// </summary>
[Header("云层组件")]
public GameObject UniStormClouds;

(2)复制天空半球,设置对原来的球的对面,让两个半球合拢成一个球。
参数为硬编码,提前在Editor的running模式下,手工操作一遍,然后保存这些参数。

private void CreateUniStormClouds()
{
    var uniStormCloudsClone = GameObject.Instantiate(UniStormClouds);
    uniStormCloudsClone.transform.parent = UniStormClouds.transform.parent;
    uniStormCloudsClone.transform.localPosition = new Vector3(-0.06383133f, -293f, -223f);
    uniStormCloudsClone.transform.rotation = Quaternion.Euler(90, 0, 0);
    uniStormCloudsClone.transform.localScale = new Vector3(1000000, 1000001, 700000);
}

四、如何关闭鼠标控制相机转动的功能

相机上挂在了一个脚本【Pause】,把这个脚本禁用即可。
天气系统自带的【相机旋转功能】可能会与【祖传的角色控制功能】冲突,所以需要禁用。
Unity中的Unistorm3.0天气系统笔记,unity,UniStorm,天气系统

五、按【Esc】键的时候,天气设置界面不再显示和隐藏,如何实现?

场景初始化之后,会自动生成一个叫【UniStorm Canvas】的UI界面。
Unity中的Unistorm3.0天气系统笔记,unity,UniStorm,天气系统

(1)简单粗暴的解决方法:在启动的时候,抓取这个对象,然后把他们隐藏掉。

	//等待几秒初始化后,找到UniStorm Canvas组件,然后隐藏
	var UniStormCanvas = GameObject.FindObjectsOfType<Canvas>(true).First(x => x.name == "UniStorm Canvas");
	 UniStormCanvas.gameObject.SetActive(false);

(2)最优的实现:插件已经提供这个功能的【启用】和【禁用】参数了

Unity中的Unistorm3.0天气系统笔记,unity,UniStorm,天气系统

(3)正常的操作就是先找到UI,然后在关闭该选项

/// <summary>
/// 获取设置天气的三个UI元素
///     时辰-slider
///     天气类型-dropdownList
///     确定更改-button
/// </summary>
/// <param name="ctk"></param>
/// <returns></returns>
private async UniTask GetUiElements(CancellationToken ctk)
{
    //【1】等待一段时间进行初始化
    await UniTask.DelayFrame(2,cancellationToken:ctk);

    //【2】获取用来设置天气的3个UI组件
    var UniStormCanvas = GameObject.FindObjectsOfType<Canvas>(true).First(x => x.name == "UniStorm Canvas");
    TimeSlider = UniStormCanvas.GetComponentsInChildren<Slider>(true).Where(x => x.name == "Time Slider")
        .First();
    WeatherDropdown = UniStormCanvas.GetComponentsInChildren<Dropdown>(true)
        .Where(x => x.name == "Weather Dropdown").First();
    ChangeWeatherBtn = UniStormCanvas.GetComponentsInChildren<Button>(true)
        .Where(x => x.name == "Change Weather Button").First();

    //【3】关闭设置菜单
    unistorm.UseUniStormMenu = UniStormSystem.EnableFeature.Disabled;
}

六、如何通过代码更换天气

在不破坏UniStorm工程文件的前提下,思路:
1、在运行时获取设置天气的UI元素,
2、赋值【时辰】和【天气类型】,激发【确定】按钮的click事件。

#if UNITY_EDITOR
[ContextMenu("天气设置")]
#endif
async UniTask test4()
{
	Setweather();
}

private async UniTask Setweather()
{
	await UniTask.Delay(TimeSpan.FromSeconds(2f));
	
	//找到组件
	var UniStormCanvas = GameObject.FindObjectsOfType<Canvas>(true).First(x => x.name == "UniStorm Canvas");
	Debug.Log(UniStormCanvas);
	TimeSlider = UniStormCanvas.GetComponentsInChildren<Slider>(true).Where(x => x.name == "Time Slider").First();
	WeatherDropdown = UniStormCanvas.GetComponentsInChildren<Dropdown>(true).Where(x => x.name == "Weather Dropdown").First();
	ChangeWeatherBtn = UniStormCanvas.GetComponentsInChildren<Button>(true).Where(x => x.name == "Change Weather Button").First();
	
	//设置value
	TimeSlider.value = 0.5f;
	WeatherDropdown.SetOption("Thunderstorm");
	ChangeWeatherBtn.onClick.Invoke();
}

七、UniStorm的主要入口脚本

【UniStorm System】物体上有一个叫UniStormSystem的主脚本
【UniStorm Demo Player】物体和它的子物体下面有一些相机对应的功能
如果要读源码应该从UniStormSystem.cs下手

八、附录——天气控制的脚本

(1)获取天空半球,获取设置天气的UI元素,简单设置天气

namespace AsyncStep
{
    /// <summary>
    /// 获取天气设置的组件
    /// </summary>
    public class SetWeatherV3 : MonoBehaviour
    {
        /// <summary>
        /// 云层组件
        /// </summary>
        [Header("云层组件")] public GameObject UniStormClouds;

        /// <summary>
        /// 效果相机
        /// </summary>
        [Header("效果相机")] public Camera effectCamera;

        /// <summary>
        /// 地形
        /// </summary>
        [Header("地形")] public Terrain MyTerrain;

        /// <summary>
        /// 天气系统主脚本
        /// </summary>
        [Header("天气系统主脚本")] public UniStormSystem unistorm;

        /// <summary>
        /// 天气类型
        /// </summary>
        [Header("天气类型-测试用")]public string weatherType = "Thunderstorm";

        /// <summary>
        /// 时间设置
        /// </summary>
        [Header("======运行时自动获取UI组件======")] [Header("时间设置")]
        public Slider TimeSlider;

        /// <summary>
        /// 天气种类
        /// </summary>
        [Header("天气种类")] public Dropdown WeatherDropdown;

        /// <summary>
        /// 确认按钮
        /// </summary>
        [Header("确认按钮")] public Button ChangeWeatherBtn;

        void Start()
        {
            GetUiElements(this.GetCancellationTokenOnDestroy());
        }

        /// <summary>
        /// 获取设置天气的三个UI元素
        ///     时辰-slider
        ///     天气类型-dropdownList
        ///     确定更改-button
        /// </summary>
        /// <param name="ctk"></param>
        /// <returns></returns>
        private async UniTask GetUiElements(CancellationToken ctk)
        {
            //【1】等待一段时间进行初始化
            await UniTask.DelayFrame(2,cancellationToken:ctk);

            //【2】获取用来设置天气的3个UI组件
            var UniStormCanvas = GameObject.FindObjectsOfType<Canvas>(true).First(x => x.name == "UniStorm Canvas");
            TimeSlider = UniStormCanvas.GetComponentsInChildren<Slider>(true).Where(x => x.name == "Time Slider")
                .First();
            WeatherDropdown = UniStormCanvas.GetComponentsInChildren<Dropdown>(true)
                .Where(x => x.name == "Weather Dropdown").First();
            ChangeWeatherBtn = UniStormCanvas.GetComponentsInChildren<Button>(true)
                .Where(x => x.name == "Change Weather Button").First();

            //【3】关闭设置菜单
            unistorm.UseUniStormMenu = UniStormSystem.EnableFeature.Disabled;
        }

#if UNITY_EDITOR
        [ContextMenu("天气设置")]
#endif
        async UniTask test4()
        {
            Setweather();
        }

        private async UniTask Setweather()
        {
            //设置value
            TimeSlider.value = 0.5f;
            WeatherDropdown.SetOption(weatherType);
            ChangeWeatherBtn.onClick.Invoke();
        }
    }
}

(2)设置天气类型

Unity中的Unistorm3.0天气系统笔记,unity,UniStorm,天气系统文章来源地址https://www.toymoban.com/news/detail-683394.html

using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
using static txlib;

namespace AsyncStep
{
    /// <summary>
    /// 天气控制:天气类型 + 日期时刻
    /// </summary>
    public class SetWeatherInfoControl : MonoBehaviour, IFlowAsync
    {
        /// <summary>
        /// 天气组件
        /// </summary>
        [Header("天气组件")] public SetWeatherV3 weather;

        /// <summary>
        /// 时间点
        /// </summary>
        [Header("时间点")] public float sliderValue;

        /// <summary>
        /// 天气类型
        /// </summary>
        [Header("天气类型")] public string weatherType;

        /// <summary>
        /// 本步骤的名字:Start中预先缓存,防止报空
        /// </summary>
        public string this_name;

        // Start is called before the first frame update
        void Start()
        {
            this_name = this.name;
        }

#if UNITY_EDITOR
        [ContextMenu("测试")]
#endif
        void Test()
        {
            FlowAsync(this.GetCancellationTokenOnDestroy());
        }

        public async UniTask FlowAsync(CancellationToken ctk)
        {
            try
            {
                weather.TimeSlider.value = sliderValue;
                Debug.Log(weather.TimeSlider.value);

                //设置value
                weather.TimeSlider.value = sliderValue;
                weather.WeatherDropdown.SetOption(weatherType);
                weather.ChangeWeatherBtn.onClick.Invoke();
            }
            catch (Exception e)
            {
                Debug.Log($"{this_name}报错:{e.Message}");
                Debug.Log($"\n 抛出一个OperationCanceledException");
                throw new OperationCanceledException();
            }

            Debug.Log($"{this.name} 执行完毕");
        }
    }
}

到了这里,关于Unity中的Unistorm3.0天气系统笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity中的导航系统

            NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路。导航时,只需要给导航物体挂载导航组建,导航物体便会自行根据目标点来

    2024年02月03日
    浏览(47)
  • 【unity实战】时间控制 昼夜交替 四季变化 天气变化效果

    配置 效果 https://assetstore.unity.com/packages/2d/textures-materials/sky/fantasy-skybox-free-18353 配置不同时间过渡材质 新增DayNightSystem,负责管理游戏的昼夜系统 配置 效果 这里只做个简单的,想要更复杂的下雨效果,可以看我之前的文章:【实现100个unity特效之7】unity 3d实现各种粒子效果

    2024年03月23日
    浏览(37)
  • 【UnityShader入门精要学习笔记】第六章(1)Unity中的基础光照

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 一个物体为什么看起来是红色的?从物理上解释是因为这个物体

    2024年03月22日
    浏览(49)
  • 详解Unity中的粒子系统Particle System (三)

    上一篇我们详细讲解了有关主模块的全部内容,已经对粒子系统的基本运作有了足够的了解,本篇就来讲一下被粒子系统默认启用的Emission、Shape、Renderer模块又在粒子系统中扮演着怎么样的作用吧。 本系列提要 Unity粒子系统专题博客共分成十二篇来讲解: 【本篇为第三篇】

    2024年02月02日
    浏览(43)
  • 详解Unity中的粒子系统Particle System (二)

    上一篇我们简要讲述了粒子系统是什么,如何添加,以及基本模块的介绍,以及对于曲线和颜色编辑器的讲解。从本篇开始,我们将按照模块结构讲解下去,本篇主要讲粒子系统的主模块,该模块主要是控制粒子的初始状态和全局属性的,以下是关于该模块的介绍,请大家指

    2024年01月17日
    浏览(49)
  • 详解Unity中的粒子系统Particle System (十一)

    今天讲最后一个模块——External Forces,该模块需要和Force Field组件配合使用,作用是模拟物理的力对粒子的影响。至此,Unity内置粒子系统的最后一块物理砖补齐,理论上来讲我们已经可以通过粒子系统来模拟世间万物了。废话不多说,进入正题。 本系列提要 Unity粒子系统专

    2024年02月13日
    浏览(36)
  • 【Unity学习笔记】新输入系统的基本功能

    在新版本的Unity中实装了一套新的输入系统,这个输入系统十分方便,可以“记录”在不同场景下的各个输入按键,并且兼顾键盘、手柄等等不同的输入系统。 添加新输入系统: 1.Edit-Project Settings 选择Player,将Active Input Handing修改为Input System Package(New)。 保存,等待Unity重启。

    2024年02月08日
    浏览(37)
  • Unity New Input System 及其系统结构和源码浅析【Unity学习笔记·第十二】

    转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/132534422 作者:CSDN@|Ringleader| 主要参考: 官方文档:Unity官方Input System手册与API 官方测试用例:Unity-Technologies/InputSystem 如果c#的委托和事件不了解,参考我这篇:【C#学习笔记】委托与事件 (从观察者模式看C#的委

    2024年01月25日
    浏览(47)
  • 详解Unity中的Nav Mesh|导航寻路系统 (一)

    在类RTS、RPG游戏中,都会提供自动寻路功能,当玩家下达指令后,NPC就会自动计算到达目标的路径,实现这种功能的方式有很多种,其中Unity本身也自带了一种导航寻路系统,该系统会将游戏场景中复杂的对象烘焙为网格信息,通过网格来计算NPC抵达目标的最短路径,该系统

    2024年02月02日
    浏览(74)
  • Unity零基础到入门 ☀️| 万字教程 对 Unity 中的 Navigation导航系统基础 全面解析+实战演练【收藏不迷路】

    📢博客主页:https://blog.csdn.net/zhangay1998 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 📢未来很长,值得我们全力奔赴更美好的生活✨

    2023年04月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包