UE 官方Water插件 为物体添加浮力
UE 官方Water插件 为物体添加浮力
在Unreal Engine(UE)中实现水体浮力效果是游戏开发中的一个重要技术点。本文将详细介绍如何使用UE官方Water插件为物体添加浮力,包括为物体添加浮力的具体步骤、动态修改水波参数的方法以及船只在水面上行驶的实现方式。
一、为物体添加浮力
1. 添加插件
首先,确保已经添加了三个插件:water、NiagaraFluids、Landmass。
2. 新建蓝图
有两种选择:
1)直接继承staticmeshactor
2)创建actor,添加一个staticmesh,并使其成为新的根
注意:不管哪种方式,都必须使staticmeshcomponent成为根,不然物体无法浮起。开启staticmeshcomponent的模拟物体SimulatePhysics,不开启的话物体无法浮起来。
3. 添加组件Buoyancy
在右侧的细节面板中,点开Buoyancy有一系列可以调节的参数。我们需要先为Pontoons浮桥添加元素,这代表着物体受浮力的点。而Center Socket需要我们在对应的模型上创建对应的插槽。
4. 为物体模型添加插槽
在此处我为模型添加了前左,前后,后左,后右4个的对应的插槽位置。
然后在Pontoons浮桥将对应的名称添加进来,注意CenterSocket要和插槽名称相同。
到了这一步,将对应的物体放进海面上,就已经可以浮起来了。但是有侧翻的风险。
注意:将物体放置到场景内时,不能直接贴着水面放置,那也会直接沉下去,需要距离水面有一定的高度,这样它下落接触到水面后才会上浮。
5. 调整相关数值
1)防止物体直接下沉
需要将模型物理的mass(kg)调为自定义。数值不能过高,体重太大会导致物体直接下沉,浮不起来。推荐数值为0~400,可根据需求进行调整。
2)防止物体侧翻
可以调整LinearDamping和AngularDamping两个参数。LinearDamping决定物体上下运动拖拽的力,即一开始将物体放置在水面上一定距离,运行时,LinearDamping数值越大,物体下落得越慢。决定了物体翻转旋转的力,数值越小,物体越容易侧翻。因此如果物体放在水面上容易侧翻时,可以将AngularDamping数值调大。
3)确保物体模型枢轴点在物体中心
当模型的轴心不在中心时,受浮力的物体容易因为受力不均匀而起飞消失。解决方法:
- 将对应的模型拖到场景里。
- 在左上角工具中选择建模模式,选择Transform中的Pivot。
- 在盒体位置中选择center(中心)和bottom(底部),修改枢轴点的位置,之后选择接受。这样该模型的中心点就被改变了,不需要重新导入模型。
6. 可视化Buoyancy效果
详细见第四个教程链接。打开控制台,输入r.Water.DebugBuoyancy。红色小球就是创建的pontoons的可视化效果,可根据其对Pontoons的数量,大小,位置进行调整。
7. 排出船内的水
创建水面遮罩。选择海面,找到水面的父材质。在材质的最后添加“设置材质属性”节点。左侧设置为透明度遮罩。创建DistanceToNearestSurface,限制在0-1之间。
二、动态修改水波参数
1. 参数设置
控制水波大小的参数如图所示。WavesSource还有另一个选择,但是Water waves asset reference无法在蓝图中cast到。
并且WaterWavesAsset中本质上还是使用了对应的WaterSource,若是正常使用的话,使用Water waves asset reference可以方便管理和替换资产,但是需要使用蓝图动态修改水波参数时,还是需要使用到默认的GerstnerWaterWaves。
2. 蓝图函数
3. C++函数
查到最后发现是GerstnerWaterWavess中的WATER_API void RecomputeWaves(bool bAllowBPScript);函数在起作用。当蓝图运行时,更改GerstnerWaterWaveGeneratorSimple里的值,并不会触发该更新函数。但在编辑器运行修改对应的值时,会自动触发该更新函数。此函数为public,可以被调用,因此可以新建一个函数库,手动写一个函数来触发该水波的更新函数,并使其能够在蓝图中调用。只要在运行下更改对应的值控制水波时,需要调用一个更新函数。
三、船只在水面上行驶
1. 添加推进器AddForce
采用时间轴动态设置船只位置,无法使船漂浮在水面上,因此无法动态对水波海浪形成响应。选择采用推进器的方法,推动船只行驶,这样既可以保留船只的物理状态也可以使其能在水面上漂浮。
2. 驾驶船只
如果需要驾驶船只,可以采用以下方法:
1)Chaos载具系统
这个后续有需要的话再进行学习)目前暂时没时间拓展
2)使用movemnt传值
举例:小船向前行驶。首先,船只的父类需要是pawn。在蓝图中右键调出Move Forward,获得向前的前进量。获取actor向前的方向,和输入轴相乘,再额外乘上一个控制速度的浮点值。将得到的结果给小船提添加力即可。
若是小船需要向后或者向前后左右行驶,需要依据类似操作完善整体的操作流程。
四、为行驶船只添加尾波
添加相关的粒子效果即可,这个暂时也没拓展,有时间再补充了