YuHang’s Blog

Unreal新手笔记(四)——镜头控制

做镜头相关需求的时候将镜头控制部分的整理了一下

先看类图

注:图中只写出关键成员,对于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了。