原文下载
https://download.csdn.net/download/g313105910/19148579
目录
一、介绍
二、埃伦(主角)
三、敌人
四、健康管理
五、压板
六、伤害系统
七、移动平台
八、交互系统
九、存档系统
十、收集器
十一、刷敌人
十二、游戏工具包高级主题
十三、随机音频播放器
十四、脚本
十五、音频
十六、视效
十七、数据持久性
十八、对象池
十九、行为树
2D Game Kit允许你在Unity中创建2D平台游戏玩法和谜题,无需代码。以下是你可以在工具包中用来创建游戏的每个组件的文档。您将找到组件的功能定义以及这些组件中的设置。
如何使用这个文档
使用该文档的最好方法是像参考指南一样,根据组件或设置进行搜索,以了解更多信息。要学习如何使用Game Kit的基础知识,请查看入门指南,它将提供一个良好的使用工具包的基础。 这个项目中包含的Explorer示例游戏使用了我们为游戏玩法提供的所有组件。要想获得使用组件的灵感或例子,请查看场景文件夹中的场景1到5。 重要的术语和概念用链接突出显示,如果您想了解有关它们的更多信息
标准的运动控制器
移动 |
A向左移动D向右移动 |
跳 |
Space空格 |
蹲伏 |
S |
射击 |
O |
近战 |
K |
激活 |
E |
通过平台 |
S或Space空格 |
她使用Sprite Renderer, Animator, Capsule Collider 2D和Rigidbody 2D组件以及一些自定义脚本组合在一起。
角色控制器2D
角色控制器2D脚本用于在遵从物理原理的情况下移动Ellen。
Grounded Raycast Distance:
这些是角色可以站在上面的层。将其设置为平台层允许Ellen在该层上的任何其他东西上行走,比如地面
Grounded Raycast Distance:
地面光线投射距离:默认设置:0.1这决定了Ellen是否站在地面上,从她的碰撞器底部使用光线投射。增加这个数字会让艾伦认为地面更高,她的跳跃着陆会受到影响。降低这个数字会让艾伦认为地面更低,她会看起来像在坠落。
玩家输入
在这个项目中,你可以很容易地为一个玩家重新映射输入,玩家输入脚本告诉Unity的输入管理器,你的游戏应该使用什么控制。无论是键盘、鼠标还是Xbox One控制器,你都可以在这个组件上更改游戏的按键或按钮。请注意,这个组件的任何变化都是每个场景,因为你正在改变Ellen Prefab的副本(实例)。如果你的游戏中有多个关卡,并且你已经改变了Ellen的Player Input,你必须点击Ellen实例顶部的Apply按钮。这将改变设置上的原始预制和确保任何其他实例的Ellen在其他水平有相同的输入。
我们已经提供了一个方便的提醒,让你知道如果你正在看一个实例,如果你在播放器输入组件上看到这个警告,单击选择预制,这将带你编辑预制。
玩家输入的设置如下:
输入类型:
默认设置:鼠标和键盘输入类型的选项,选项是鼠标和键盘或控制器。这个套件的默认控制器类型是Xbox One。
● Pause(暂停):用于暂停游戏的按键。
〇键:按下键盘上的键进行动作。
〇控制器按钮:按下控制器按钮进行动作。
〇Enabled:动作是开还是关。勾选是开,未勾选是关。
● Interact(交互):用于与环境交互的按键或按钮。
〇键:按下键盘上的键进行动作。
〇控制器按钮:按下控制器按钮进行动作。
〇Enabled:动作是开还是关。勾选是开,未勾选是关。
● Melee Attack(近战攻击):按键或按钮用于艾伦摆动她的权杖。
〇键:按下键盘上的键进行动作。
〇控制器按钮:按下控制器按钮进行动作。
〇Enabled:动作是开还是关。勾选是开,未勾选是关。
●Ranged Attack(远程攻击):按键或按钮用于艾伦射击她的枪。
〇键:按下键盘上的键进行动作。
〇控制器按钮:按下控制器按钮进行动作。
〇Enabled:动作是开还是关。勾选是开,未勾选是关。
●Jump(跳跃):用于跳跃的按键或按钮。
〇键:按下键盘上的键进行动作。
〇控制器按钮:按下控制器按钮进行动作。
〇Enabled:动作是开还是关。勾选是开,未勾选是关。
●Horizontal(水平移动):按下键盘或模拟杆向左或向右移动。
〇正:按下键盘上的键向右移动字符(X轴为正)。
〇负:按下键盘上的键向左移动字符(X轴为负)。
〇控制器轴:控制器模拟杆或按钮左右移动。
●Vertical(垂直移动):按下键盘或模拟杆,使其蹲伏或向上看。
〇正:按下键盘上的键,使相机向上移动(Y轴为正)。
〇负值:按下键盘上的键使其蹲伏(Y轴为负值)。
〇控制器轴:控制器模拟摇杆或按钮,可仰视和蹲伏。
●Persistence Type and Data Tag(持久性类型和数据标签):有关数据持久性系统如何工作的信息,请参见数据持久性部分。是否启用近战攻击和远程攻击是该类持久化的数据。
参考:默认情况下你不需要调整这个。这些是所有的参考脚本需要功能,他们完全发现在艾伦预制件。
〇Sprite Renderer:用于确定角色面对的方向。
〇Damageable(可伤害性):用于确定角色受伤时的移动方向。
〇Melee Damager(近战伤害):用于在适当的动画中启用/禁用伤害。
〇Facing Left/Right Bullet Spawn Point(面对左/右子弹刷出点):用于射击时刷出子弹的位置。
〇Bullet Pool(子弹池):用于生成子弹。
〇Camera Follow Target(摄像机跟随目标):用于控制摄像机相对于角色的位置,这允许行为,如在快速移动时从角色保持领先。
移动设置:这些设置用于控制Ellen在地面上移动的速度。
〇Max Speed(最大移动速度):默认设置:7 Ellen能跑多快。
〇Ground Acceleration(地面加速度):默认设置:100 Ellen在地面上达到最大速度的速度。
〇Ground Deceleration(地面减速):默认设置:100 Ellen在没有输入时减速到停止的速度。
〇Pushing Speed Proportion(推箱速度比例):默认设置:0.5 Ellen推箱子时的最大速度比例。
空中设置:这些设置是为了控制Ellen在不落地(在空中)时的移动速度。
〇Airborne Accel Proportion(机载加速比例):默认设置:1 Ellen不接地时使用的地面加速比例。
〇Airborne Decel Proportion(机载减速比例):默认设置:0.5 Ellen不接地时使用的地面减速比例。
〇Gravity(重力):默认设置:38 Ellen向地面加速的速度。这也会影响跳跃高度。
〇Jump Speed(跳跃速度):默认设置:16.5 Ellen起跳速度。这将影响跳跃高度。
〇Jump Abort Speed Reduction(跳跃中止减速):默认设置:100当跳跃按钮被释放时,跳跃值被降低的速度。这将影响跳跃高度。
受伤设置:这些设置决定了Ellen受伤时的动作和出现方式。有关Ellen如何对损害作出反应的其他设置,请参阅本文件关于损害系统的章节。
〇伤害跳跃角度:默认设置:45当Ellen受伤时,她会从伤害的来源跳向空中。这是她从水平方向跳起的角度。
〇伤害跳跃速度:默认设置:8埃伦在受到伤害时的起跳速度
〇闪烁持续时间:默认设置:0.05当Ellen受伤时,她的精灵快速打开和关闭产生闪烁的效果。这个持续时间设置了精灵在闪烁时停留的时间。
近战设置:这些设置如何埃伦移动时,她摆动她的权杖。关于艾伦如何损害的其他设置,请看这篇文件中损害制度的章节。
〇近战攻击冲刺速度:默认设置:15 Ellen用权杖攻击时水平冲刺的距离。
〇Dash While Airborne:默认设置:启用一个可选的设置,在空中攻击时启用一个Dash。这将设置水平移动,而不是增加它,如果艾伦已经在空中水平移动,这个设置可能不会被注意到。
远程设置:这些设置与Ellen开枪时产生的子弹有关。
〇射击每秒:默认设置:2每秒可以产生的最大子弹数量。
〇子弹速度:默认设置:30子弹产生时的速度。
〇握枪超时时间:默认设置:1.5 Ellen停止射击后,还能坚持多长时间。
〇右子弹刷出点动画:默认设置:启用子弹刷出点动画跟随枪的位置,默认情况下Ellen资产在右边有一个子弹刷出位置。当她面对左边时,我们将镜像刷出点动画。如果你想添加自己面向左侧的动画精灵,请取消选中该框。
音频设置:我们随机播放Ellen的各种动作的音频,这样听起来就不会重复。这些是对RandomAudioPlayers的引用,它可以播放音频。这些不应该被编辑。
〇脚步声音频播放器:当Ellen做一个步骤时使用的随机音频播放器。
〇Landing AudioPlayer:当Ellen在空中落地时使用的RandomAudioPlayer。
〇Hurt AudioPlayer:当Ellen损坏时使用的随机音频播放器。
〇混战音频播放器:当艾伦进行混战攻击时使用的随机音频播放器。
〇远程攻击音频播放器:当Ellen做远程攻击时使用的随机音频播放器。
相机跟随设置:不是直接以艾伦为相机中心位置,而是动态跟随到艾伦的新位置。这些设置控制偏移量。
〇相机水平朝向偏移量:默认设置:2目标在Ellen前水平偏移量。
〇相机水平速度偏移量:默认设置:0.2根据Ellen的水平速度移动目标的数量。
〇相机垂直输入偏移量:默认设置:2目标垂直偏移量是基于玩家的输入。
〇最大水平阻尼时间:默认值:0.4目标从无偏移量到所需水平偏移量所需要的时间。
〇最大垂直增量阻尼时间:默认值:0.6目标从无偏移量到所需的垂直偏移量的垂直移动所需要的时间。
〇垂直相机偏移延迟:默认设置:1在目标开始垂直移动之前,需要按住向上或向下输入键的时间,以便玩家可以“向上”或“向下”。
杂项设置:用于其他设置的文件夹。
精灵最初的面孔:默认设置:禁用这是指精灵资产本身没有任何翻转。它可以用来确定子弹应该从哪个点产生。
敌人的行为
敌人行为组件适用于游戏中的两个敌人Chomper和Spitter。这两个敌人都使用相同的组件,只是使用了不同的设置。
●Sprite Faces Left:如果Sprite Faces Left,则选中复选框
●运动
〇速度:敌人的速度。
〇重力:它下落的速度。
●参考
〇射弹预制:敌人的射弹预制可以发射(只针对射弹敌人)。
●扫描设置
〇视野方向:敌人可以探测到玩家的方向。这是用场景视图中的绿色圆圈描绘的
〇View FOV:敌人的视野范围。这是用场景视图中的绿色圆圈描绘的
视野距离:敌人能看到玩家的距离。这是用场景视图中的绿色圆圈描绘的
〇目标消失前的时间:当玩家超出射程后,敌人停止追逐或搜索玩家的时间。
近战攻击信息,仅适用于近战敌人,如Chomper。
〇近战距离:敌人能够击中玩家的距离。
〇近战伤害:对敌人的伤害脚本。更多信息请参见损坏系统。
〇接触伤害:对敌人的接触伤害脚本,这个脚本通过接触敌人造成伤害。
〇攻击冲刺:当敌人攻击时,启动或禁用冲刺。
〇攻击力:当玩家受到攻击时所施加的力量,这是在玩家受到攻击后将其击退的原因。
远程攻击信息,仅适用于像Spitter这样的远程敌人。
〇射击起点:射出物被发射的位置。
〇射击角度:射出物从原点被射击的角度。
〇Shoot Force:投射物所受的力。
〇射速:射弹的速度。
●音频
〇射击音频:射击时使用的随机音频播放器。
〇近战攻击音频:当近战攻击发生时使用的随机音频播放器。
〇Die Audio:当敌人死亡时使用的随机audioplayer。
〇Foot Step Audio: RandomAudioPlayer用于敌人的脚步。
●Misc
〇闪烁持续时间:如果敌人的生命值大于1,当它被击中时,它将闪烁表示命中。该值表示闪烁持续的时间。
健康
生命拾取是当玩家走过它时能够提供生命值的预制件。它可以在Prefabs < Interactables中找到
●Health Amount(生命值):盒子所提供的生命值
●On Giving Health (关于提供生命值):当与盒子相撞时事件会触发,玩家将获得生命值。
压力板是自动设置的,可以检测到走到它上面的玩家,它会亮起来并播放声音。你可以连接压力垫来触发诸如开门之类的事件。
●Activation Type(激活类型):如何激活按钮。下面的选项将根据此设置更改。
〇Item Count:激活压力垫上的对象数量。
〇Mass(质量):激活垫子所需物体的重量。
●Required Count:在On Pressed & On Release中触发事件所需的物品数量。如果激活类型更改,则此更改为Required Mass。
(可选)当平台不被按下时,要改变的精灵。只有当Boxes选项拥有Sprite Renderer时才需要
●激活盒精灵:(可选)精灵切换,当平台按下。只有当Boxes选项拥有Sprite Renderer时才需要
(可选)将被推到pressuread上的盒子列表,当它们被推下去时,精灵将改变为那些在Deactivated Box Sprite和Activated Box Sprite中。
●On Pressed():当压力垫被按下时发生的事件,这取决于正确的Required Count或Required Mass
●On Release():当压力垫释放时发生的事件,这取决于正确的Required Count或Required Mass
套件中的损害系统由两个组件组成:损害器和可损害脚本。添加一个Damager脚本到一个对象,使它能够对任何具有damable组件的对象造成损害,只要它们的设置匹配
伤害
“损坏组件”具有与“可损坏组件”和“不可损坏组件”发生碰撞的事件。生命值的计算是自动完成的,这些事件是用来触发游戏玩法改变或视觉效果。Damager组件不需要碰撞器,它会在场景视图中显示一个盒子小装置,你可以用它来调整它的大小和位置。
●伤害:它将对一个可伤害的(如Ellen或Chomper)造成的伤害。
●偏移量和大小:这是定义Damager碰撞框的两个参数。这是在场景视图的尖峰上显示的外框,当它碰撞时会造成损坏。
●基于精灵朝向的偏移:这个设置允许损害器根据精灵朝向的方向改变位置。这是在Ellen上使用的,可以让损害者根据她面对的方向向左或向右撇。
●Sprite Renderer:上述设置使用的Sprite Renderer。
●Can Hit Triggers:切换Damager是否会与被选中的触发器发生冲突,或者完全忽略被选中的触发器。
●Force Respawn:如果启用,包含damage的物体将立即重生到最近的检查点(Acid预制在玩家掉进水里时使用这个功能)。
忽略无敌:如果开启,伤害者仍然会对伤害值进行“攻击”,但不会移除生命值(Acid会使用这个属性,这样玩家就会一直重生,即使他们在之前的敌人攻击中是无敌的)。
●可命中的层:伤害者会造成伤害的层。没有被选中的图层将不会受到伤害。
●On damage Hit:当物体被击中并且有一个damage组件时,事件将在这里播放。
非伤害攻击:当物体被击中但没有伤害组件时,事件将在这里播放。
可被损坏的
可损坏组件接收对象与附加在其上的Damager组件碰撞造成的损坏。当受到伤害、生命值恢复、生命值改变或生命值完全耗尽(死亡)时,会发生事件。与Damager相反,damable组件依赖于附加在同一个游戏对象上的碰撞器,所以除了向对象添加damable Script之外,不要忘记添加碰撞器来定义可命中区域。
●Starting Health:健康级别。伤害者将在每次攻击时移除他们的生命值。当这个值达到0时,可伤害物品就会死亡。
●伤害后无懈可击:这种伤害在冲击后的一段时间内变得无懈可击。
●刀伤持续时间:在受到伤害后认为刀伤不受伤害的时间(仅适用于之前设置)。
●Disable On Death:该设置将在死亡时禁用GameObject。
●中心偏移:用于定义可损坏物体的中心位置(偏移(0,0,0)表示它位于游戏对象的位置)。用于计算到Damager的距离。
●On Take Damage:当物体受到伤害时触发事件。
●On Die:事件触发时的对象
获得生命值:当一个物体获得新的生命值时触发的事件。
●持久类型:参见持久数据
●数据标签:参见持久数据
检查点
检查点在Prefabs < SceneControl文件夹中
每当玩家进入一个检查点碰撞器时,这个检查点就会被激活。当他们掉进水里(或被任何带有原力重生设置的伤害者击中),他们将在检查点重新出现。注意:玩家会重新出现在游戏对象的位置上,所以要确保它在地面上
要在场景中创建一个移动平台,请将移动平台预制件Prefabs < Interactables从项目视图拖到场景视图中。它包括一个移动平台脚本,Box Collider 2D, Rigidbody 2D,平台效应器2D和一个平台捕获脚本。
平台捕手脚本允许平台上的对象自由移动。而且不需要调整。在场景视图中,你会看到红色的虚线和变换工具在末端,这表示平台将采取的路径和它的目的地。在任意方向拖动变换工具来改变路径和目标。
●平台捕手:自动在平台上找到平台捕手脚本,无需更改。
●预览位置:允许你浏览和预览平台将去的场景视图。
●开始移动:当启用时,平台将在关卡加载时开始移动。如果未勾选,则需要由事件触发。
〇When becoming visible:该选项仅在平台设置为Start Moving时才会出现。如果这是启用的,平台将只在屏幕上可见时才开始移动,而不是在关卡加载时。
●循环:定义平台到达路径终点时的反应。
〇BACK_FORTH:平台在起点和终点之间来回移动。
〇LOOP:一旦平台到达路径的最后一个点,它将直线移动到起点,重新开始循环,形成一个循环。
〇ONCE:到达终点时平台停止。
●速度:默认设置:2平台移动的速度(单位为每秒)。
●添加节点:此按钮将添加另一个节点,或目标点到您的平台的路径。平台从一个节点移动到另一个节点。
〇节点0:表示平台位置。不能删除。没有什么立场是不能改变的。
■等待时间:平台等待移动到下一个节点的时间。
〇节点1:第一个路径和目的地,默认情况下总是包含。
■位置:节点的位置(本地空间)。
■删除:删除节点的按钮。
■等待时间:平台等待移动到下一个节点的时间。在场景视图中可以看到这样一个带有两个节点的平台。
2D碰撞系统
玩家可以通过多个名为InteractOn*的组件与游戏对象进行互动:
●InteractOnCollision2D
●InteractOnTrigger2D
●InteractOnButton2D
交互依赖于拥有Collider 2D组件的对象。碰撞器是物体周围的一个看不见的区域,可以检测到什么东西接触或进入它。我们在套件中使用的主要是Box (Box Collider 2D), Capsule (Capsule Collider 2D)和Circle (Circle Collider 2D)。这些都在套件中提供的各种预码件中为你设置好了。如果你想在对象上添加新的交互类型或创建自己的交互类型,取决于你使用的是以下哪个InteractOn组件,你必须注意Collider上的Is Trigger复选框,你想让交互的对象。我们将注意到Collider将需要处于一个特定的InteractOn组件的状态。
碰撞2D互动
这用于在物体碰撞器接触时触发事件。
●脚本:正在使用的脚本名称(不能更改)。
●图层:只有选中图层上的对象才会触发事件。
●On Collision():这里列出的事件将在属于设置图层的对象发生碰撞时发生。(如果你自己设置,不需要在碰撞器上启用is Trigger)
互动触发2D
当一个对象进入碰撞器时触发事件,当一个对象存在碰撞器时触发更多事件。(如果制作自己的,请确保碰撞器组件上启用Is Trigger)。
●脚本:正在使用的脚本名称(不能更改)。
●图层:只有选中图层上的对象才会触发事件。
●On Enter():这里列出的事件将发生,当一个对象属于设置层进入触发器。
●On Exit():这里列出的事件将发生,当一个对象属于设置层退出触发器。
●库存检查:这允许你确保事件只发生在当一个进入触发器的对象有一个对象在它的库存。例如,当玩家进入触发区域时,只有在他们的库存中有钥匙时才会打开一扇门。
〇Size:默认设置为0,增加这个数字来增加触发器应该期望的库存数量。
元素0:第一次库存检查。
■库存物品(Inventory Items):它期望在与它碰撞的对象库存中的对象。
●大小:你希望触发对象在其库存中携带的物品数量。
元素0:需要的第一个库存物品。这必须匹配预期的名称,这些名称列在库存系统部分。
●On has Item():当对象持有库存物品中设置的所有物品时触发事件。
●On Does Not Have Item():当物品不包含所有物品时触发事件。
按钮互动2D
当一个对象在触发区域内,玩家按下游戏中的互动按钮时,这用于触发事件(关于互动按钮的更多信息,请参阅玩家输入部分)。(如果你自己制作,请确保在Collider组件上启用Is Trigger)
●脚本:正在使用的脚本名称(不能更改)。
●图层:只有选中图层上的对象才会触发事件。
●On Enter():这里列出的事件将发生,当一个对象属于设置层进入触发器。
●On Exit():这里列出的事件将发生,当一个对象属于设置层退出触发器。
●库存检查:这允许你确保事件只发生当一个对象进入触发器和按下交互按钮有一个对象在其库存。例如,当玩家进入触发器并按下互动区域时,只有在他们的库存中有钥匙时才会打开一扇门。
〇Size:默认设置为0,增加这个数字来增加触发器应该期望的库存数量。
元素0:第一次库存检查。
■库存物品(Inventory Items):它期望在与它碰撞的对象库存中的对象。
●大小:你希望触发对象在其库存中携带的物品数量。
元素0:需要的第一个库存物品。这必须匹配预期的名称,这些名称列在库存系统部分。
●On Button Press():当交互按钮被按下时触发的事件。
存货系统由两部分组成,存货控制部分和存货项目。库存控制器应该添加到持有库存的对象中。应该将库存物品脚本添加到正在收集的物品中。例如Ellen(库存控制器)将收集一个Key(库存项目)库存控制器能够自动收集与碰撞器的接触库存项目,并定义了发生的行动,当给定的对象被接收或删除。
存档控制器
这个组件有一个条目的每个项目,可以携带在您的库存。组件可以存在于角色、箱子或商店中。
库存事件:事件列表发生在特定的对象添加到库存。增加这里的数字以添加新的事件(提示:您可以通过右键单击列表中的名称并选择delete Array Element来删除事件)。
〇键:是代表物品的唯一标识符,例如钥匙,枪,职员。这必须与您希望收集的物品上的物品清单组件中的密钥相匹配。库存只能保存每个对象的一个实例;如果一个具有相同Key的对象已经在库存中,库存控制器中的添加事件将不会被调用。
〇OnAdd:当物品被添加到库存时触发的事件。
〇OnRemove:当物品从库存中移除时触发的事件。
〇数据设置:参见Persistent Data文档获取更多信息。
不要混淆道具的Key(游戏邦注:即分配给道具的唯一标识符)和Key(游戏邦注:我们喜欢在游戏中使用的收集对象)。文档中使用粗体表示惟一标识符,以避免混淆。
物品库存
任何可以在库存中携带的项目都需要一个库存项目组件。这指定项目的关键,一个音频剪辑和哪个层可以拾取项目。InventoryItem是添加到游戏对象中的组件,代表该项目。它还需要一个圆形碰撞器2D,如果缺少将自动添加一个。该碰撞器被设置为触发器,用于检测玩家何时触摸对象。游戏对象的状态(活动或不活动)被保存,所以当场景重新加载和玩家重新进入区域时它保持不变。
●库存键:物品的唯一名称(如Key1),用于跟踪物品是否已经拥有。
●层:收集物品的对象所在的层。
●Disable On Enter:该设置在对象被收集后禁用该对象。
●剪辑:收集项目时播放的音频剪辑。如果为空,则不会播放剪辑。
●数据设置:参见Persistent Data文档获取更多信息。
代码所在位置,如果想深入了解该功能是如何实现的,可以查看脚本代码
该组件用于根据已收集的物品数量改变对象的精灵。
一旦收集了所有的项目,就会调用On Unlocked函数。在下面的示例中,要收集的三个库存项是Key1、Key2和Key3。每当收集到库存中的一个道具时,精灵便会发生改变。
Interact On Trigger 2D和Interact On Button 2D也可以检查该组件是否满足要求。
●Required Inventory Item Keys:需要收集的物品的Keys列表。一旦ALL被收集,它将触发On Unlocked事件。
〇Size:需要收集的条目数量。大小增加了下面元素的数量。
〇Element:被收集对象的Key。
●解锁状态精灵:收集道具时将显示的精灵列表。精灵会按顺序改变。
〇大小:精灵插槽的数量。
〇元素:收集物品时改变对象外观的精灵。
●Key Director Trigger:如果设置了一个Director序列,则会触发一个Director序列。
Character Inventory:持有库存控制器的对象,该组件用于跟踪集合。
●On Unlocked():当所有道具都被收集并改变精灵时事件会触发。
●数据设置:参见Persistent Data文档获取更多信息。
敌人预制体在Prefabs < Enemies中,这将控制产生更多的敌人在您的场景中。
●预制件:敌人的预制件将被生成。
●初始池数:这决定了将在池中持有的敌人数量。在这里输入一个很好的值等于需要生成的并发敌人的数量。
●Total Enemies to be spawn:产卵者将产卵的敌人数量,直到它停止产卵的敌人。
●Concurrent Enemies to be spawn:产卵者同时在世界上产卵的敌人数量。例如,如果这是5个,总共10个敌人,产卵者将产卵5个敌人。一旦一个被杀死,它会产生一个新的,除非它已经产生了10个。
刷出区域:这是刷出点周围刷出区域的范围。敌人将在该区域内随机产生。这可以通过刷出点周围的白色矩形小工具在场景视图中显示出来。
●Spawn Delay(刷出延迟:从一个敌人死亡到下一个敌人出现的时间间隔。)
●Removal Delay(移除延迟:敌人被送回池中的时间)
后面章节包含了关于Game Kit系统的更深入的信息,可能需要更多的Unity知识,一些主题需要c#知识。
这个脚本允许您从用户分配的剪辑列表中选择一个随机的声音播放。你可以看到它被用来控制Ellen预制组件上的不同声音(在Ellen的SoundSources子游戏对象下检查)。例如,查看FootstepSource,您可以看到它定义了一个包含四个脚步声音的列表,脚步将随机选择这些声音,并添加了音调随机化。这个例子还包括使用覆盖每个特定的瓷砖-一个覆盖的异形废墟瓷砖播放不同的脚步声,如果艾伦走在草地表面。
脚本,RandomAudioPlayer PlayRandomSound函数是由其他脚本调用时需要播放声音(例如引发的脚步声音PlayFootstep在该函数,函数本身是由动画剪辑的帧调用脚与地面接触的地方。)这个功能可以使用TileBase去选择覆盖声音(游戏邦注:例如脚步将使用玩家所开启的当前表面,子弹碰撞将使用它刚刚碰撞过的表面的Tile)。
AudioSurface是一个脚本可以添加到任何对象,不是tilemap(如移动或转移平台,移动框等),允许您定义瓷砖应该使用音频播放器时寻找一个覆盖的声音(如一块石头盒子会使用一个AudioSurface外星人瓷砖瓷砖的设置,所以走在上面会触发“石阶”的声音,而不是正常的“地面”的声音。)
此组件用于从池中生成VFX预制件,停用它们,并在生命周期过期后将它们返回到池中。
VFXController是项目文件夹中的一个资产(在资源文件夹内),它允许你列出游戏将使用的所有视觉特效。它将创建一个使用这些视觉特效的实例池,移动在游戏开始时实例化视觉特效预制的成本,而不是每次使用它们。像PlayerController或StateMachineBehaviour TriggerVFX这样的脚本将通过名称触发这些VFX。
和音频播放器一样,它也允许你定义每个贴图的覆盖。例如,你可以为每个脚步设置一个覆盖的视觉效果,这取决于脚步在哪个表面上着陆。(对于VFXController附带这个项目,你可以看到一个例子在DustPuff视效,使用一个覆盖当玩家走在石头)最重要的砖是由触发视效的脚本(例如脚步将当前的表面,一颗子弹击中表面会通过瓷砖的表面,可以在非贴图对象上设置覆盖贴图;请参考声音文档Sounds.txt,了解如何设置覆盖游戏对象对应的内容。
数据持久性系统允许你在游戏过程中保存一些数据,保存一些关于玩家已经做了什么的信息。如果没有它,因为每个区域都是一个新场景,进入一个区域将加载该区域的“默认”状态(游戏邦注:如它是在编辑器中设计的),但玩家所采取的任何永久行动(如抓钥匙或武器)都将被“取消”。
使用编辑器
数据系统通过一个名为IDataPersister的脚本接口工作。
实现这个接口的对象(如内置的InventoryItem, HubDoor, PlayerInput等)可以从PersistentDataManager中读写数据
实现该接口的单行为在检查器的底部有一个Data Settings折叠页。设置包括:
数据标签:这是对象的唯一标识符,由管理器用来将数据链接到该对象。它可以是任何东西:一些内置组件使用一个自动生成的唯一ID,但它也可以是一个手动输入的名称,如“Zone_3_key”或“Quest_Item_Card”等。
持久性类型:对象可以是:
〇Don't Persist:允许禁用持久性,对于需要在场景改变时重置的对象很有用(例如,你可能想在重新启动关卡时再次关闭一扇门)
〇只读:只能读数据,不能写数据。一种使用方法是让一个只写的对象(见下面)具有相同的数据标签。这个对象
将使用另一个对象为该标签写的数据,但不能重写它。
〇Write Only:只能写数据,不能读取数据。请参阅上面的只读使用示例。
〇读写:最常见的使用情况,对象读取和写入其给定的数据标签数据
数据保存加载周期
SaveData对场景中IDataPersister的所有实例在场景过渡出来之前被调用。LoadData在加载新场景后,在场景中IDataPersister的所有实例上被调用。可以在任何时候通过调用persistentdatammanager . setdirty (this)来手动保存数据。
代码中的使用示例
在代码中使用数据管理器的方式是,在启用/启动数据管理器时读取相关数据并对其作出反应。例如,库存项将其状态写入持久化数据(活动或非活动)。因此,当场景加载时,库存项将检索与其标签相关联的数据。如果保存了一个假值,这意味着对象已经被检索,它可以禁用自己。另一个例子是保存状态的门。当场景加载并读取数据时,它可以将自己设置为所需的状态(例如打开/关闭)。
场景与smb
SceneLinkedSMB是一个类,它扩展了statemachinebehaviour的工作方式。它允许Animator状态机中的Behaviour保持对MonoBehaviour的引用。
虽然scenelinkedsmb可以在任何需要引用特定MonoBehaviour的地方使用,但它们的设计理念是将逻辑和功能分离。
动画控制器包含一个状态机,它是控制执行流的理想状态机。
使用scenelinkedsmb,你可以调用MonoBehaviour上的公共函数,允许它控制功能,因为它可以更容易地获得场景引用。通过这种方式,scenelinkedsmb可以控制作为状态机的一部分的逻辑和monobehaviour,它们被链接到控制功能。
使用SceneLinkedSMB
要使用SceneLinkedSMB编写一个新的行为,你需要:
●让你的新类继承SceneLinkedSMB。由于类是Generic,您需要指定它将持有的Monobehaviour的类型。例如:public class EnemyAttackState: SceneLinkedSMB
●使用该状态初始化每个对象的动画。在上面的例子中,我们可以在Enemy类的Start()函数中添加以下一行:SceneLinkedSMB
●覆盖任何你需要的状态函数。更多的功能被添加到SceneLinkedSMB,以允许更具体的控制何时功能发生。在你的类中,你可以访问一个名为m_MonoBehaviour的受保护成员,它与类的泛型类型参数具有相同的类型。继续我们的例子,m_MonoBehaviour将是敌人类型。
例子
Enemy.cs
public class Enemy: MonoBehaviour
{
Animator animator;
void Start()
{
animator = GetComponent();
SceneLinkedSMB.Initialise(animator, this);
}
public void TrickerAttack()
{ // ...
}
}
EnemyAttackState.cs
public class EnemyAttackState: SceneLinkedSMB
{
public override void OnSLStateEnter (Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
// m_MonoBehaviour is of type Enemy m_MonoBehaviour.TrickerAttack ();
}
}
Gamekit为其某些系统使用了可扩展的对象池系统。下面的解释只适用于那些希望扩展系统以供自己使用的人,而不需要使用Gamekit的知识。
为了扩展对象池系统,必须创建两个类——一个继承自ObjectPool,另一个继承自PoolObject。继承自ObjectPool的类是池本身,而继承自PoolObject的类是池中每个预制件的包装器。这两个类由泛型类型链接。ObjectPool和PoolObject必须具有相同的两种泛型类型:继承自ObjectPool的类和按此顺序继承自PoolObject的类。这很容易用一个例子来说明:
public class SpaceshipPool: ObjectPool
{
…
}
public class Spaceship: PoolObject
{
…
}
这样一来,池就知道它包含的对象的类型,而对象也知道它们所属的池的类型。这些类可以有第三种泛型类型。只有当您希望为PoolObject的WakeUp函数提供一个参数时,才需要这样做,当PoolObject从池中取出时,该函数将被调用。例如,当我们的飞船被唤醒时,他们可能需要知道他们有多少燃料,所以可以有一个额外的浮子类型如下:
public class SpaceshipPool: ObjectPool
{
…
}
public class Spaceship: PoolObject
{
…
}
默认情况下,PoolObject有以下字段:
●inPool:这个bool值决定当前池子对象是在池中还是醒着。
实例:这个游戏对象是这个PoolObject包装的实例化预制件。
objectPool:这是这个PoolObject所属的对象池。它具有与该类的ObjectPool类型相同的类型。PoolObject还具有以下虚函数:
●setreference:在PoolObject第一次创建时调用。它的目的是缓存引用,这样当PoolObject被唤醒时就不需要收集它们,尽管它可以用于任何其他一次性设置。
●WakeUp:当PoolObject被唤醒并从池中收集时调用。它的目的是在每次使用PoolObject时执行所需的任何设置。如果给类提供了第三个泛型参数,那么可以使用该类型的参数调用WakeUp。
●Sleep:当PoolObject被返回到存储池时调用。它的目的是在使用PoolObject之后执行任何需要的清理。
●ReturnToPool:默认情况下,它简单地将PoolObject返回到池中,但是如果需要其他功能,它可以被覆盖。一个对象池是一个MonoBehaviour,因此可以添加到游戏对象中。默认情况下,它有以下字段:
●Prefab:这是一个对Prefab的引用,它将被实例化多次来创建池。
InitialPoolCount:将在Start方法中创建的PoolObjects的数量。
Pool:一个PoolObjects的列表。ObjectPool还具有以下功能:
●Start:这是初始池创建发生的地方。您应该注意,如果ObjectPool中有Start函数,它将有效地隐藏基类版本。
●CreateNewPoolObject:当创建poolobject时调用,调用它们的setreference函数,然后调用Sleep函数。它不是虚的,所以不能被覆盖,但是它是受保护的,因此可以在继承类中调用。
Pop:调用此函数从池中获取一个PoolObject。默认情况下,它将搜索第一个inPool标志设置为true的对象并返回它。如果none为真,它将创建一个新的并返回它。它将在将要返回的任何PoolObject上调用WakeUp。这是虚拟的,可以被覆盖。
●Push:调用此函数将一个PoolObject放回池中。默认情况下,它只是设置inPool标志并在PoolObject上调用Sleep,但它是虚拟的,可以被覆盖。关于如何使用对象池系统的完整示例,请参见BulletPool文档和脚本。
子弹池
子弹池MonoBehaviour是一个子弹对象的池,每一个都包装了一个子弹预制的实例。BulletPool同时用于Ellen和敌人,但使用方式略有不同。对于Ellen,有一个BulletPool MonoBehaviour附加到父游戏对象,子弹预制设置为它的预制字段。BulletPool的另一个用途是在EnemyBehaviour类中。它使用GetObjectPool静态函数来使用BulletPools,而不需要主动创建它们。
BulletPool类有以下字段:
●预制:这是你希望使用的子弹预制。
●初始池数:这是多少子弹将创建在池开始。它应该和你期望一次使用的数量一样多。如果需要更多,它们将在运行时创建。
●Pool:这是Pool中的子弹对象。这在检查器中没有显示。
BulletPool类具有以下功能:
●Pop:使用此功能从池中获得一个子弹对象。
●Push:使用此功能将子弹对象放回池中。
●GetObjectPool:这是一个静态函数,将找到一个适当的子弹池给定的特定预制。当从池中获得子弹时,它以子弹对象的形式出现。
BulletObject类有以下字段:
●InPool:这个特定的子弹是否在池中或被使用。
●实例:实例化的预制件。
ObjectPool:对该子弹对象所属的子弹池的引用。
Transform:对实例的Transform组件的引用。
●Rigidbody2D:对实例的Rigidbody2D组件的引用。
SpriteRenderer:对SpriteRenderer组件实例的引用。
Bullet:引用实例的Bullet脚本。
BulletObject具有以下功能:
●WakeUp:这是由弹池调用Pop函数时调用的。
●Sleep:当Push函数被调用时,由BulletPool调用。
●ReturnToPool:当你完成一个特定的项目符号时,这个应该被调用。它将调用其BulletPool的Push函数,从而调用其Sleep函数。
注意:这是一个只使用脚本的系统,你至少需要了解脚本和c#如何在Unity中工作的基本知识,才能理解它是如何工作和如何使用它
顾名思义,行为树是一种使用动作树编码行为的方法。它们在Game Kit中用于控制AI的敌人行为和boss战斗序列。
下面是一个行为树的可视化例子:
理论
在游戏的每次更新过程中,这棵树都是“打勾”的,这意味着它将遍历根节点的每个子节点,如果该节点有子节点,则进一步向下,等等。
每个节点都有关联的动作,并将向其父节点返回三种状态之一:
●Success:节点成功完成任务。
●Failure:节点任务失败。
继续:节点还没有完成任务。
返回的状态由每个节点的父节点以不同的方式使用。
例如:
●如果当前子节点返回Failure或Success,选择器将使下一个子节点处于活动状态;如果当前子节点返回Continue,则保持当前子节点为活动状态。
测试节点将调用子节点,如果测试为真则返回子节点状态,如果测试为假则返回失败而不调用子节点。
游戏装备实现
行为树在游戏工具包中的使用方式是通过脚本。下面是一个非常简单的行为树的例子:
首先,我们需要使用BTAI添加;在文件的顶部
Root aiRoot = BT.Root();
aiRoot.Do(
BT.If(TestVisibleTarget).Do
(
BT.Call(Aim),
BT.Call(Shoot)
),
BT.Sequence().Do(
BT.Call(Walk),
BT.Wait(5.0f),
BT.Call(Turn),
BT.Wait(1.0f),
BT.Call(Turn))
);
aiRoot应该作为成员存储在类中,因为您需要在Update函数中调用aiRoot. tick(),以便可以执行Tree操作。
让我们来看看更新将如何在airroot. tick()中进行:
首先,我们测试TestVisibleTarget函数是否返回true。如果是,它将继续执行子进程,这些子进程将调用Aim和Shoot函数
●如果测试返回false, If节点将返回Failure,根节点将转到下一个子节点。这是一个序列,它首先执行它的第一个子节点
〇调用Walk函数。它返回Success,以便序列将下一个子节点设置为活动的并执行它
〇执行“Wait”节点。因为它必须等待5秒,并且是第一次调用,所以它还没有到达等待时间,所以它将返回Continue
〇当序列从它的活动子节点接收到一个Continue状态时,它不会改变活动子节点,所以它将在下一次更新时从该子节点开始
●一旦Wait节点更新到足够的时间到达它的计时器,它将返回Success,这样序列将转到下一个子节点。
节点表
顺序序列执行
子节点一个接一个。如果子进程返回:
成功:该序列将在下一帧的下一个子帧上打勾。
失败:序列将返回到下一帧的第一个子序列。
继续:序列将在下一帧再次调用该节点。
随机序列
每次调用它时,从它的子列表中随机执行一个子节点。您可以在构造函数中指定一个权重列表,以int数组的形式应用于每个子对象,以使某些子对象更容易被选中。
选择器
按顺序执行所有子节点,直到返回Success,然后退出,不执行其余的子节点。如果没有返回成功,则该节点将返回失败。
呼叫
调用给定的函数,它总是返回Success。
如果
调用给定函数。
如果返回true,则调用当前活动的子对象并返回其状态。
否则,它将返回Failure而不调用子节点
循环
只要给定的函数返回true就继续(所以当树被选中时,它将再次从该节点开始,而不计算之前的所有节点)。
孩子们将一个接一个地被处死。
当函数返回false并且循环中断时将返回Failure。
条件
如果给定的函数返回true,则该节点返回Success;如果给定的函数返回false,则返回Failure。
当与依赖于其子节点的结果的其他节点连接时有用(例如Sequence, Selector等)。
重复
将连续执行所有子节点的给定次数。
始终返回Continue直到到达计数,在计数中返回Success。
等待
将返回Continue,直到到达给定的时间(从第一次调用时开始),然后返回Success。触发
允许在给定的动画器中设置一个触发器(如果最后一个参数设置为false,则取消触发器)。总是返回成功。
SetBool
允许在给定的动画中设置一个布尔参数的值。总是返回成功
SetActive
设置游戏对象的活动/非活动状态。总是返回成功。