写在前面
Actor是可以放进地图的最基本类,这里主要是介绍一下Actor的使用。
一、空间坐标系
1. Actor的变换操作
-
Actor的变换变换操作主要包括四个部分:
- 位置;
- 旋转;
- 缩放;
- 上面三者都是对应三个轴进行变换;
- 红色代表前(X轴),绕X轴旋转是Roll;
- 绿色代表右(Y轴),绕Y轴旋转是Pitch;
- 蓝色代表上(Z轴),绕Z轴旋转是Yaw;
- 移动性;
- 有三个可选项;
- 静态:游戏过程中Actor不可移动,属性也不可以更改;
- 固定:游戏过程中Actor不可移动,但可以更改它的一些属性;
- 可移动:游戏过程中Actor可以移动;
- 可以参考博客:UE4 Actor移动性以及光源移动性类型;
-
地图中的每一个单位代表1厘米;
2. 世界坐标系和局部坐标系
- (1) 在Editor中点击地图上面的的小按钮可以切换世界坐标系和局部坐标系;
-
两个坐标系对Actor变换影响如下:
- 对于位移变换和缩放变换,两个坐标系均无影响;
- 对于旋转变换而言,旋转的发生均参照世界坐标系,对世界坐标系无影响,但对局部坐标系有影响,局部坐标系相当于是跟着物体在旋转,始终与物体保持最初的相对位置;
-
(2) 在代码中也可以使用两种坐标系;
-
使用局部坐标系也就是将变换的视角代入Actor本身,操作是相对于Actor而言的,是常用的写法,例如:
AddActorLocalOffset(FVector(1, 0, 0));
AddActorLocalRotation(FRotator(1, 0, 0));
- 使用世界坐标系也就是用上帝视角进行Actor的变换,X轴、Y轴和Z轴永远不变且唯一,这种用法比较少,一般是用来和地图上的其他东西对齐,例如:
AddActorWorldOffset(FVector(1, 0, 0));
AddActorWorldRotation(FRotator(1, 0, 0));
二、创建一个Actor的C++类
- 创建的C++类也是放在Source文件夹中的Public和Private文件夹中;
- 选择Actor作为继承的父类;
- 头文件中已经默认定义了三个函数:
- 默认的构造函数;
BeginPlay()
函数:当Actor在游戏中创建完实例后就会执行的内容;Tick()
函数:Actor在游戏中的每一帧都会执行的内容;
.cpp
文件中也已经默认实现了三个函数,如下:
三、实现功能
- 在头文件中增加若干成员变量,如下:
-
一些注意的点如下:
UStaticMeshComponent
是挂载的组件,说明符虽然是VisibleAnywhere
,但实际上在Editor细节面板上该变量下仍可以自由设置属性,以改变物体的形状;- 带Visible说明符的属性在Editor面板上是类似于只读类型,不希望用户通过Editor直接修改值的属性均设置为Visible说明符;
ToolTip
说明符是在Editor中给变量以鼠标悬停提示,默认是变量上方的注释内容,当然也可以显式设置,中文注释可能会出现乱码;- 在声明变量时不要设置初值,而是在构造函数中设置初值;
-
在
.cpp
文件中实现具体内容,如下:
- 一些注意的点如下:
- 虽然变量在构造函数中进行了初始化,但设置了Edit说明符的变量的初始值仍然会改变,在Editor的细节面板上修改的值会直接覆盖C++中的初始值,优先级顺序大概是:C++类初始值 -> 蓝图类(若用C++类创建蓝图类)的蓝图面板中的设置值 [Default级] -> 主面板的实例细节面板中的设置值 [Instance级];
- 所有变量都应该进行初始化;
- 调试代码时可以尝试用输出到屏幕的方式;
四、在Editor中使用
- 直接拖动
FloatActor
类到地图中可以生成实例; - 当然也可以先用
FloatActor
生成对应的蓝图类,然后再将蓝图类拖到地图中以生成实例;
- 为实例设置基本的形状和材质,否则当游戏开始时是看不到的;
- 注意移动性应当设置为可移动,因为C++中设置了移动的功能;
- 在细节面板中搜索
Float Variables
分组,可以看到自定义的AFloatActor
的成员变量,如下:
- 最后点击播放即可,如果勾选了
Should Float
,这个正方体就会沿水平面漂浮移动; - 播放时,按
Shift + F1
可以将鼠标退出游戏界面;