最近在学习ue4引擎,有要求做一个天气系统。于是上网查询了一下资料,先做了个简单的昼夜交替的实现。只是简单实现,如果要细化这个部分还有许多要更改的,废话不多说,先做。
组件介绍
要完成这个功能之前首先介绍一下需要用到的组件以及他们的一些参数。因为笔者也是刚开始接触ue4,可能有些地方会写地有点繁琐,因为是第一次接触,有可能有写的不对的地方,望指正。
DirectionalLight(定向光)
DirectionalLight可以看做是模拟太阳发出的光源,这个光源所发出的光都是相互平行的。 平行光不像是SpotLight以及PointLight那样距离物体越远,光的强度就不一样,而DirectionalLight所散发出来的光,所照射的整个区域范围内光强是一样。换句话说,不管怎么拉动平行光的位置,他的光照效果都不会发生改变。
Sky_Sphere(天空球)
进去后每个场景世界大纲里都会有一个默认存在的Sky Sphere,删掉了可以在左侧Modes搜索到BP_Sky_Sphere。 本次用到的参数有下面一些,介绍一下:
- Refresh Material(刷新材质):虽然是个Bool类型参数,但其实相当于一个按钮的功能。当你在游戏未开始时,调整SkySphere绑定的Directional Light Actor的旋转,需要点一下这个按钮才能更新太阳的位置和天空的颜色。
- Directional Light Actor(定向光源):绑定的定向光源(就是上面介绍的DirecionalLight,在这里需要被绑定)。太阳会根据这个Light来调整高度。如果不绑定,就可以通过OverrideSettings里的SunHeight自由更改高度。
- Colors Determined By Sun Position(由太阳的位置决定颜色):如果勾选,则会根据太阳的位置自动计算天空的颜色。如果不勾选,则应用OverrideSettings里的设置。
- Horizon Falloff(地平线衰减):值越高地平线越清晰。
- Sun Brightness(太阳亮度):这个就是调整太阳的自发光亮度,跟定向光源的亮度没有关系。
- 剩下的就是Cloud Speed(云移动的速度),Cloud Opacity(不透明度),Stars Brightness(星星亮度),这三个参数主要用来调整星星的显示效果。
昼夜实现
下面就是正式的蓝图实现了。
调整DirectionalLight(Light Source)
笔者在一开始尝试的时候,发现如果DiretionalLight的Rotation为默认值的话,在最后完成太阳旋转移动的时候,最晚的天空只能是黄昏,而不是漫天繁星,所以在一开始就应该把定向光的Rotation设置为(0,90,0)。 并且,我们是后面是需要实时移动光源的,所以将Mobility设置为Movable(可移动的)。 目前的效果如下图所示:
蓝图设计
打开Level Blueprint(关卡蓝图),右键创建一个Tick的事件,选择下图的第一个。
回到场景主页面,选中Light Source物体,再回到蓝图中右键,创建Light Source的引用。
接着从light source拉出一个选框,搜索addactorworldrotation,进行添加 然后将这些连接起来: 为了方便调整参数,应该将Delta Rotation这个值细化调整,speed参数是自行添加的变量,因为我们只想要昼夜交替的效果,所以简单一点的办法就是让太阳旋转,所以只需要更改y这个值,speed值设置为0.5:
因为太阳的高度是根据定向光源的旋转而变化的,而天空的颜色是根据太阳的位置变化的,所以我们只需要改变定向光源的旋转然后用SkySphere自带的刷新函数UpdateSunDirection就可以了。 于是会场景主页面选中sky_sphere回到蓝图中创建它的引用,在创建他的事件UpdateSunDirection: 所以完整蓝图为:
到此,运行项目即可执行昼夜交替。
一些不足
目前这个功能缺点还有很多,因为刚接触还不熟悉。 因为笔者参加的还是团队工作,所以需要把这个功能放到有水体的场景中。然后就出现了一下一些问题:
- 光照在水面上时,水面不能呈现出自然的颜色。
- 并且当太阳移动到水面下的时候,因为一些原因(这里暂且不知道,但是猜测是因为太阳光在水面下也能发出光照),所以水面不管是昼夜都呈现出很透亮的状态,几乎没有变化。这是一个很头疼的点,目前还不知道怎么修正这个点。
希望继续学习之后,能修正这些bug。
|