写在前面
UE4作为物理引擎,其中一大功能就是能够赋予物体以物理特性。这里将简单介绍一下Actor常用的一些物理特性设置。
一、基本操作
- 这里介绍一些UE4的Editor基本操作;
1. Actor的变换
- 将Actor类拖动到地图中,生成实例;
- 鼠标选中Actor实例,此时的模式是位移变换,悬停鼠标到特定箭头可以让Actor沿箭头方向移动;
- 按空格键,此时转换为旋转变换,可沿三个轴进行旋转;
- 再按空格键,此时为缩放变换,可以沿三个轴缩放Actor大小;
2. 快速转到素材所在路径
-
Actor的网格体和材质均为素材;
-
点击细节面板中的放大镜按钮,即可打开网格体和材质所在的文件路径;
3. 播放游戏选项
- 播放游戏有不同的选项,如下:
- 常用的选项对应的含义如下:
- 选中的视口:播放游戏后,视角跳转到地图中的预设玩家视角,这也是真实游戏开始时的玩家视角;
- 模拟:播放游戏后,视角并不跳转到玩家视角,仍停留在当前的视口;
二、碰撞
- 碰撞是一种物理特性,当Actor在游戏中有了实际的体积,会占据一部分空间时,才会和其他Actor产生碰撞;
1. 设置碰撞形状
-
双击网格体素材,即可打开网格体编辑窗口,可以为网格体增加或者修改碰撞的形状;
-
Actor碰撞的形状并不一定是Actor本身的形状,尤其是对于复杂形状的Actor来说,用一个简化的碰撞形状可以极大地降低碰撞时的计算损耗;
-
点击碰撞->勾选简单碰撞可以查看当前网格体已设置的简单碰撞模型,显示为绿色线,如下:
- 勾选复杂碰撞可以查看当前网格体已有的复杂碰撞模型,显示为浅蓝色线,如下:
- 对于静态网格体而言,碰撞均参照的是简单碰撞,不会启用复杂碰撞;
- 可以为静态网格体添加新的的简单碰撞,点击碰撞,选择要添加的碰撞模型即可;
- 注意碰撞模型的形状是可以进行变换(包括位移、旋转和缩放)和叠加的;
- 这里增加了一个倾斜的盒体碰撞;
2. 打开模拟物理
- 在细节面板中可以勾选模拟物理,否则碰撞不会生效;
- 注意启用重力;
- 启用模拟选项播放游戏,可以看到Actor在重力的作用下,以立方体的碰撞模型立在了地面上,而不是以它本身的形状;
三、Actor移动过程中的碰撞
- 移动过程中的发生碰撞后,可以采用的措施有两种:
- 重叠:碰撞的物体没有实际的碰撞效果,表现为穿模;
- 阻挡:碰撞的物体产生实际的碰撞效果,阻碍Actor的前进;
- 前面有提到,如果不勾选模拟物理,也不增加别的代码逻辑,将不能有阻挡的效果;
- 这里将使用C++实现在不勾选模拟物理的情况下的阻挡效果;
1. Sweep概念
- Sweep是扫描Actor的前进路线,并在碰撞时产生阻挡效果;
- 能够在不启动模拟物理的情况下,实现实际的物体碰撞;
Sweep = true
,扫描前进路线,并在碰撞时采用阻挡;Sweep = false
,不扫描前进路线,在碰撞时采用重叠;
2. 实现的功能函数
- 实现的C++功能函数如下:
- 就是在移动函数
AddActorLocalOffset
中,启用Sweep
参数,并将信息保存在一个碰撞结果类对象中; - 如果
Sweep = false
,则碰撞的HitResult.bBlockingHit = false
;
3. 碰撞的效果
- 由于没有启用模拟物理,因此Actor并没有具备重力,仍然是在空中漂浮;
- 将玩家视角移动到合适的位置,启用选中的视口播放游戏;
- 当鼠标进入游戏中时,点击键盘上方数字1左边的按键,可以调出CMD控制台;
- 输入
show collision
,可以显式地看到各个Actor的碰撞模型,这里Actor是和墙撞在一起了,如下:
四、碰撞的细节
- 每个Actor可以具备不同的碰撞属性;
- 这些属性将决定两个Actor是产生重叠效果还是阻挡效果;
- 在细节面板的
Collision
中可以看到碰撞属性:
- 碰撞预设就是决定是否会产生碰撞的效果:
- 对象类型:指当前的Actor是什么类型;
- 碰撞响应:指当前Actor和其他类型的Actor碰撞时,是产生重叠效果还是阻挡效果;
- 可以用系统已经创建的碰撞预设,也可以自定义碰撞预设;
- 两个Actor碰撞时,只有相互的碰撞预设都是阻挡,实际的效果才会是阻挡,否则为重叠,也就是说单方面地设置为阻挡是无效的;
五、力和力矩
- 力能使物体产生位移,力矩能使物体产生旋转;
- 力和力矩均需要勾选模拟物理才能生效;
- 为Actor添加力和力矩的实现如下:
- 力和力矩均是按照世界坐标系的X轴、Y轴和Z轴来设置的;
- 力是沿三个轴的方向位移,力矩是绕三个轴旋转;
- 传入的参数均为
FVector
类型,对应(X, Y, Z)
;