文章目录
- 1、简介
- 1.1 描述
- 1.2 兼容性
- 1.3 价格
- 1.4 特点
- 1.5 示例
- 3、安装
- 3.1 新建Unity项目
- 3.2 安装插件UniStorm
- 3.3 介绍UniStorm工具栏
- 3.4 入门使用
- 4、脚本开发
- 4.1 接口简介
- 4.1.1 天气
- 4.1.2 时间
- 4.1.3 程度
- 4.1.4 季节
- 4.1.5 系统
- 4.1.6 其他
- 4.2 接口测试
- 4.2.1 测试1
- 结语
1、简介
UniStorm - 体积云、天空、模块化天气和云阴影
1.1 描述
UniStorm 是 AAA 动态天空、天气、云阴影、大气雾和程序性体积云的终极解决方案。UniStorm为您提供了调整天空中每个组件的选项。
UniStorm 是一款非常强大的动态昼夜天气系统,能够以极快的帧速率创建 AAA 级动态生成的天气、照明和天空。UniStorm具有300多个可定制的组件,允许用户创建任何可以想象的环境。
1.2 兼容性
Unity可编程渲染管线(SRP)是让您能够通过C#脚本控制渲染的一个功能。SRP是支撑通用渲染管线(URP)和高清渲染管线(HDRP)的底层技术。
1.3 价格
1.4 特点
- AAA 体积云
UniStorm 4.0 带来一个完全重新设计的云系统,能够创建 AAA 的程序化、自我投影、PBR、体积云,其帧率优异且仅使用一个绘制调用!UniStorm 的云使用的是最新的渲染以及性能技术,例如时间性重投和 LOD。UniStorm 的云包含 4 个质量设置以及一个体积和 2D 选项,并都可以在运行时或在 UniStorm 编辑器中进行更改。这使其能够支持众多设备和电脑。简单易用的 API 让添加游戏内的质量控制变得简单无阻。其中还包含一个演示操作的示例。
-
内置 Photon PUN 2 网络的支持
UniStorm 包含了你需要的一切来让 UniStorm 与 PUN 2 一起使用,让 PUN 2 同步 UniStorm 多玩家的天气、时间和日期 。内含了一个示例场景。 -
大气雾
大气雾考虑到了阳光和月光方向以及颜色对场景、UniStorm 的云和天空盒子的应用。 -
云阴影
高效的实时屏幕空间云阴影,来将当前的云层和云型匹配,以添加逼真的视觉效果。 -
具有精确星座排列的 4k 恒星
UniStorm 的夜空包含了 4k 恒星以及精确的星座排列。编辑器内有控制星座紧密度的选项。 -
程序化极光
UniStorm 让用户按天气类型对极光自定义调整强度、颜色、状况等等! -
性能
UniStorm 的体积云的特色是时间性重投和 LOD,都具有 4 个质量设置(低、中、高和超级),经过估算其效率远比以前的设置更高。这使 UniStorm 能够在几乎所有计算机上顺畅运行。多亏了 UniStorm 着色器,摄像头远裁平面距离没有最大限制,因此你可以使用任何距离。 -
内置轻量级选项
何必为必要的功能多付钱呢?UniStorm 拥有一个内置轻量级 2D 云选项,对低端的移动设备或电脑特别适合。用户可以从编辑器中选择移动端选项,它将自动应用所有优化设置,而无需覆盖颜色等自定义设置。 -
动态模块化天气
模块化天气能让用户创建自定义天气类型。沙尘暴、极光、冰雹风暴、雷暴等都可以实现。对于多少天气类型 UniStorm 是没有任何限制的,而且最好的是它能让用户对每个天气类型自定义特效、设置和音效。UniStorm 带来 31 种天气类型!其中包括:极光、吹起的叶子、吹起的雪、吹起的草、萤火虫、晴朗、大致晴朗、部分多云、大致多云、多云、阴天、多雾、细雨、小雨、雨、大雨、冰雹、雷暴、小雪、雪、大雪、雷雪、火雨、尘暴以及更多!
-
云配置
UniStorm 的每个天气类型都具有可自定义的云配置。这可以使你自定义云的外观来为每个天气类型提供大量的变化。使用 UniStorm 的云配置,用户必定会找到适合他们的云类型。晴朗、蓬松、松软、均衡、以及风格化云配置都包含在内。然而你随时可以创建属于你自己的! -
VR 和移动端可用
UniStorm 的多合一功能也支持移动和 VR(目前仅是多通道)。里面甚至还有一个易用的选项可以自动将所有优化设置应用于指定平台,同时保持用户的自定义设置! -
高级天气生成
UniStorm 的天气是基于 UniStorm 编辑器中设置的降水率生成的。易用的线图可让用户对每个月设置天气类型的降水率, 然后 UniStorm 会生成对应的天气。夏季的降水量可以比冬季的少,反之亦然。UniStorm 有选项来以随机的起始时间和每小时天气来生成日常天气,这些都基于游戏内计时以及降水率为基础。如果用户不想生成天气,也可以选择静态天气。
-
全局天气着色器和渲染
UniStorm 的全局着色器允许物体在下雨和下雪天气类型中接受雨雪渲染。雨渲染能使表面变得更有光泽,仅用于小于 90 度的表面。大多数表面的内部都会保持干燥,例如建筑物和屋顶的内部。雪的功能相同,但带有积雪渲染效果。雪的纹理、雪泵纹理和雪的高光级别都可以自定义调整。当天气不是下雨或下雪时, UniStorm 会淡化天气渲染。 -
天气和天气过渡
UniStorm 允许用户创建无限数目的天气类型。每次天气变换时, UniStorm 都会根据全局过渡速度进行无缝的转换。每种天气类型都可以利用其云层、云风格、云高度、粒子特效、阳光强度、月光强度、云阴影强度、音效、风量以及其他各种设置进行自定义,从而实现了真正独特且高自定义性的天气。 -
程序化闪电和雷击
UniStorm 的程序化闪电系统允许对象能被雷击中。用户可以规定闪电击中地面和物体的概率。当雷击中时,用户可以自定义其产生的特效。利用适合的标签甚至是火特效都可以做到。 -
白天/夜晚循环和颜色控制
UniStorm 允许你调整每天不同时候的环境和天空的所有颜色,例如日、月颜色、环境光色、阴影和云阴影强度、雾色、天空颜色、环境反射强度等等!每种颜色都具有自己的个体颜色选项来供降水天气类型使用。
-
时间、日期和内置日历
UniStorm 具有内置时间和日期系统,可帮助你追踪玩家的游戏时间。UniStorm 的日历是精确的,甚至可以使用当前的时间和日期。 -
可自定义的月相系统
UniStorm 的可自定义月相系统允许用户构建属于他们自己的月相。UniStorm 的月相可用数量没有上限的。用户可以直接在 UniStorm 编辑器上预览他们的月相以及设置起始月相。UniStorm 自动分配所有所需纹理,并每天更新月相。每一个月相也具有自己的月光强度。这可以根据用户需要使新月和镰月月相的亮度低于全月的亮度。 -
天气类型条件
可选的天气类型条件可以让 UniStorm 的天气生成器根据达到的指定条件来生成天气类型。这些包括的条件例如有:特定季节和温度以及仅在自定义事件或程序化调用某种特定天气类型的能力。 -
UniStorm 配置文件
从一个 UniStorm 配置文件中导入和导出你的 UniStorm 设置。这可以让用户保存他们的设置并将他们在其他 UniStorm 系统之间转移,而无需手动应用颜色和设置。 -
每日不同时候的声音和音乐
UniStorm 允许用户自定义每日不同时候播放的音效和/或音乐。每个音效和歌曲之间的延迟时间可被调整。其可用的数量没有上限。 -
声音管理器
UniStorm 的声音管理员使用 Unity 音频混合器来处理所有 UniStorm 创建出来的音效。这使你对全局、环境、天气和音乐音量具有精确的控制,并可用于用户 UI 或可在 UniStorm 编辑器中控制。 -
内置事件
UniStorm 的内置事件可以在游戏内的每小时、每天、每月、每年甚至在天气转变过程中被调用,让用户轻松创建游戏功能。
-
包括示例
UniStorm 包含 6 个示例场景来演示 UniStorm 可以做到的不同功能。另外还包含一个保存示例系统,来让用户可以手动或自动保存他们的游戏时间、日期、天气、温度以及更多。这些数据之后能被加载,用户可以直接跟进上次的进度。 -
编辑器
UniStorm 的编辑器设计受到其众多用户反馈的影响,因此很直观、强大并提供一个低学习曲线。UniStorm 的编辑器具自我描述性,因此每个组件都在编辑器的工具提示中有解释。 -
API 和文档
UniStorm 的 API 可以助力其他游戏机制和功能,例如访问其温度、时间、日期、当前天气、预报天气、季节以及更多。内含教程视频和外部文档来帮助用户充分利用 UniStorm。 -
支持 CTS 天气管理器
UniStorm 包含一个外部系统来过渡到 CTS 的天气渲染器,让你的地形在下雪或下雨时具有积雪和湿度的渲染。(不包括 CTS)
1.5 示例
https://unistorm-weather-system.fandom.com/wiki/Documentation
- 基本示例 - UniStorm 的基本标准演示。
- 动态雪示例 - 提供在非地形对象上动态构建雪的演示。
- 植物生长示例 - 根据多种不同因素提供动态生长植物的演示。
- 保存并加载示例 - 一个演示,提供了一个有效的保存和加载系统,允许您保存 UniStorm 的时间、天气、日期和玩家的位置,然后在您保存的位置加载它。
- 生成示例 - 提供允许在运行时生成角色的示例的演示。然后,所有效果和组件在运行时应用于 UniStorm。
- 生命体征生存示例 - 提供生存示例的演示,其中玩家受到 UniStorm 因素/变量的影响,例如温度(温暖)、天气(干燥)和时间(饥饿)。
- 天气预报器示例 - 演示如何使用天气预报器系统为 UniStorm 生成每周预报。
- 高级 UI 示例 - 演示引用 UniStorm 以显示当前时间、日期、温度、天气、季节、月相等的高级 UI。
- 自动保存示例 - 演示如何使用自动保存系统来保存玩家的位置和 UniStorm 变量。然后可以随时加载它以从玩家离开的地方继续。
- 程序闪电示例 - 演示 UniStorm 2.4 的新闪电系统,该系统具有程序闪电和改进的闪电生成。
- 事件示例 1(生成每日对象)- 演示 UniStorm 2.4 的新事件系统在一天中的特定时间生成对象。
- 事件示例 2(随机每日天气) - 演示 UniStorm 2.4 的新事件系统在一天中的特定时间生成对象。
- 事件示例 3(在夜间启用和禁用灯光)- 演示 UniStorm 2.4 的新事件系统在一天中的特定时间生成对象。
3、安装
3.1 新建Unity项目
运行Unity Hub,切换到项目分页,打开界面如下:
选择核心模板,选择3D,如下:
新项目加载资源中。
新项目创建成功,进入后界面如下:
3.2 安装插件UniStorm
将插件下载后直接导入即可。
将UniStorm代码文件夹中的Assets复制到当前新建项目的Assets中即可。然后Unity自动加载复制进去的文件。
当然这个过程中可能会报错如下:
鼠标双击上面报错的地方,弹出VS编辑器,打开报错的代码文件,如下:
将上面文件中所有的“MinAttribute”修改为“UnityEngine.PostProcessing.MinAttribute”,如下:
using UnityEngine;
using UnityEngine.PostProcessing;
namespace UnityEditor.PostProcessing
{
[CustomPropertyDrawer(typeof(UnityEngine.PostProcessing.MinAttribute))]
sealed class MinDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
UnityEngine.PostProcessing.MinAttribute attribute = (UnityEngine.PostProcessing.MinAttribute)base.attribute;
if (property.propertyType == SerializedPropertyType.Integer)
{
int v = EditorGUI.IntField(position, label, property.intValue);
property.intValue = (int)Mathf.Max(v, attribute.min);
}
else if (property.propertyType == SerializedPropertyType.Float)
{
float v = EditorGUI.FloatField(position, label, property.floatValue);
property.floatValue = Mathf.Max(v, attribute.min);
}
else
{
EditorGUI.LabelField(position, label.text, "Use Min with float or int.");
}
}
}
}
保存文件后,Unity自动编译加载文件。错误解决!
然后选择Unity菜单项 Window—>UniStorm—>Create Weather System(创建一个UniStorm System组件 ) 即可,注意创建的组件不要改名,否则内置脚本会找不到。
在Hierarchy界面中会自动创建一个UniStorm System的对象节点。
(1)在Asset Store中搜索并下载Unistorm插件,或者从其他渠道获取Unistorm的.unitypackage文件。
(2)在Unity编辑器中,选择Assets -> Import Package -> Custom Package…,打开文件选择对话框。
(3)选择您下载的Unistorm插件的.unitypackage文件,点击Open按钮。
(4)在导入资源包的窗口中,勾选您需要导入的资源,然后点击Import按钮。
(5)或者您需要在Unity编辑器中,将UniStorm_Source文件夹拖拽到项目视图中的Assets文件夹下。
(6)等待Unity完成导入后,在项目视图中找到UniStorm -> Prefabs -> UniStorm System,并将其拖拽到场景视图或者层次视图中。
(7)选中场景视图或者层次视图中的UniStorm System对象,在检查器视图中可以看到它的组件和设置项。
(8)在检查器视图中,找到Player & Camera设置项,并选择您的玩家对象和摄像机对象。这两个对象是必要的,因为Unistorm会根据它们的位置来生成天气效果。
(9)您可以在检查器视图中调整其他设置项来定制您想要的天气系统。例如,您可以在Weather Options设置项下选择不同的天气类型、频率、音效等。您也可以在Sky Options设置项下调整天空、太阳、月亮、星星等组件的外观和行为。
(10)您可以点击播放按钮来预览和测试您的天气系统。如果您对效果满意,就可以保存并应用到您的项目中了。如果不满意,就可以继续调整设置项直到达到理想效果。
3.3 介绍UniStorm工具栏
- Player & Camera
该设置允许你选择Unistorm的玩家和播放器对象,并且选项会根据你的选择有所调整,该天气系统必须选择Player和Camera对象,它将根据Player和Camera对象的位置确定生成天气的范围
Player和Camera为必要物体,如果该插件无法找到它们,将会在运行的时候报错,也无法看到天气效果
Get Player at Runtime: 是否可以在运行期间获得你的Player,可以通过名字或则标签。
Use Runtime Delay: 是否会一直等待进行初始化,直到Player被创建并找到。
Use UniStorm Menu: 是否使用UniStorm菜单,该菜单可在运行中通过ESC键触发,功能是选择不同的天气类型。
- Time Management
时间管理允许你控制各种与时间有关的设置,如开始时间,时间流等。
- Weather Management
天气管理允许你调整与天气有关的各种设置,比如天气类型、云雾颜色和闪电设置等等。
Weather Generation: 是否产生天气,如果Disable的话,UniStorm将一直保持一种天气类型,除非使用代码控制其改变。
- Celestial Setting
该设置用于控制太阳、月亮、星星和大气的颜色。
3.4 入门使用
创建一个空对象:Player。
并将它的Position修改为(10,10,10)。
场景相机MainCamera设置为(0,0,0) 并将其分别赋值给PlayerTransform和PlayerCamera字段。
点击Unity的Play最上面的三角形的播放按钮:
运行按下Esc 在菜单中选择多云天气进行切换你可以看到,天气变换。
从下拉框选择了一种天气之后,鼠标点击下面的按钮“Change Weather”,之后需要等待一小会,天气才会过渡到新的天气效果来。
/* 插件天气对照表
0 Clear //清除 万里无云
1 Mostly Clear //晴时多云
2 Mostly Cloudy //大部多云
3 Partly Cloudy //局部多云;少云
4 Cloudy //阴天的
5 Lightning Bugs //萤火虫
6 Blowing Pollen //吹花粉
7 Blowing Leaves //吹树叶
8 Blowing Pine Needles //吹松针
9 Blowing Snow //高吹雪,飞雪
10 Foggy //有雾的
11 Overcast //阴天的
12 Hail //下冰雹
13 Heavy Rain //大暴雨
14 Rain //雨
15 Light Rain //小雨
16 Drizzle //下毛毛雨
17 Heavy Snow //大雪
18 Snow //雪
19 Light Snow //小雪
20 Thunderstorm //雷雨
21 Thunder Snow //雷阵雨
22 Dust Storm //尘暴
23 Fire Rain //火雨
24 Fire Storm //大火
*/
4、脚本开发
UniStorm提供了大量有用的API,使自定义和更改UniStorm变得容易。联合风暴的
API 可从 2 个不同的脚本访问。访问时请务必使用正确的实例接口。
4.1 接口简介
4.1.1 天气
//Changes UniStorm's weather, regardless of conditions, with the transition speed to the weather type parameter.
UniStormManager.Instance.ChangeWeatherWithTransition(WeatherType weatherType);
//Changes UniStorm's weather instantly, regardless of conditions, to the weather type parameter.
UniStormManager.Instance.ChangeWeatherInstantly(WeatherType weatherType);
//Generates a random weather type, regardless of conditions, from UniStorm's All Weather Type list
UniStormManager.Instance.RandomWeather();
//Get the name of the current weather type string CurrentWeatherTypeName =
UniStormSystem.Instance.CurrentWeatherType.WeatherTypeName;
//Gets the forecasted weather type's name
string WeatherForecastName = UniStormManager.Instance.GetWeatherForecastName();
//Gets the hour that the forecasted weather will change
string WeatherForecastName = UniStormManager.Instance.GetWeatherForecastHour();
//Disables or enables all UniStorm particle effects depending on the ActiveState bool, , but does not affect their emission amount.
UniStormManager.Instance.ChangeWeatherEffectsState(bool ActiveState);
//Disables or enables all UniStorm weather sounds depending on the ActiveState bool, but does not affect their current volume.
UniStormManager.Instance.ChangeWeatherSoundsState(bool ActiveState);
//Get the current UniStorm temperature
int CurrentTemperature = UniStormSystem.Instance.Temperature;
4.1.2 时间
//Get the current UniStorm Minute
int CurrentMinute = UniStormSystem.Instance.Minute;
//Get the current UniStorm Hour
int CurrentHour = UniStormSystem.Instance.Hour;
//Sets UniStorm's Date
UniStormManager.Instance.SetDate(int Year, int Month, int Day);
//Sets UniStorm's Time
UniStormManager.Instance.SetTime (int Hour, int Minute);
//Get the current time of day state
UniStormSystem.CurrentTimeOfDayEnum CurrentTimeOfDayState = UniStormSystem.Instance.CurrentTimeOfDay;
//Sets the length, in minutes, of UniStorm's days
UniStormManager.Instance.SetDayLength(int MinuteLength);
//Sets the length, in minutes, of UniStorm's nights
UniStormManager.Instance.SetNightLength(int MinuteLength);
//Gets the current UniStorm day of the week
System.DayOfWeek CurrentDayOfWeek = UniStormManager.Instance.GetDate().DayOfWeek;
//Gets the current UniStorm date
System.DayOfWeek CurrentDayOfWeek = UniStormManager.Instance.GetDate().DayOfWeek;
4.1.3 程度
//Set UniStorm's Music volume using a value from 0 (Fully muted) to 1 (Full volume).
UniStormManager.Instance.SetMusicVolume(float Volume);
//Set UniStorm's Ambience volume using a value from 0 (Fully muted) to 1 (Full volume).
UniStormManager.Instance.SetAmbienceVolume(float Volume);
//Set UniStorm's Weather volume using a value from 0 (Fully muted) to 1 (Full volume).
UniStormManager.Instance.SetWeatherVolume(float Volume);
4.1.4 季节
//Get the current season
UniStormSystem.CurrentSeasonEnum currentSeason = UniStormSystem.Instance.CurrentSeason;
4.1.5 系统
//Change the player transform and player camera to UniStorm, if they need to be changed or updated.
UniStormManager.Instance.ChangePlayerComponents(Transform PlayerTransform, Camera CameraSource);
4.1.6 其他
//Changes UniStorm's moon phase color. The updated color will be applied at noon when UniStorm's moon is updated.
UniStormManager.Instance.ChangeMoonPhaseColor(Color MoonPhaseColor)
4.2 接口测试
4.2.1 测试1
(1)创建UniStorm System对象。
(2)创建空对象:Player
(3)鼠标点击UniStorm System对象,右侧属性区域配置UniStorm System对象。
(4)创建一个Button对象。
(5)修改Button对象的文本。
(6)创建一个Script对象。
- Weather_Button.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Weather_Button : MonoBehaviour
{
void Start()
{
//TODO
}
void Update()
{
//TODO
}
public void changeWeather()
{
UniStormSystem.Instance.ChangeWeather(UniStormSystem.Instance.AllWeatherTypes[18]);
}
}
(7)将上面这个Script对象拖拽到Hierarchy树中的Button对象上。
(8)点击On Click() 的+按钮。绑定Weather_Button 脚本中的函数接口。
将Button对象拖拽到第2行的第一个文本框里面。接着从后面的下拉框选择脚本里的函数。
(9)点击Play播放按钮,如下。
点击按钮之后,慢慢的开始下雪了。冬天来了,春天还会远吗?
(10)再添加一个按钮,控制时间变化。
它对应的脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
public class Weather_Time : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
//TODO
}
// Update is called once per frame
void Update()
{
//TODO
}
private string GetCurrentTime()
{
DateTime dateTime = DateTime.Now;
string strNowTime = string.Format("{0:D}{1:D}{2:D}{3:D}{4:D}{5:D}", dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, dateTime.Second);
print(strNowTime);
return strNowTime;
}
public void changeTime()
{
DateTime dateTime = DateTime.Now;
UniStormManager.Instance.SetTime(dateTime.Hour, dateTime.Minute);
}
}
(11)再添加一个文本框,显示时间变化。
它对应的脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class Text_Time : MonoBehaviour
{
public TextMeshProUGUI TxtCurrentTime;
// Start is called before the first frame update
void Start()
{
TxtCurrentTime = transform.GetComponent<TextMeshProUGUI>();
// TxtCurrentTime = GetComponent<TextMeshPro>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.Space))
{
//TODO
}
//获取系统当前时间
System.DateTime NowTime = System.DateTime.Now.ToLocalTime();
TxtCurrentTime.text = NowTime.ToString("HH:mm:ss");
}
}
(12)点击Play播放按钮,如下。
点击第2个按钮,如下:
结语
如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;
╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;
o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;
(✿◡‿◡)
感谢各位大佬童鞋们的支持!
( ´ ▽´ )ノ ( ´ ▽´)っ!!!