随便看看官方教程 - FPS Microgame

0x00

Unity 推出的一套免费教程,看了以后我差点就以为我能做游戏了!传送门!!!

这个教程属于非常基础的给入门的小朋友学习的工程,虽然流程很短,项目也很小巧,但贵在完整。

0x01

天空盒 「Window」-「Rendering」-「Lighting Settings」中,设置场景中显示的天空盒。

可以在这个(网站)[https://hdrihaven.com/hdris/category/?c=all&o=popular]上下载,自己做成材质放进来。

其实我是来学习目录结构的!

在这个项目中,使用的嵌套 prefab,将一个实体拆分得足够细致,基本的原则是将脚本挂载在根节点上,模型的结构在子对象中体现出来,而一些标记模型位置的空对象与模型子对象同级。

不仅如此,使用了嵌套 prefab 就可以将很多比如粒子系统制成 prefab 嵌套在不同的 prefab 对象中去。

prefab 变体(prefab variant)是用来通过现有的 prefab 创建的变种,可以简单的理解为对覆写的 prefab 进行了保存,因此在编辑 prefab 变体时的规则与在 Hierarchy 中操作 prefab 实例相同,可以修改参数添加子对象,但不能删除修改 prefab 中对象的结构。

工程中还使用了 proGrids 和 Navigation,教程中都有比较详细的使用方法。proGrids 可以更加方便地放置 GameObject,构成关卡;Navigation 来生成简单的寻路系统,甚至也可以自定义路径类型,让 AI 与其进行交互。

0x02

debug 的方式,使用一个单独的 debugHandler 脚本来在需要报错的地方处理报错,函数体内使用 UNITY_EDITOR 来判断是否执行,这样在发布的包中对性能的影响是一次空函数的调用。

  1. 看看 Player 结构啊:

玩家角色 prefab 的结构如下:

玩家控制的角色脚本入口为 PlayerCharacterController.cs 组件,保存角色行为的主循环

  • PlayerInputHandler.cs 组件,Unity 中的操作配置在 「Project Settings」-「Input」中,

Horizontal 和 Vertical 是对移动进行的配置,可以看到此处是对 left 和 right 按键进行的配置,同样还有同名的配置是针对 a 和 d 按键。

工程中为了将此配置与逻辑分离,专门使用了 GameConstants.cs 对字符串常量进行定义。

为了对操作进行统一控制,在游戏中对“鼠标指针的锁定状态”和“游戏状态”求与获得控制变量。

  • Health.cs 组件

定义了血量相关的属性与方法,提供了 3 个事件,分别在受伤,治疗和死亡时可以触发。可以设置伤势严重程度,用来在 UI 进行表现。

使用了一个 UnityAction 的泛型类来处理事件,是在 UnityEngine.Events 中定义的。

相应的方法,可以在被挂载的实体控制器中使用。

  • PlayerWeaponsManager.cs 组件

WeaponCamera 仅用来显示第一视角的武器,将摄像机的 Clear Flags 设置为 Depth only 表示不,并将 Culling Mask 设置到 FirstPersonWeapon 层,即为武器所对应的层级。这样,由于 WeaponCamera 只显示武器相关,避免了在武器穿模时被遮挡的情况。

所有武器通过 WeaponController.cs 组件完成,在 PlayerWeaponsManager.cs 中也通过此组件进行管理,并且所有枪械的位置动画都是通过计算,在每一帧最后更新到武器的根节点予以表现。

  • Jetpack.cs 组件

这是给玩家提供的特殊能力,可以在跳跃后进行空中移动。

1
2
bool jetpackIsInUse = m_CanUseJetpack && isJetpackUnlocked  && currentFillRatio > 0f && m_InputHandler.GetJumpInputHeld();
//

m_CanUseJetpack 是通过姿态位置和按键来判断是否可以触发技能;isJetpackUnlocked 是技能是否以解锁的控制量;currentFillRatio > 0f 是判断燃料是否用尽;最后判断是否保持跳跃键按下。

而正常技能解锁时,会通过 UI 来提示玩家,或显示相应的技能画面,

  • CharacterController.cs 组件

是 Unity 提供的角色控制器,在 PlayerCharacterController 用来控制角色移动。

  • Actor.cs 组件

用来描述敌对关系,主要在 AI 逻辑与决策中使用。

  • Damageable.cs 组件

会取得绑定在同一对象上的 Health.cs 组件,在调用其 InflictDamage() 方法时,对指定 Health.cs 对象造成伤害。

  1. 武器相关的结构

武器的逻辑代码挂载在根节点上,子节点分别是模型结构,以及用来指示位置的 GameObject。

  • WeaponController.cs

武器的主控制器,对武器的类型、属性进行配置,如准星类型,武器发射是自动还是需要蓄力等。同时武器还需要发射时的火光,以及射出的枪弹,这些都是通过制成不同的 prefab 得到的。

不同于实际的战争游戏中武器换弹的设计,这个 demo 中的枪械采用的子弹打光之后需要进行“冷却”。而下面两个脚本就是实现了这种机制具体的表现效果。

  • WeaponFuelCellHandler.cs

  • OverheatBehavior.cs

  1. 枪弹

枪弹通过两个脚本来进行定义,

  • ProjectileBase.cs

提供 onShoot 事件,在 WeaponController.cs 中触发。

  • ProjectileStandard.cs

配置子弹的各种属性,一些特殊的属性,可以通过更多的脚本来提供,如范围伤害,使用 DamageArea.cs 脚本,蓄力攻击的效果等,使用 ProjectileChargeParameters.cs 脚本。

  1. 拾取物

游戏中可可拾取物的配置主要是通过两个脚本实现的:

  • Pickup.cs 组件

Pickup.cs 中对可拾取物的表现进行了配置。并提供了 onPick 事件,用来在物品被拾取时触发。

  • xxxPickup.cs 组件

依赖 Pickup.cs 组件,定义了 xxx 拾取物被拾取后触发的功能。

  1. 敌人

组合了#@#¥%#54523@#¥…

  1. 游戏中的流程控制等控制器绑定在 GameManager 对象上:

  • GameFlowManager.cs 组件

主循环中设置游戏完成的条件,判断是否结束。

  • EnemyManager.cs 组件

管理敌人实体的注册与移除,对场景中敌人进行统计。

  • ActorsManager.cs 组件

对 Actor 进行控制。

  • ObjectiveManager.cs 组件

任务管理器,提供了任务的注册和管理,对全部任务的完成进行检查。

  • AudioManager.cs 组件

只……保存了 Audio Mixer,可以后续定制。

0xff

好啦,水完了!撒花!