当前位置: 首页 > news >正文

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

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

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

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

  • 第一个滑动条为:当下的时辰【对应从早到晚的进度】
  • 第二个下拉框为:天气的类型
  • 第三个按钮:确定按钮
    在这里插入图片描述

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

有时候,用户操作的慢了,天气突然从白天变成黑夜,乌漆嘛黑的伸手不见五指。为了防止这种尴尬,所以有时候需要关闭时间流淌的功能。
【UniStorm System】->【Time】->【Time Flow】 设置成[Disabled]
在这里插入图片描述

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

需求: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】,把这个脚本禁用即可。
天气系统自带的【相机旋转功能】可能会与【祖传的角色控制功能】冲突,所以需要禁用。
在这里插入图片描述

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

场景初始化之后,会自动生成一个叫【UniStorm Canvas】的UI界面。
在这里插入图片描述

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

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

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

在这里插入图片描述

(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();//设置valueTimeSlider.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("天气设置")]
#endifasync UniTask test4(){Setweather();}private async UniTask Setweather(){//设置valueTimeSlider.value = 0.5f;WeatherDropdown.SetOption(weatherType);ChangeWeatherBtn.onClick.Invoke();}}
}

(2)设置天气类型

在这里插入图片描述

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 updatevoid Start(){this_name = this.name;}#if UNITY_EDITOR[ContextMenu("测试")]
#endifvoid Test(){FlowAsync(this.GetCancellationTokenOnDestroy());}public async UniTask FlowAsync(CancellationToken ctk){try{weather.TimeSlider.value = sliderValue;Debug.Log(weather.TimeSlider.value);//设置valueweather.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天气系统笔记

Unistorm是Unity中的一个天气系统&#xff0c;它功能强大&#xff0c;效果优美。本文所述UniStorm为3.0版本&#xff0c;仅用于学习之用。 一、如何设置【白天】、【黑夜】和【天气类型】&#xff1f; 在Running模式下&#xff0c;按下Esc按键&#xff0c;会【弹出】或者【隐…...

VMVareC++开发环境快速配置

OVERVIEW VMVareC开发环境快速配置ipgitvimgithubzshgcc&g&cmakesshifconfigmysqlnginxredisgdb VMVareC开发环境快速配置 VMVareC开发环境快速配置&#xff0c;为了省时间快速整理出文档方便以后快速配置&#xff0c; 按照这个流程直接可以快速得到一个舒适的C/C开发…...

数据库为什么使用B+树而不是B树做索引

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…...

java必知必会--面向对象及相关基础知识

java必知必会–面向对象及相关基础知识 一、java面向对象&#xff1a; 1、什么是面向对象以及三大特性 ①我们把数据和数据之间的相互操作关系放到一起总结为–对象。所有的操作都是基于对象来进行的。 ②面向对象的的特征&#xff1a;封装、继承、多态 ③封装&#xff1a;我…...

【推荐】Spring与Mybatis集成

目录 1.概述 2.集成 2.1代码演示&#xff1a; 3.整合 3.1概述 3.2 进行整合分页 接着上两篇&#xff0c;我已经写了Mybatis动态之灵活使用&#xff0c;mybatis的分页和特殊字符的使用方式接下来把它们集成起来&#xff0c;是如何的呢&#x1f447;&#x1f447;&#x1…...

中科驭数受邀在招商银行金融科技论坛作异构计算主题分享 解码金融科技先进算力构建之路

8月25日&#xff0c;2023招银浦江金融科技论坛正式召开。中科驭数高级副总裁张宇受邀在资管科技分论坛发表《金融行业先进异构算力底座构建之路》的主题演讲&#xff0c;与参会嘉宾分享了当前计算系统的发展趋势以及如何通过异构算力构建IT技术底座来推动金融科技的创新。 ▲ 中…...

Maven打包方式pom和jar和war的区别

Maven 项目可以使用不同的打包方式&#xff0c;如 POM、JAR 和 WAR&#xff0c;这些方式决定了项目构建后生成的产物类型和用途。下面是这些打包方式的区别&#xff1a; 1. **POM (Project Object Model)&#xff1a;** POM 打包方式实际上不会生成一个可执行的构建产物。它是…...

【51单片机】EEPROM-IIC实验(按键控制数码管)

目录 &#x1f381;I2C总线 ​编辑 &#x1f381;代码 &#x1f3f3;️‍&#x1f308;main.c &#x1f3f3;️‍&#x1f308;i2.c &#x1f386;代码分析 &#x1f381;I2C总线 I2C总线是Philips公司在八十年代初推出的一种串行、半双工的总线&#xff0c;主要用于近距…...

【java】【springboot】【idea】springboot项目pom.xml 灰色下划线

解决方案&#xff1a; 这里我们找到了原因&#xff0c;就是因为选择了Ignored Files导致pom.xml文件被设置在maven忽略文件清单中&#xff0c;所以我们将打勾的选项取消&#xff0c;点击Apply,然后点击OK...

[JavaWeb]【十四】web后端开发-MAVEN高级

目录 一、分模块设计与开发 1.1 分模块设计 1.2 分模块设计-实践​编辑 1.2.1 复制老项目改为spring-boot-management 1.2.2 新建maven模块runa-pojo 1.2.2.1 将原项目pojo复制到runa-pojo模块 1.2.2.2 runa-pojo引入新依赖 1.2.2.3 删除原项目pojo包 1.2.2.4 在spring-…...

浏览器跨域

生活中的事跟跨域有什么关系&#xff0c;那必须有。 跨域的产生是浏览器的安全机制引起的&#xff0c;只有在使用Ajax时才会发生。简单来说就是你可以通过ajax发送请求&#xff0c;但要看远程服务器脸色&#xff0c;他没授权&#xff0c;浏览器这个老六就给拦截了&#xff0c;不…...

ffmpeg windows环境MinGW+msys2编译so库

一、安装MinGW 1.1、下载MinGW 1.2、下载完成后&#xff0c;会得到一个名为 mingw-get-setup.exe 的安装包&#xff0c;双击打开它&#xff0c;可以看到如下的对话框&#xff1a; 1.3、直接点击“Install”&#xff0c;进入下面的对话框 1.4、可根据自己操作系统的实际情况&am…...

python VTK PyQt5 VTK环境搭建 创建 渲染窗口及三维模型,包含 三维模型交互;

目录 Part1. VTK 介绍 Part2. PyQt5 VTK环境搭建 安装Anaconda 自带Python Anaconda下载 安装PyQt5 安装 VTK Part3 :PyQt VTK 结合样例: Part1. VTK 介绍 VTK&#xff08;visualization toolkit&#xff09;是一个开源的免费软件系统&#xff0c;主要用于三维计算机图形…...

学习总结(二) node.js服务器如何使用net模块向硬件发送命令与接收数据?

服务器server.js: const net require("net"); //此模块用于tcp/ip通讯 当收到get请求时: server.get("/cfjcApi/v1/SkyTempHudi", (req, res) > { let client new net.Socket(); client.connect(网络模块端口, 网络模块Ip, () > { //此模块…...

rust工程

文章目录 CargomacOS配置rust环境vscode配置 目录结构Cargo.tomlcargo命令hello world 跟web交互WebAssembly 跟Android交互配置Android环境JNI例子NDK例子 Rust 是一种现代的、系统级的编程语言&#xff0c;它强调并发安全、内存安全和高性能。Rust 的设计目标是提供一种有着良…...

Java并发工具类

JDK并发包中常用并发工具类&#xff1a; CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段&#xff1b; Exchanger工具类则提供了在线程间交换数据的一种手段。 等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成…...

晨控CK-GW208与三菱L系列PLC以TCP通讯手册

晨控CK-GW208是一款支持标准工业以太网协议的IO-LINK主站网关&#xff0c;方便用户快速便捷的集成到 PLC 等控制系统中。 CK-GW208主站网关集成 8 路 IO-LINK 通信端口&#xff0c;采用即插即用模式&#xff0c;无需繁琐的配置&#xff0c;减轻现场安装调试的工作量。为了满足…...

c++11 标准模板(STL)(std::basic_istringstream)(五)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_istringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allo…...

【案例教程】高分论文密码:大尺度空间模拟预测与数字制图

尺度空间模拟预测和数字制图技术和不确定性分析广泛应用于高分SCI论文之中&#xff0c;号称高分论文密码。大尺度模拟技术可以从不同时空尺度阐明农业生态环境领域的内在机理和时空变化规律&#xff0c;又可以为复杂的机理过程模型大尺度模拟提供技术基础。在本次培训中&#x…...

uniapp 自定义手机顶部状态栏(适配状态栏高度)

开启页面自定义导航栏功能 uniapp 在 pages.json 页面设置了全局的 globalStyle 的 "navigationStyle": "custom" 或单页面的 style 的 "navigationStyle": "custom" 之后页面顶部就没有自带的导航栏了&#xff0c;这时用户可自定义该…...

Vant4移动端电商实战:用Card和Cell组件打造订单详情页(附完整代码)

Vant4移动端电商实战&#xff1a;用Card和Cell组件打造订单详情页&#xff08;附完整代码&#xff09; 在移动电商应用开发中&#xff0c;订单详情页是用户查看购买信息的重要界面。Vant4作为轻量、可靠的移动端组件库&#xff0c;其Card和Cell组件能够快速构建清晰、美观的订单…...

告别公网IP和路由器设置:用cpolar免费隧道实现Home Assistant外网控制

零门槛实现Home Assistant远程控制&#xff1a;无需公网IP的内网穿透方案 想象一下这样的场景&#xff1a;你正躺在异国酒店的床上&#xff0c;突然想起出门前忘记关闭客厅的智能灯。或者&#xff0c;你在公司加班时&#xff0c;想提前打开家中的空调。对于智能家居爱好者来说&…...

探索数字微流控:OpenDrop开源平台完全实践

探索数字微流控&#xff1a;OpenDrop开源平台完全实践 【免费下载链接】OpenDrop Open Source Digital Microfluidics Bio Lab 项目地址: https://gitcode.com/gh_mirrors/ope/OpenDrop OpenDrop作为一款基于电润湿技术的开源数字微流控平台&#xff0c;致力于为开源实验…...

告别臃肿控制中心,拥抱开源替代方案:G-Helper硬件调校效率提升指南

告别臃肿控制中心&#xff0c;拥抱开源替代方案&#xff1a;G-Helper硬件调校效率提升指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and…...

Local Moondream2效果展示:真实用户上传图片的高质量描述输出

Local Moondream2效果展示&#xff1a;真实用户上传图片的高质量描述输出 1. 核心能力概览 Local Moondream2是一个基于Moondream2构建的超轻量级视觉对话Web界面&#xff0c;它让普通电脑也能拥有"视觉理解"能力。这个工具最大的特点是能够对用户上传的图片进行深…...

终极指南:如何从碧蓝航线中提取Live2D角色资源

终极指南&#xff1a;如何从碧蓝航线中提取Live2D角色资源 【免费下载链接】AzurLaneLive2DExtract OBSOLETE - see readme / 碧蓝航线Live2D提取 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneLive2DExtract 碧蓝航线Live2D提取工具是一个专门用于从Unity游戏…...

图像标注难题如何破解?LabelImg工具全面解析与实战指南

图像标注难题如何破解&#xff1f;LabelImg工具全面解析与实战指南 【免费下载链接】labelImg LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check out L…...

三相逆变器LCL滤波设计实战:从建模到仿真避坑指南(附仿真文件)

三相逆变器LCL滤波设计实战&#xff1a;从建模到仿真避坑指南 在电力电子领域&#xff0c;三相逆变器的性能优化一直是工程师们关注的焦点。LCL滤波器作为逆变器与电网之间的关键接口&#xff0c;其设计质量直接影响系统稳定性、谐波抑制效果和电磁兼容性。本文将带您深入实战&…...

24小时运行不中断:OpenClaw+GLM-4.7-Flash构建个人资讯聚合器

24小时运行不中断&#xff1a;OpenClawGLM-4.7-Flash构建个人资讯聚合器 1. 为什么需要个人资讯聚合器 每天早上打开手机&#xff0c;总会被各种新闻推送淹没。财经、科技、行业动态...信息过载已经成为现代人的通病。作为一个技术从业者&#xff0c;我发现自己花费在筛选有效…...

Apex Legends后坐力控制解决方案:技术原理与实践指南

Apex Legends后坐力控制解决方案&#xff1a;技术原理与实践指南 【免费下载链接】Apex-NoRecoil-2021 Scripts to reduce recoil for Apex Legends. (auto weapon detection, support multiple resolutions) 项目地址: https://gitcode.com/gh_mirrors/ap/Apex-NoRecoil-202…...