先看类图
注:图中只写出关键成员,对于getter,setter与同类型的成员进行了省略
先看看SceneComponent
是什么?
Component组件的作用是帮助Actor实现某种功能,例如移动,碰撞等。今天讲的SceneComponent倾向于表现出一个Actor的物理状态,因为是物理存在所以就会有例如transform这样的物理特征。
它有一个特点:可以绑定在其他的组件上,SceneComponent的特点是可以绑定在一个Component之上。
结构与用法
回顾一下SceneComponent的类图,在它的成员中维护着子节点数组AttachChildren与父亲节点AttachParent。这就是SceneComponent Attachable的体现,多个SceneComponent相互链接可以形成一个树形结构,通过一层层的叠加实现了SceneComponent所需要表现出的物理状态。
顺着类图继续看,接下来我们看到了一些的transform信息,例如:location,rotation,Scale3D等,也有一些例如碰撞,Mobility,move这样的物理特征。这是一个物理体在虚拟世界的的具体展示所需要的。
接下来就是为它树节点特性而打造的一些方法,AttachTo(),UpdateChildTransforms()这样的方法。
再看看CameraComponent
是什么?
CameraComponent代表了一个摄像机,玩家从摄像机来获取玩家他们所能看到的图像。对于一个摄像机来说,我们可以选择投影方式,视野大小,覆盖式的后处理(post-process overrides)
。从类图上可以看到,CameraComponent是继承于SceneComponent的,所以也是具有绑定的能力,这也确定了它可以通过绑定其他的组件控制自己最后显示的图像。
结构与用法
在CameraComponent中所定义的都是有关于摄像机本身的属性和状态,例如FOV,AspectRaio这些属性决定了用户所看到的图像是什么样子的。
同时CameraComponent还有一个自身的一套偏移量,使用AddAdditiveOffset(),可以调节它的相对坐标,使用ClearAdditiveOffset()可以方便
的清除自身所设置的偏移属性。
最后是SpringArmComponent
是什么?
SpringArmComponent是一个弹簧臂,它的作用是让一个组件保持在它父节点的一个固定的距离上,当这个组件发生碰撞之后。弹簧臂会收缩来避免碰撞,当碰撞体消失的时候,组件会回到之前的位置。
结构与用法
继续在类图中找线索,对于SpringArm,它有个特点是可以延时跟随(lag属性,很是符合弹簧的特性),所以在臂长,Pitch等属性之外还有Lag相关的属性,Lag可以控制SpringArm的延时跟随。通过这些属性,可以组件对其parent的距离进行控制。
梳理一下整体的逻辑
在最开始的父控件ActorCompoent中,主要控制了控件的生命周期,在什么时候初始化,什么时候Destroy,active,Register(成员太多这里就省略一下了…).到SceneComponent时,它开始控制具体的位置,由于是可以Attach的,所以开始维护父子节点。在最低层的SpringArm以及CameraComponent的时候,它们只用很专一的维护自己相关的属性就ok了。springArm负责控制距离,Camera负责控制镜头表现。所以当我们需要对镜头进行控制的时候,首先要分析需求:需求中有哪些操作,将对应的操作找到对应的类型进行实现就ok了。