TopDown Engine中文文档 (十三武器)

十二.武器

1.介绍 

 TopDown引擎包括一个通用的武器系统,允许你的角色装备一个武器(基于projectile ,melee,或任何你能想到的),切换到另一个武器,并使用它。引擎还包括一些武器的例子,你可以作为创建自己武器的基础。

2.CharacterHandleWeapon能力

 为了能够装备和使用武器,角色必须具有CharacterHandleWeapon 组件。从它的面板中,你可以选择为你的角色选择一个武器,定义它是否可以选择新的武器,并指定一个Weapon Attachment。这是对角色的转换武器附加。如果你没有指定一个,武器将附着到你的预制体的根节点。

然后,CharacterHandleWeapon 组件将做的是检查武器使用按钮的变化,如果它被按下/释放,将这些信息传输到当前装备的武器。从它的面板中,您还可以定义输入buffering 参数,这将影响输入请求持续的时间(它们所做的时间越长,系统将“记住”您希望另一种武器使用发生的时间就越长)。

3.武器类

 TopDown Engine中的所有武器都来自于Weapon 类。你当然可以改变它,但这就是所有的例子的工作方式。Weapon 类是要扩展的,并将定义许多所有或大多数武器共同的东西。用它作为基础,你就可以创造出一切,从猎枪到火箭发射器,还有武士刀或格斗枪。除了为动画、声音、状态管理提供坚实的基础外,它还允许您在子类中定义当使用武器时会发生什么,并从那里构建。您可以查看ProjectileWeapon 和MeleeWeapon 类,以说明如何从这个相同的脚本中创建不同的武器。

4.创建武器

要创建您自己的武器,您可以使用ProjectileWeapon 或MeleeWeapon 脚本扩展它们,或者创建您自己的Weapon 子类。无论如何,你都需要创建一个武器预制体。要做到这一点,您将需要一个游戏对象。在这个基础上,你可以选择有一个可见的武器或一个隐形的武器。

一旦你有了你的精灵,或模型,或空的游戏对象,只需添加你的武器(ProjectileWeapon, MeleeWeapon,或你自己的武器)脚本。从它的面板上,你将能够设置动画,声音,效果触发器当使用时,并指定当角色翻转时武器应该如何翻转。

以下是一步一步创建近战武器供参考:

1.创建空物体

2.添加MeleeWeapon 组件

Jekyll

3. 在MeleeWeapon面板中,设置以下参数:Trigger Mode为Semi auto,Damage Area Shape为Rectangle,Area Size为{1,1},Area Offset为{2,0}(以便损伤区域将在我们的角色前面激活),Active Duration为0.2(这是短攻击,基本上是打击)。然后将Damage Caused Target Layer设置为Enemies (以及任何您想要造成损坏的东西),并将Damage Caused设置为10。

4.将此游戏对象重命名为MeleeAttackWeapon 

5.将此游戏对象拖动为预制体

6.选择您的角色,并将新创建的预制体拖到其初始武器插槽(或者您可以通过脚本使用更改武器方法来装备它)

Jekyll

7. 就是这样,你现在有了一个武器。按播放,然后是E(默认情况下),你就会四处伤害敌人/物体。但到目前为止,你可能在攻击时并没有看到任何东西。让我们将一个动画绑定到那个攻击中。

8.选择角色的动画器,请拖动攻击动画到其中。

9.创建一个新的动画参数(参数面板右上角的小+按钮),在我们的示例中,我们将称之为“MeleeAttackStart”

Jekyll

10 .创建一个转换到该动画的转换。

Jekyll

11. 返回到武器的面板,并用动画参数的名称填StartAnimation 字段。在我们的例子“MeleeAttackStart”中。

Jekyll

12. 再次按播放,用你的武器攻击,你现在看到你的角色攻击。您可以添加其他动画,如攻击进行时、结束等。

5.导弹武器

 导弹武器将需要附加一个Object Pooler 组件。你需要在你的武器上添加一个SimpleObjectPooler,或一个MultipleObjectPooler,它不会射击任何东西。对象池是一种回收发射炮弹的方法,这样你就不会实例化/销毁对象,这对你的游戏性能更好。Simple object poolers 将允许你射击一种类型的炮弹(这只是大多数武器),但如果你想花哨,让它发射不同类型的东西,可以选择MultipleObjectPooler。在对象池的面板中,拖动射击的东西到GameObjectToPool 字段,定义池大小(游戏将存储和重用的项目数量,多少取决于您的游戏、关卡的大小等等。基本上的想法是,你希望你的池永远不会被完全使用,但也不要太大)。最后,您可以决定池是否可以扩展到容纳所有池已经使用但尚未回收的边缘情况。

此外,您还可以从面板中定义每发炮弹的扩散和数量。分布由最大角度(在所有3个轴上)定义,可以是随机的,也可以不是随机的。如果不是随机的,您可以将它与每次射击的多个导弹组合起来。

6.导弹

导弹武器通常会发射导弹。Projectile类将处理最常见的用途,从子弹到火箭弹。它将允许你以一定的速度和加速度向一个方向移动(影响或不受武器方向影响)炮弹。

对于大多数炮弹,你希望添加一个DamageOnTouch 组件,所以它们会伤害目标,如果你希望它们在击中之前被摧毁,也可以添加Health 组件。

7.时间

在创建武器时,时间是至关重要的,因为你会想要完美地同步武器的组件到动画。所有的武器都有两个变量,你可以直接从面板调整:DelayBeforeUse (输入注册和实际武器使用之间的时间——射击、斧头吊索等)和TimeBetweenUses (在另一种武器使用之前需要经过的时间(无论是自动的,还是通过重复按键等)。在这期间,该武器就是不会“射击”)。

此外,近战武器还有两个变量可以使用:InitialDelay (武器使用和损伤区域激活之间的延迟)和ActiveDuration (损伤区域将保持活动的时间)。最后两个参数特定于损伤区域,当然,您希望将这些值与您的DelayBeforeUse /TimeBetweenUses 同步,以防止冲突。

你也可以设置武器来防止攻击时的移动,以确保你的角色不会在攻击过程中四处奔跑。

8.组合武器

该引擎内置支持组合武器,而且它们超级容易创建。你可以看看KoalaSword 预制体,看看它们是如何工作的例子。

当重复使用它时,带有ComboWeapon组件的武器将连续循环通过添加到同一对象的所有武器,并在面板中从上到下。如果你已经检查了Droppable Combo选项,它将有可能“放下”组合,这意味着如果你不能在Drop Combo Delay中再次使用你的武器,你使用的下一个武器将是第一个武器。

要创建一个武器,只需添加多个武器组件(MeleeWeapons, ProjectileWeapons或您自己的武器扩展)到一个对象中,并像设置任何其他武器一样设置每个武器。然后添加一个ComboWeapon 组件。在它中,您只需要定义是否可以"放下"该组合,以及在多少延迟之后(以秒为单位)。可放下组合意味着,如果您在两次攻击之间等待的时间过长(超过指定的延迟),下一个攻击将再次是第一个攻击,否则它将移动到下一个武器。

9.二把武器

如果需要,你的角色可以同时装备多个武器。为此,您可以向其添加一个CharacterHandleSecondaryWeapon 能力。它的工作原理就像CharacterHandleWeapon (它扩展了它),但是不同的输入。如果需要,您可以创建更多类似的功能(CharacterHandleThirdWeapon,等等),只需覆盖HandleInput 方法,按照CharacterHandleSecondaryWeapon 示例的处理HandleInput 方法。

它还适用于背包问题。在您的InventoryWeapon上,您可以选择定义一个HandleWeaponID。这是对应于目标能力类中ID指定的Int。CharacterHandleWeapon 是1,CharacterHandleSecondaryWeapon 是2,如果你要创建更多的这些,你也需要覆盖和增加这个int。一个HandleWeaponID 为2的武器将自动进入你的CharacterHandleSecondaryWeapon。

10.武器激光瞄准器

Jekyll

 你可以在你的武器上添加一个WeaponLaserSight 。它当然更适合用于导弹武器,但没有任何限制。它要做的是它会在武器前投射一个激光器,就像一个激光瞄准器一样。您可以设置一个collision mask,以便激光器在遇到墙壁或平台时停止。您还可以从面板中自定义激光器的外观。

11.武器瞄准

 在你的武器中添加一个WeaponAim 组件(WeaponAim2D 或WeaponAim3D)将允许你控制它的方向,允许你的角色向上射击,向下射击,等等。从它的面板中,您可以定义其控制模式:

1.Off : 关闭武器瞄准

2.PrimaryMovement :武器将瞄准你移动运动键的任何方向。

3.SecondaryMovement : 该武器将瞄准你指向你的二次运动输入的方向。例如,默认情况下,这是xbox板上的右键。

4.PrimaryThenSecondaryMovement : PrimaryMovement 优先,然后SecondaryMovement 

5.SecondaryThenPrimaryMovement :SecondaryMovement 优先,然后PrimaryMovement 

6. Mouse : 该武器将指向鼠标指针的方向

7.Script :该武器不会通过常规输入进行瞄准,但将由另一个脚本控制(对ai、自动瞄准等有用)
这可以由每种武器来定义,但也可以在整个关卡对所有武器强制使用InputManager。只要设置它的WeaponForcedMode ,它将自动应用于玩家角色使用的所有武器。

你也可以定义旋转模式:

1.Free : 全360°旋转

2.Strict 4 directions : 上下左右

3.Strict 8 directions :上下左右(左上,右下等)

最后,您可以定义一个最大和最小的角度来限制运动,例如只允许向上射击,或者防止角色在其背部射击。

WeaponAim 组件还允许您在屏幕上显示武器的十字线。您需要指定显示模式(UI或场景)、游戏对象预制(资产中包含两个演示,称为SceneReticle 和UIReticle,但当然可以使用自己的演示)。您可以设置与十字线应该所在的角色的距离,或者它应该跟随鼠标,如果它应该在瞄准武器时旋转、死区(与十字线不会影响目标的角色的距离),以及鼠标指针是否应该隐藏。还有一些选项可以让场景UI十字线沿着斜坡移动。从面板中,您还可以定义如果有十字线活动,CameraTarget 应该如何移动。

12.自动瞄准

如果你想让你的角色自动瞄准敌人,你可以在你的武器中添加一个WeaponAutoAim2D 或WeaponAutoAim3D 组件。这将需要您的武器上的一个WeaponAim2D/3D组件,设置在脚本模式下(见上文)。在其面板中,您可以定义一个包含要查找目标的层的layermask ,以及一个可以考虑为obstacle。您将能够设置扫描的半径和频率,旋转设置、如何影响相机目标,设置aimmarker预制体以突出显示目标,并定义在找到目标、更改或没有找到更多目标时播放的反馈。您可以在Colonel场景中找到所有这些设置的例子 。

13.子弹

多亏了InventoryEngine,该引擎原生支持弹药和创造基于弹药的武器的可能性。你可以创建两种基于弹药的武器:基于背包的武器和常规的武器。

基于背包的武器将需要你的角色附加一个背包(通过CharacterInventory能力),而常规的武器将有无限的弹药,但两者都将允许你定义一个弹匣大小,重新装载,等等。

所有这些设置都可以设置在武器的面板上。在那里,你可以定义弹匣的大小,武器在弹匣为空时自动重新装载,或者玩家需要按下重新装载键,重新装载需要多长时间(几秒内),以及每次射击消耗的弹药。

勾选“Magazine based”复选框会告诉武器,它应该从角色的库存中提取弹药。要做到这一点,你还需要你的武器上的另一个组件,WeaponAmmo。在那里,你可以指定系统应该在库存中寻找的弹药的名称(例如“Bullets”),库存的名称是什么(通常是MainInventory ,但你可以选择任何你喜欢的名称,只要它设置在你的inventory上),武器的最大弹药数量,以及武器是否应该从背包中装载弹药。

14.武器和背包

如果您的角色正在使用背包,玩家现在可以使用输入快捷方式切换武器(循环浏览背包中所有可用的武器)。默认情况下,它被绑定到xbox板上的LB,或键盘上的t。
此外,如果你的角色有一个武器背包,并且该背包包含一个武器时,该武器将自动装备。

15.武器IK

 从武器的面板中,您可以定义左右的附着武器点,用于Unity的内置动画IK系统。这将把你的角色的手固定在你的武器的特定点上,当你解除武器时分离它们,并允许你的角色在你移动你的武器时自然地移动和瞄准。如果您想要一个准备使用的示例,Loft 演示中的演示角色是这样设置的。

 除了正确地创建你的角色,你唯一需要简化这个过程的是WeaponIK类,最好设置在与你的角色的动画器相同的层级。这个类允许3D角色抓住它当前武器的手柄,并查看它瞄准的地方。这涉及到一些设置。你需要在你的角色上有一个CharacterHandleWeapon 组件,它需要一个IKPass激活的动画器,动画器的avatar必须设置为humanoid。

对于想要暂时禁用IK的情况(例如冲刺期间),您可以在动画器上添加一个WeaponIKDisabler,并且可以指定一个bool动画参数名称,当为true时,应该导致IK关闭。

16.敌人武器

 你会在整个引擎的演示中发现许多被敌人使用的武器的例子。创建一个角色遵循与为玩家角色创建武器完全相同的过程。你通常不能简单地复制玩家武器并放在敌人身上。根据武器,您可能想要更改target layers、aim 方法等,但总体逻辑保持不变。

17.子弹显示

 AmmoDisplay 是一个可以添加到GUI的组件,让它显示进度条和文本,显示你的弹夹和库存还有多少弹药。只需将它添加到一个空的GUI对象中,在其面板中,您需要将它绑定到ForegroundBar和Text对象,并指定要显示该信息的角色(通常是Player1)。最后,选择您的GUIManager,并将您的AmmoDisplays 拖动到其AmmoDisplays 数组中。

18.武器模型

 虽然在很多情况下,你会希望将武器的逻辑和视觉效果放在同一个物体上,但有时你可能想要将两者分开。该引擎为基于库存的武器提供了两种不同的方法,你希望在装备不同的武器时能够激活不同的模型:

1.WeaponModel 类是一个可以放在角色下的对象上的类。从它的面板中,您可以设置应该激活此模型的武器的名称。此名称必须与武器的项目ID完全匹配。然后你可以让这个模型瞄准实际武器的目标方向,让它动画,重载WeaponUse,重新绑定IK,它甚至有MMFeedbacks在武器上。在这里,你将找到设置武器模型的简单步骤,你可以在Colonel 场景中找到它的一个例子。这就是Colonel步枪的工作原理,在Colonel预制体上寻找FBIAssaultRifleWeaponModel节点以供参考。

2.如果你不需要那么多的功能,你也可以简单地在你的角色上放置一个WeaponModelEnabler (在最上层节点,和能力、Health等一起)。它要简单得多,并且只需要您在角色上定义一个节点列表,您希望在装备某种武器时启用这些节点。要指定哪个武器对应于什么模型,您需要放置一个武器动画ID,它必须匹配您在武器上设置的WeaponAnimationID(在其动画参数面板下)。

这两个系统将允许您基于当前武器启用(子)模型,并且应该涵盖大多数情况。当然,你会想要选择其中一个,而不是两者都有。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值