若虚幻引擎项目中使用了可操作角色,你就可以使用 玩家出生点(Player Start) Actor来控制在运行时每个玩家角色在游戏世界中的生成位置。
玩家出生点Actor在视觉上表现为游戏控制器图标,上面有一个旗帜,还有一个箭头表示玩家生成时的朝向。
在选择玩家出生点Actor时,你会看到两个额外的组件,即胶囊体和变换控件,胶囊体可直观地表示Actor在游戏世界中占据的物理空间。
关卡中的一个玩家出生点Actor。左侧:未选定;右侧:已选定。 点击查看大图。
如果你的关卡没有玩家出生点Actor,玩家将始终以世界内的坐标0,0,0为出生点。
放置玩家出生点Actor
将玩家出生点Actor放入关卡的方式与其他Actor相同,也是通过拖放操作。
你可以使用蓝图或C++在关卡中放入多个玩家出生点Actor,并控制使用哪个玩家出生点作为玩家生成位置。
要放置玩家出生点Actor,请按照以下步骤操作:
点击查看大图。
-
点击 主工具栏(Main Toolbar) 上的 快速添加(Quick Add) 按钮。
-
选择 基本(Basic)> 玩家出生点(Player Start) 。
-
点击 玩家出生点(Player Start) Actor并将其拖动到关卡视口中。
使用玩家出生点Actor生成玩家时,玩家角色的位置和旋转将与玩家出生点的位置和旋转一致。如果你想让玩家在生成时面朝特定方向,请将你用来生成玩家的玩家出生点的 箭头 组件指向你想让玩家面朝的方向。
如果你的关卡中有多个玩家出生点Actor,则玩家每次都会随机从一个玩家出生点生成,未被阻挡的玩家出生点Actor优先。
玩家出生点尺寸错误警告
放置或移动玩家出生点Actor时,你可能会看到带红色边框的白色标签,上面显示 BADsize 字样。
点击查看大图。
当玩家出生点Actor与关卡中的道具或地貌等其他物体重叠或相交时,就会出现此警告。要解决此问题,请移动玩家出生点,使其 胶囊体 组件不再与其他物体重叠或相交。
在蓝图中使用玩家出生点Actor
虚幻引擎有若干蓝图节点可用于处理玩家出生点Actor。这些节点对许多不同的场景都有帮助,包括在玩家出生点Actor的位置重新生成玩家,或根据不同的条件在不同的玩家出生点生成玩家。
游戏模式(Game Mode) 蓝图中提供了以下用于处理玩家出生点Actor的节点:
-
FindPlayerStart:在关卡中查找具有特定 标签 (在 传入名称(IncomingName) 属性中定义)的玩家出生点Actor。你可以在Actor的 细节(Details) 面板中设置玩家出生点Actor的标签。
-
Restart Player at Player Start:使用指定的玩家出生点Actor重新生成玩家。
下方屏幕截图显示了一个示例,说明如何利用这些节点在按下 E 键时,在带有 TheStartIWant 标签的玩家出生点位置重新生成玩家。如果你想自行尝试,请在项目的 游戏模式(Game Mode) 蓝图中重新创建这些节点。
点击查看大图。
在PIE中忽略玩家出生点
当你在虚幻编辑器中使用在编辑器中运行(PIE)预览游戏时,可能不希望在玩家出生点Actor的位置生成角色,而是可能想先找到关卡中的特定位置,然后从该位置启动PIE会话。
有两种方法可以实现这一目的:
-
在运行选项(Play Options)菜单的 玩家生成位置(Spawn Player At) 分段中,可以选择在当前摄像机位置或默认玩家出生点位置生成玩家。
] -
你可以在关卡视口中 右键点击 所需的起始位置,然后从上下文菜单中选择 从此处运行(Play From Here) 。
自定义玩家出生点行为
玩家出生点Actor的大部分行为均在游戏模式基类( AGameModeBase )的 FindPlayerStart() 和 ChoosePlayerStart() 函数中实现。如果你需要不同的行为,可以在项目的游戏模式类中覆盖其中一个函数,或将这两个函数都覆盖。
例如,你可能不想按照本页面上文所述的那样让这些函数随机选择一个玩家出生点Actor,而是希望这些函数根据一组不同的标准选择一个Actor,比如下面这组标准:
- 距离玩家到达的最后一个检查点最近的玩家出生点Actor。
- 距离玩家队友当前位置最近的玩家出生点Actor。
- 与玩家或其角色关联的其他属性,比如其初始团队分配。
FindPlayerStart() 和 ChoosePlayerStart() 两个函数都会传递给玩家(Player)参数中正在生成的玩家的控制器。如有必要,你可以利用此参考在自己的实现中访问有关玩家的信息。
FindPlayerStart
每当引擎需要新的玩家起始位置时,就会自动调用 FindPlayerStart() 。如果该玩家之前生成时使用了一个Actor来标记起始位置,则此函数会返回该Actor。否则,它会调用 ChoosePlayerStart() 来选择一个Actor。
如果你希望玩家重新生成时的起始位置不同于最初加入游戏时所选的位置,可以利用此项覆盖掉原来的位置。
FindPlayerStart() 也接受传入名称(Incoming Name)参数。如果提供此名称,则默认实现会寻找已在其玩家出生点标签(Player Start Tag)设置中被赋值了匹配字符串的玩家出生点Actor。如果找到匹配的玩家出生点Actor,则返回该Actor。如果你在自己的Gameplay代码中调用 FindPlayerStart() ,此行为可能会有帮助。但在大多数情况下,引擎在对 FindPlayerStart() 进行内部调用时不会提供传入名称(Incoming Name)。
ChoosePlayerStart
ChoosePlayerStart() 的默认实现会随机选择玩家出生点Actor,但会优先选择那些未被其他阻挡几何体阻挡的Actor。
如果你希望保持 FindPlayerStart() 的默认行为,但又希望在玩家首次加入游戏时使用你自己的自定义逻辑来选择起始位置,可以利用此项覆盖掉原来的位置。
示例
以下这个 FindPlayerStart() 实现来自从游戏模式基类派生的一个蓝图类。它将获取当前游戏状态,并寻找已保存在该游戏状态中的名为检查点位置(Checkpoint Location)的参考位置。如果它能够从游戏状态中获取该参考位置,则返回距离该位置最近的玩家出生点Actor。否则,它会退回到调用基类中的原始实现,从而随机选择玩家出生点Actor。
点击查看大图。
有关游戏模式和游戏状态的更多信息,请参阅Game Mode 和 Game State。