Unity开发者快速认识Unreal 的C++(四)Pawn和Actor
Pawn是代表世界中的存在的单位,或者说是个体,Actor是Pawn的基类,也可以代表世界中的实体。那我们在开发Unity时最直接的就是,场景中创建一个GameObject,然后就是挂载组件,挂载组件,挂载组件,然后拖到资源窗口做成预制体,很简单,如果要是换成Unreal的话,该怎样操作和实现?到底是创建Pawn的C++子类或者蓝图类?,还是创建Actor的C++子类或者蓝图类?同样都是场景中的对象,该怎样操作?为了方便理解下面贴上Actor和Pawn的部分代码解析说明
1.Actor
功能大概分为两种,左图是常量函数,基本上处理一些类型引用,,一种是功能函数,主要处理actor的自身属性,比如系统在调用actor时创建的SceneComponent,用来控制actor世界中的变换,这些功能函数就是对SceneComponent组件进行设置和修改(具体看逻辑实现)
1.Pawn
具有Actor一些通用的功能,比如SceneComponent,Pawn也是具有的,此外Pawn还拓展了一个组件InputComponent,Pawn对象创建时自动创建输入组件,然后并没有查找到相关的输入设置,
在创建输入组件的时候,有一步是设置玩家输入组件的函数(SetupPlayerComponent)调用,然后查看该函数的定义是虚函数,包括CreatePlayerInputComponent函数也是虚函数,也就是说,子类可以重新定义,输入组件的创建和设置
Pawn还拓展了一个移动功能,引用UPawnMovementComponent组件定义物体移动相关的虚函数
DefaultPawn:是Pawn的子类,是默认的GameMode的默认生成单位,下图是所有函数定义
看了下函数逻辑主要分为两部分:一部分是重写了输入组件的设置函数(SetupPlayerInputComponent),Pawn中只是声明了SetupPlayerInputComponent虚函数,子类DefaultPawn中进行了重写,代码就是进行了键位和回调函数之间进行了绑定,第二部分就是输入组件键位回调函数的具体逻辑实现。至此DefaultPawn的前世今生基本上就了解了,然后我们给GameMode创建一个Pawn替换DefaultPawn,运行程序,自动生成的Pawn没有输入上的反馈,这就需要打开脚本或者蓝图子类,进行SetupPlayerInputComponent函数的重写和逻辑实现
第二部分功能就是UMovementComponent组件,使用该组件进行实际上的空间变换控制,对SceneComponent组件的设置,这个地方有点难理解,查看UMovementComponent组件的继承顺序,
UActorComponent <-- UMovementComponent <-- UNavMovementComponent <-- UPawnMovementComponent
注:最左边的是所有组件的基类,Pawn持有的是UPawnMovementComponent,DefaultPawn持有的是UMovementComponent ,可以看出来这块是多态的,”父类引用子类对象“
总结:Pawn和Actor之间最大的区别就是InputComponent组件
1.如果需要一个能交互的物体时,可以创建一个Pawn子类
2.如果物体不需要键鼠交互,那创建一个Actor就可以
3.如果非要创建Actor然后添加交互组件,实现键位绑定也行
4.尽可能的创建Pawn,不需要输入系统,那就不去重写SetupInputComponent
5.单位的移动可以使用UMovementComponent 组件,也可以自定义逻辑进行移动(获取SceneComponent组件进行变换设置)