游戏原型系列 vol.17 3D游戏套件演练 part3
摘要
这节是3D游戏套件演练中的最后一节。我们这里共同研究游戏中的敌人,机关,检查点,场景转换等等。
11.更深入地了解敌人
3D Game Kit 包含3个预先制作的敌人:Chomper ,Spitter 和Grenadier。
它们都由EnemyController 脚本控制,并且每个脚本都有一个特定的行为(ChomperBehavior ,SpitterBehavior 和GrenadierBehavior )。
Chomper

Chomper是近战敌人,当发现玩家时会奔向玩家,并在玩家靠近时发起攻击。
停止追赶的时间是玩家在停止追随玩家并返回其原始位置之前必须离开Chomper的视线多长时间(以秒为单位)。
Spitter

当发现玩家时,Spitter将向其发射爆炸的酸液。如果玩家离他们太近并且他们当前没有酸液,他们将尝试逃跑。
逃跑距离:逃跑时,一旦他们离玩家足够远,他们就会停止逃跑并继续进攻。
Grenadier(掷弹兵)

掷弹兵是一个更强大,体型更大的敌人。如果距离很远,它将向玩家发射弹榴弹;如果距离很近,则将其击打;如果距离玩家很近但不在其前方,则将其暂时性盾牌造成破坏性爆炸。
只能通过击中发光的核心来从背面使其受伤。
近战范围:如果玩家比手榴弹兵更近,则手榴弹兵将猛击(如果玩家在前方)或部署盾牌。
射程:如果玩家靠近榴弹兵但尚未进入近战范围,则榴弹兵将向其发射弹跳榴弹。如果发现玩家,但仍未在该范围内,则手榴弹兵将向其移动。
常用设定
所有敌人在各自的行为上均具有PlayerScanner(玩家扫描仪)属性,该属性用于设置他们如何发现玩家。

有关设置的说明,请参阅TargetScanner文档。
它们都具有可损坏的组件,该组件定义了它们的血量状况以及如何伤害它们(例如,掷弹兵只能从背面被损坏)。
该组件的位置是:
Chomper和Spitter:在根GameObject 上,紧靠其Behavior脚本。
Grenadier(掷弹兵):对子集游戏物体掷弹兵叫DamageablePart 的层次

SceneView Gizmo(场景视图控件)
当选择“敌人”时,其中一些设置可以在场景视图上显示。

蓝色圆圈代表播放器扫描器的检测半径和角度。仅当玩家在该圈子中行走时才会被发现。
黄色的小球体是玩家扫描仪的高度偏移量(即扫描仪的“眼睛”所在的位置)。系统将检查此设备与播放器之间的视线是否畅通。
红色圆圈是可伤害的命中角度。玩家必须击中该区域内的敌人以造成伤害。
添加Chomper
让我们在场景中添加一个Chomper;
转到Assets> 3DGameKit>Prefabs>Characters>Enemies>Chomper
将Chomper预制件拖到场景中
将Chomper放在Ellen附近的某个地方,以便我们快速测试

我们可以看到非常大的蓝色区域覆盖了场景。这是Chomper的检测半径,这是他可以看到的区域。如果艾伦(Ellen)进入该区域,则Chomper会发起攻击。我们可以通过在“层次结构”中选择“Chomper”来调整此设置。
在检查器中,找到“ Chomper Behaviour” 脚本
在“ Detection Radius(检测半径)”中,将值更改为4。这也可以通过快速滚动值,将鼠标悬停在“ 检测半径”一词上,然后单击并向左拖动以快速减小值或向右拖动以增大值来实现。

按下[ 播放] ,然后朝[ Chomper] 奔跑,输入他的侦测半径
当您输入检测半径时,Chomper将发现Ellen并开始其攻击行为,但是他将在现场奔跑而无法移动。

这是因为我们没有告诉Chomper的AI什么表面可以行走。我们使用Unity的NavMesh系统执行此操作。Chomper的AI由NavMesh Agent组件处理。这使Chomper能够在我们设置的表面上行走,在导航世界时避免障碍物和其他Chomper,Spitters和Grenadier。

我们不需要更改任何这些设置,因为已经将Chomper和其他敌人设置为以特定方式运行和导航。
让我们通过添加NavMesh Surface将地面设置为可被敌人行走的地面;
在“层次结构”中,选择“Plane”(地面)

在检查器底部,单击“ 添加组件”。
搜索“ NavMeshSurface ”
按Enter键或单击结果NavMeshSurface将其添加到Plane

在NavMesh Surface脚本中,将“ Agent Type(代理类型)” 设置为Chomper

这将告诉表面哪些特工可以在其上行走。请注意,此列表中仅显示“碎料”,没有“飞溅物”或“掷弹兵”。这是因为所有敌人都使用Chomper's Agent设置。
对于“ Include Layers(包含图层)” 下拉列表,首先单击“ Nothing(无)”

现在,在“ 包括图层” 下拉列表中,选择“Environment,Vegetation(环境和植被)”

这是取消选择多个图层并重新选择所需图层的快速方法。
单击Bake(烘焙)按钮

这将在您的场景中烘焙一个NavMesh,并使敌人的大多数表面都可行走。浅蓝色高亮显示了场景视图,我们可以看到敌人可以行走的地方。

NavMesh Surface(蓝色高亮区域)中的任何间隙都意味着敌人将无法在这些区域中行走。

在这里,我们可以看到墙前的空隙。这意味着敌人将无法穿过我们设置的墙壁或门。
让我们按Play来测试Chomper 。现在,我们可以奔向Chomper,然后Chomper将奔向我们并发起进攻。如果您稍微远离Chomper,他的NavMesh代理将使用NavMesh Surface导航世界以追逐您。
如果在场景中添加更多的Chompers或其他敌人,它们将使用相同的NavMesh Surface,则无需为添加新的敌人重复此操作。
如果现在要向级别中添加新零件或更改场景中对象的位置,则需要返回到“Plane”并单击NavMesh Surface脚本中的“烘焙”来重新烘焙NavMesh Surface。

添加Spitter
通过将其拖动到场景中,从3DGamekit> Prefabs>Character>Enemies> Spitter 添加Spitter预制件。
如果您查看Inspector,您会发现Spitter很像Chomper。

Spitter是一类远程敌人,当Ellen距离她太近时,将使用其Fleeing Distance 属性来确定它何时应该逃跑,然后再尝试攻击。然后,它使用远程武器向艾伦发射酸。
提示:如果“逃离距离”大于“检测区域”,则仅在被检测到时才会逃离,并可能导致连续的逃逸方式。
理想情况下,您应该让他们走得更远,以使他们有更好的机会进攻,对阵埃伦时更加艰巨。如果要使Spitter考虑环境,则需要将“ View Blocker Layer Mask” 从“ DoNotDraw”更改为“ Environment” 。

在我们的场景中,我们在较高的区域中添加了Spitters,以使Spitters在Ellen上移动平台时比Ellen更具优势,这使玩家将它们放下更具挑战性。
添加他们以查看其行为后播放场景,并尝试不同的检测半径距离和逃逸距离。

添加Grenadier(掷弹兵)
从3DGamekit>预制件>角色>敌人>榴弹兵中添加榴弹兵并将其拖到场景中。

榴弹兵是头目敌人,与它作战时需要考虑更多细节。在场景中选择它时,伤害半径设置为向后,仅迫使玩家瞄准其核心。

Behavior脚本与Chomper和Spitter非常相似,但结合了近战攻击和远程攻击,并具有以下特性:Fist Weapon ,Grenade Launcher 和Shield 。
要查看可损伤的组件,请在“ 层次结构”中展开“ Grenadier” 并找到DamageablePart

这将向您显示与血量有关的“ Damageable” 脚本和内容,Invulnerabilty(无敌时间)和命中区域。

在“Damageable” 组件的事件区域中,有一些功能附加到“榴弹兵死亡”,“命中时显示粒子”并在命中时重置其易损性。

12.创建陷阱
使用“游戏命令”时,我们将在接收到“游戏命令”时将对象旋转以在某些Spitter上放置一个框。
在“ 游戏” 组下的“ 层次结构”中创建一个新的Empty GameObject
命名为PlatformTrap

将PlatformTrap的位置移动到您希望旋转平台的任何位置。这将用作旋转平台的枢轴点。

现在对其进行转换意味着我们将在下一步中附加其他GameObject,并围绕其当前位置旋转它们。
在拖放PlatformShort 从3DGamekit>Prefabs>Environment>Stonework到层次结构和变换其位置靠近枢轴PlatformTrap

在相同的文件夹中对PlatformSupportShort 预制件执行相同的步骤,以在平台下转换它。
在层次结构中,选择PlatformShort 和PlatformSupportShort
在检查器中禁用“ Static(静态)” 参数。当父级旋转时,这将允许GameObjects 移动。

在两个都仍处于Hierarchy中的情况下,将它们拖到PlatformTrap Empty GameObject上,使其类似于以下内容

提示:应在其周围加上一个蓝色气泡以添加它们
选择父集 PlaformTrap

在Inspector中,添加用于Game Command Receiver(游戏命令接收器)和Simple Rotator(简单旋转器)的组件。

这将允许父集PlatformTrap 接收游戏命令并旋转子对象,而无需单独设置。
让我们更改SimpleRotator 组件中的某些设置,以使旋转更加可信。
更改以下设置:
Interaction Type(互动类型):激活
Is One Shot:已勾选
Accel Curve(加速曲线):线性增加(在框中单击,然后选择第二条默认线)
Loop Type(循环类型):一次
Z轴:1
End Angle(端角):-60

如果在“预览位置”上移动滑块,则应该看到PlatformTrap 旋转,类似于活板门。

提示:如果如预期或奇怪的是,从你所期望的转动它不执行,拿PlatformShort 和PlatformSupportShort 出的PlatformTrap 组层次,移动PlatformTrap 到你需要支点,然后加入平台,并支持回组。
与MovingPlatform 教程类似,让我们使用压力垫来激活PlatformTrap 上的旋转。
将“ PressurePad(压力板)” 从“ 预制件”>“可交互对象”拖到您的场景中PlatformTrap 附近的某个位置

随着PressurePad 选择,拖动PlatformTrap 从组层次到Send On Trigger Enter(发送触发输入)的交互对象的游戏命令接收器。
更改互动类型为激活

视觉链接应显示为发送和接收的方向

此时播放场景,PressurePad 将激活旋转。

要损坏Spitters,请从3DGamekit>预制件>Interactables中添加一个DestructibleBox ,方法是将预制件拖到场景中并将其转换到适当的位置,坐在PlatformTrap 顶部。
在“ 层次结构”中,展开“ DestructibleBox” 组,然后选择“ DestructibleBox” 子GameObject。

在检查器中,为“ Contact Damager” 添加一个组件,并将“ Damaged Layers” 设置为“ Enemy”。

数量值应与在敌人的Damageable成分中找到的最大生命值相匹配。
播放场景并激活陷阱,以查看框击中下面的敌人。

13.添加重生检查点
检查点是大多数现代游戏中的常见元素,并且Gamekit提供了可在3D Gamekit>预制件>Utilities(实用程序)> Checkpoint中找到的预制件。

艾伦(Ellen)死后,她会在碰到的最后一个检查站重新产生。为了确保玩家能够获得更新的位置,您应该在游戏中使用物体或视觉提示来说明玩家击中了检查站。
在此示例中,我们将向场景中添加另一个Crystal,这次是通过向其发送游戏命令由Checkpoint enter事件激活的。
要添加检查点,您只需将其拖放到场景中并放置它,以确保玩家可以进入碰撞体。调整大小以确保它不会太大。

在检查器中将“Layer”设置设置为“ 检查点” 。

从3D Gamekit>预制件>Interactables中添加水晶
将其放在检查点附近

为了更清楚地显示此水晶在层次结构中的用途,请将其在检查器中重命名为CheckpointCrystal
要链接两个对象,请选择检查点
单击添加组件
类型发送触发输入
通过单击Enter或单击结果来确认添加

将Interaction Type设置为激活
将One Shot设置为启用
将Layer设置为Player。这将使艾伦与该区域发生碰撞
通过GameObject 选择将Interactive Object 设置为GateCheckpoint

要验证它们之间的连接,请选择CheckpointCrystal,然后在检查器中验证游戏命令接收器是否已连接发件人。

在此阶段玩游戏,然后进入Checkpoint,以查看Crystal在进入时已激活。激活后,杀死Ellen将导致她在Checkpoint范围中心重生。

14.武器领取
在3D Gamekit中,默认情况下,Ellen的武器已激活,可以攻击怪物。对于此示例,我们将研究禁用她的攻击能力,并在从基座上取下游戏时再次激活它,类似于游戏演示级别的工作方式。
要禁用Ellen的攻击能力,请选择Ellen,然后在检查器中找到Player Controller 组件。
禁用可以攻击设置

在3DGamekit> Prefabs>Interactables中找到Weapon Pedestal 预制件,并将其拖到场景中以进行添加。

在分层结构视图,展开组WeaponPedestal 显示其他GameObjects 在预制。

三个游戏对象是:
StaffTakeTrigger
武器基座
Staff
在“ 层次结构” 视图中选择StaffTakeTrigger GameObject 。
在检查器中,您可以看到它具有一个Sphere Collider 组件和一个Interact On Trigger 脚本组件,该脚本组件在脚本属性上具有一些预定义的值。这是为了节省基座上的设置时间,并使您无需代码即可使用现成的逻辑。

为了使基座能够更新Ellen的攻击能力,我们需要从Hierarchy中附加Ellen GameObject 。
将Ellen 从“ 层次结构” 视图拖到顶部属性字段中。当它接受GameObject时,请从标题为PlayerController.SetCanAttack 的下拉菜单中选择一个函数,该函数默认为True(启用)。

播放您的场景,当埃伦出生,走到基座时,埃伦不应该攻击,碰撞体应激活埃伦的攻击能力并使Staff消失。
15.恢复健康
在本教程中,我们将允许Ellen恢复敌人攻击后失去的生命。这将使用Ellen的Damageable 组件,并使用ResetDamage()完全治愈她。
添加Spitter敌人
为确保艾伦受到伤害并允许您快速测试健康系统,我们将在艾伦起点附近的场景中放置一个飞溅敌人。
在打开的场景中转到“ 层次结构” 视图,然后在3DGamekit>预制件>角色>敌人> Spitter 文件夹中找到Spiller。

拖动的Spitter 到场景视图,并调整其位置和旋转,以满足您的需求。确保蓝色检测圆圈内有Ellen,以便Spitter 在您进入Play模式后立即看到Ellen 。这将节省您奔跑到可能更远的敌人的时间。

要调整“ 检测半径” ,请选择“ Spitter”,然后在“检查器”视图中找到“ Spitter Behaviour Script” 组件。
更改检测半径字段。在此示例中使用8,但根据需要调整大小以适合您的特定设置。

添加一个医疗箱
在“ 层次结构” 视图中,通过在搜索框中搜索“ Health Crate ”来找到HealthCrate 预制件

或在3DGamekit>预制件>Interactables> HealthCrate 文件夹中找到它

将HealthCrate 预制件从“ 层次结构” 视图拖到“ 场景” 视图中,然后将预制件放置在合适的位置。旋转并转换为您喜欢的。

在“ 场景” 视图中选择“ HealthCrate” 后,在“ 检查器” 视图中,注意“ Interact On Trigger触发时交互(脚本)组件” 。

该脚本组件允许HealthCrate 的名单上呼叫事件GameObjects ,让他们和HealthCrate之间的互动。在这种情况下,这会在玩家将Ellen移向其碰撞体区域时发生。
当前尚无GameObject或功能集可恢复Ellen的血量状况,因此,如果我们现在尝试与Play模式下的HealthCrate相撞,它将无能为力!
尝试一下,进入“播放”模式,让Ellen受Spitter伤害,并尝试与Health Crate碰撞以恢复她的健康。
Interact On trigger(触发时互动)
为确保艾伦得到完全治愈,需要将场景中的GameObject 添加到“触发时互动”中。
注意:如果愿意,可以将拖放方法用于以下步骤,但是我们将研究使用圆选择方法。
如果决定这样做,请确保从“层次结构”视图中使用当前场景中的艾伦,而不是从“项目”视图中使用预制件。
选择HealthCrate 如果在播放模式取消。
在On Enter()的空白Object字段中,按Circle Select 按钮

从顶部栏中选择“ 场景”选项卡。默认选择Assets。

搜索Ellen (如果您已重命名了玩家角色,则应搜索该名称)

选择“艾伦”(其余与特定部分有关)。
既然已经选择了Ellen作为与OnEnter ()进行交互的GameObject ,现在是时候选择恢复血量的函数了。
Ellen旁边的Interact On Trigger(Script)下拉字段当前显示No Function ,

在下拉菜单中,选择Damageable> ResetDamage()

现在,此步骤已将场景中的HealthCrate 和Ellen 链接在一起,以允许恢复血量 ,因为当Ellen进入碰撞体时它将调用ResetDamage ()。
现在测试您的关卡以观察Spitter造成的伤害,并与医疗箱碰撞将完全恢复她的血量。
16.场景传送
在场景中传送
要在场景中传送玩家,我们需要设置一个过渡。为此,我们将制造两个预制件:
TransitionStart
TransitionEnd
首先,我们需要设置过渡的起点:
在“项目”窗口中,转到“ Prefabs”>“ SceneControl”
查找TransitionStart 预制件
将TransitionStart 拖动到场景视图 。
将其放置在行走时玩家会碰触碰撞体(绿色框)的位置。在下面的示例中,我们将其放置在门的另一侧:

设置目的地;
将另一个TransitionStart Prefab从SceneControl 文件夹拖到“ 场景视图”中
在检查器中,
将其重命名为TransitionEnd :
现在,将两者链接在一起:
在层次结构中,选择TransitionStart GameObject
在检查器中,找到TransitionPoint 组件
将Ellen GameObject从层次结构拖到Transition Point组件的“ Transitioning Game Object(传送游戏对象)” 字段中
将Transition Type(传送类型)设置为相同场景

这样可以确保Ellen是唯一传送的对象,并且可以在同一场景中传送她。
现在让我们设置目的地:
将TransitionEnd GameObject拖到TransitionPoint 组件的DestinationTransform 插槽中。
将Transiton When(转换时间)设置为On Trigger Enter(触发输入)

在“触发输入”上表示仅当玩家进入对撞机而不是在按键时才激活过渡。如果你只当玩家按下键相互作用(E),将Transition When设置到Interact Pressed。
传送到另一个场景
为了使玩家过渡到新场景,我们需要两个预制件:
TransitionStart 与上一节中使用的预制件相同。它会将玩家“发送”到目的地。它包含一个Transition Start Component ,它定义了隐形传送开始的位置以及传送器将玩家带到的所有属性。将此预制件放在您要开始过渡的位置。
TransitionDestination 是可“接收”玩家的预制件。它包含过渡目标组件。将此预制件放置在您要完成过渡的其他场景中。
有关这两个组件的完整详细信息,请参阅3D游戏工具包资产包中包含的《组件参考指南》。
设置TransitionDestination
让我们先设置目标,以便在设置起点时拥有稍后需要的所有信息。要将过渡添加到场景,请打开该场景,导航到“项目”窗口,然后转到“ 预制件”>“ SceneControl”>“ TransitionDestination” 。将其放置在您的场景中,在您希望传送器通往的位置。
该TransitionDestinaton 预制包含一个场景转换目标组件:

首先,将Destination Tag(目标标签)设置一个字母。
只要是该字母中该场景中唯一的场景转换目标组件,哪一个字母都没有关系。
接下来,告诉它应该接收哪个GameObject。将玩家GameObject(Ellen)从“层次结构”窗口拖到“传送游戏对象”插槽中。

最后,确保目标场景在编辑器的“构建设置”中。
为此,请转到“ File”>“Build Settings” ,然后单击“ Add Open Scenes(添加打开的场景)” 。

设置TransitionStart
这些设置与上一节中的设置基本相同,但有一些更改:
将Transition Type(传送类型)设置为Different Zone(其他区域)
将“ 新场景名称” 设置为要发送到的场景。
将“ Transition Destination Tag(传送目标标签)” 设置为您在“ Transition Destination(传送目标)组件”中设置的目标标签字母。

按播放,然后转到传送的位置。您将会直接来到Zone1的起点!