Getting Started with GCS(GCS 入门)
Getting Started with GCS(GCS 入门)
在深入理解GCS(Gameplay Camera System)以前,我们会先介绍GCS系统的现状和如何使用,再探讨整个系统的架构。
GCS是虚幻引擎5.5推出了新插件,用于让开发者和设计人员能够直观地创建复杂的摄像机行为。
目前插件处于实验阶段,最终发布版本预计为5.7或者5.8。

激活插件后,我们就可以利用虚幻提供的工具链来构建想要的摄像机行为了。
GCS Asset Tool
创建GCS资产的工具统一放到右键菜单窗口的Gameplay选项中, 如下图所示:

下面会介绍里面Camera Asset, Camera Rig, Came Variable Collection 以及 StateTree的信息。
Camera Asset
Camera Asset 是GCS的配置集合,集中管理Camera Director、Camera Rig以及Transition等配置。它定义并组织了摄像机系统运行时的核心组成部分。
创建的菜单如下图所示:

这个工具界面会根据选择的CameraDirector类型创建对应的CameraAsset.
- BlueprintCameraDirector:蓝图扩展类型

Info
- 可扩展蓝图的 UBlueprintCameraDirectorEvaluator,实际在C++的FBlueprintCameraDirectorEvaluator中调用。
- 关联的摄像机导演是UBlueprintCameraDirector,适用于蓝图自定义摄像机控制模式。
- PriorityQueneCameraDirector: 优先队列类型(略)
- SingleCameraDirector: 单摄像机类型

Info
- 仅需要指定Camera Rig信息,使用C++默认的评估器 FSingleCameraDirectorEvaluator
- 关联的摄像机导演是USingleCameraDirector,适用于简单的单摄像机模式。
- StateTreeCameraDirector: 状态树类型

Info
- 需指定关联的StateTree, 使用C++默认的评估器 FStateTreeCameraDirectorEvaluator
- 关联的摄像机导演是UStateTreeCameraDirector,用于复杂摄像机的切换模式。
CameraAsset的配置状态可以通过右上方的状态栏确认,高亮为有效,灰色为未激活(或无需配置),并可以点击高亮图标进入关联配置。

- 第一个选项表示当前CameraAsset本身
- 第二个选项是显示CameraDirector的配置, 根据类本身的需求进行配置
- USingleCameraDirector类型,需要配置 UCameraRigAsset
- UBlueprintCameraDirector 类型,需要配置
TSubclassOf<UBlueprintCameraDirectorEvaluator> - UStatetreeCameraDirector 类型,需要配置 FStateTreeReference(UStateTree)
- 第三个选项是关联的CameraRig,这个是动态识别的。
- 第四个选项是CameraRigProxy(略)
Camera Rig
Camera Rig 直译为“摄像机装置”,在虚幻引擎中,它是一种用于描述和控制摄像机行为的Asset。
与现实中物理存在的摄像机装置不同,虚幻中的Camera Rig更多是一个逻辑和功能上的组合体,它由多个蓝图层级节点组成,能够灵活定义和管理特定的摄像机模式和运动效果。
Camera Rig中的蓝图节点是定义好的各种摄像机行为,比如弹簧臂,FOV, 平缓移动等等。
一个简单的Camera Rig样例:

Camera Rig 还可以在Transition 中定义 进入和离开的混合方式,方便平滑过渡摄像机模式。

除了可以指定不同的混合方式,可以通过Conditions pin 添加条件节点,比如判断是否从特定的摄像机轨道变化而来:

Activate Camera Rig
CameraRig设置好了,需要激活才能使用。
Blueprint Camera Director Evalutor
在蓝图评估器中, 可通过蓝图事件来激活CameraRig, 参考如下:

- 这里有不同的事件函数可以重写,开发者可根据实际的情况决定如何激活特定的Camera Rig
StateTree
在状态树中需要添加Activate Camera Rig的Task来激活指定的CameraRig.

正确配置后,状态树的子状态才会去激活指定的Camera Rig

实际上通过FRootCameraNodeEvaluator ::ActivateCameraRig来激活(后面会讲述细节)
Camera Node(Blueprint)
Camera Rig 中提供了 Blueprint 节点,可以通过外部函数对摄像机行为进行扩展。
这里的外部函数需要通过CameraNodeEvaluator的蓝图类型来构建。参考例子如下:

CNE_CharacterSettings 的扩展让摄像机可以去控制玩家的移动变化

然后配置在需要激活这个扩展行为的Camera Rig中:

Camera Node(CameraRigPrefab)
Camera Rig 可以作为模版(CameraRigPrefab)被其他Camera Rig引用。模版提供相同的处理流程,通过暴露的外部参数差异产生不同的表现。

问题:Camera Rig通过模版中更新参数后,可能无法直接在编辑器中观察到摄像机变化。
解决方案:
- 确保要观察的CameraRig是第一激活顺位。
- 调整模版参数后,略微拖动下场景挂载GameplayCameraComponent的角色的位置。
Replace CameraComponent
当CameraRig和CameraAsset正确关联后,我们需要替换掉原版的Character蓝图中的Camera组件就可以让GCS系统运作起来了


GameplayCameraComponent是根据Camera Asset的配置来控制摄像机的变化的,需要进行对应的配置:

bSetControlRotationWhenViewTarget 影响摄像机观察玩家的朝向。
- 如果想让摄像机始终“控制”角色的视角方向,应该开启。
- UGameplayCameraComponent计算出自己的“视点旋转”(摄像机当前方向),会主动把这个旋转赋值给 PlayerController 的 Control Rotation。
- 玩家角色会根据 Control Rotation 来调节自身朝向(例如面向玩家视线方向),这样确保基于摄像机朝向进行移动。
- 如果想让摄像机独立于玩家控制旋转,应该关闭。
同时还需要和PlayerController进行关联:
参数1是绑定玩家的ID,这样才能正确关联Player Controller,默认是Disabled 关闭的。
参数2是选择创建后默认激活Component
配置完成后,我们可以简单的将新的Character的蓝图拖拽的关卡中,这样可以看到当前的摄像机表现:

Info
调整激活CameraRig中的节点属性配置会同步到上面的示意图中,方便进行调试。
Update Parameters In Camera Rig
激活了GameplayCameraComponent后,我们可能需要根据游戏状态的变化(比如输入控制)去更新Camera Rig中的一些参数。
CameRigAsset 内部的摄像机功能节点对外是不可见的。若需要外部更新设置,需要通过暴露参数出来,参考如下:

- 选择需要外部更新的参数,构建出对应类型的参数


- 创建成功后,会出现在CameraRig 左上角的Parameters列表中
然后就可以通过UGameplayCameraComponent去访问更新CameraRig的外部参数了

- 虚幻5.5的实现和5.6略有不同,但是本质上都是通过运行时的Camera Data数据去找到对应的Camera Rig并刷新数据信息。
Shared Camera Evalution Data
GCS系统中有一个非常重要的共享评估数据,它可以影响Camera Rig的层次节点的状态:

蓝图中通常我们可以通过下面两个函数访问:

区别是:前者是可以对所有的Camera Rig都会产生影响, 后者只会对激活的Camera Rig产生影响。
当我们在CameraRig中的蓝图节点暴露对外参数后,必须通过SharedData才能进行更新,参考下面的例子:

还有一种方式是通过 CameraVariableCollection 的集合来创建影响Camera的变量组,通过访问集合来更新指定的变量:
- 首先需要通过GCS的工具菜单创建 CameraVariableCollection

- 创建好后,就可以构建各种类型的变量

- 构建集合后,我们可以在Camera Rig中的蓝图节点中绑定这个变量

- 最后就是在特定场景下去更新这个集合中的变量,如下:

How To Switch CameraRig In State Tree
Statetree 通过Task(比如Global Task)可以控制切换到不同的CameraRig。
简单的例子如下:
- 根据蓝图Class列表,选中StateTreeTaskBlueprintBase.

- 通过StateTree的New Task标签也可以进行创建:

- 复写事件函数,这里选择的是Enter State, 用于每次进入State时候的触发:

需要注意是的:这里需要构建一个Owner参数,并指定它的Category为Context, 用于绑定Statetree的ContextOwner.
这个变量通常用于访问StateTree的外部状态信息,比如例子中的GameplayCameraComponent:

- 将创建好的Task绑定到StateTree上面

这个例子的用途就是当GameplayCameraComponent那边通知有摄像机模式的变换时,将这个状态应用到StateTree并更改StateTree激活的摄像机模式
The End
大致了解GCS在虚幻编辑器中怎么进行配置后,我们就可以通过编辑器快速去创建摄像机原型,不用额外造轮子,非常方便。