edit date: 2019-11-19 11:16:25
Unity 推出的一套免费教程,看了以后我差点就以为我能做游戏了!传送门!!!
这个教程属于非常基础的给入门的小朋友学习的工程,虽然流程很短,项目也很小巧,但贵在完整。
天空盒 「Window」-「Rendering」-「Lighting Settings」中,设置场景中显示的天空盒。
可以在这个网站上下载,自己做成材质放进来。
其实我是来学习目录结构的!
在这个项目中,使用的嵌套 prefab,将一个实体拆分得足够细致,基本的原则是将脚本挂载在根节点上,模型的结构在子对象中体现出来,而一些标记模型位置的空对象与模型子对象同级。
不仅如此,使用了嵌套 prefab 就可以将很多比如粒子系统制成 prefab 嵌套在不同的 prefab 对象中去。
prefab 变体(prefab variant)是用来通过现有的 prefab 创建的变种,可以简单的理解为对覆写的 prefab 进行了保存,因此在编辑 prefab 变体时的规则与在 Hierarchy 中操作 prefab 实例相同,可以修改参数添加子对象,但不能删除修改 prefab 中对象的结构。
工程中还使用了 proGrids 和 Navigation,教程中都有比较详细的使用方法。proGrids 可以更加方便地放置 GameObject,构成关卡;Navigation 来生成简单的寻路系统,甚至也可以自定义路径类型,让 AI 与其进行交互。
debug 的方式,使用一个单独的 debugHandler 脚本来在需要报错的地方处理报错,函数体内使用 UNITY_EDITOR 来判断是否执行,这样在发布的包中对性能的影响是一次空函数的调用。
玩家角色 prefab 的结构如下:
玩家控制的角色脚本入口为 PlayerCharacterController.cs 组件,保存角色行为的主循环
Horizontal 和 Vertical 是对移动进行的配置,可以看到此处是对 left 和 right 按键进行的配置,同样还有同名的配置是针对 a 和 d 按键。
工程中为了将此配置与逻辑分离,专门使用了 GameConstants.cs 对字符串常量进行定义。
为了对操作进行统一控制,在游戏中对“鼠标指针的锁定状态”和“游戏状态”求与获得控制变量。
定义了血量相关的属性与方法,提供了 3 个事件,分别在受伤,治疗和死亡时可以触发。可以设置伤势严重程度,用来在 UI 进行表现。
使用了一个 UnityAction 的泛型类来处理事件,是在 UnityEngine.Events 中定义的。
相应的方法,可以在被挂载的实体控制器中使用。
WeaponCamera 仅用来显示第一视角的武器,将摄像机的 Clear Flags 设置为 Depth only 表示不,并将 Culling Mask 设置到 FirstPersonWeapon 层,即为武器所对应的层级。这样,由于 WeaponCamera 只显示武器相关,避免了在武器穿模时被遮挡的情况。
所有武器通过 WeaponController.cs 组件完成,在 PlayerWeaponsManager.cs 中也通过此组件进行管理,并且所有枪械的位置动画都是通过计算,在每一帧最后更新到武器的根节点予以表现。
这是给玩家提供的特殊能力,可以在跳跃后进行空中移动。
bool jetpackIsInUse = m_CanUseJetpack && isJetpackUnlocked && currentFillRatio > 0f && m_InputHandler.GetJumpInputHeld();
//
m_CanUseJetpack 是通过姿态位置和按键来判断是否可以触发技能;isJetpackUnlocked 是技能是否以解锁的控制量;currentFillRatio > 0f 是判断燃料是否用尽;最后判断是否保持跳跃键按下。
而正常技能解锁时,会通过 UI 来提示玩家,或显示相应的技能画面,
是 Unity 提供的角色控制器,在 PlayerCharacterController 用来控制角色移动。
用来描述敌对关系,主要在 AI 逻辑与决策中使用。
会取得绑定在同一对象上的 Health.cs 组件,在调用其 InflictDamage() 方法时,对指定 Health.cs 对象造成伤害。
武器的逻辑代码挂载在根节点上,子节点分别是模型结构,以及用来指示位置的 GameObject。
武器的主控制器,对武器的类型、属性进行配置,如准星类型,武器发射是自动还是需要蓄力等。同时武器还需要发射时的火光,以及射出的枪弹,这些都是通过制成不同的 prefab 得到的。
不同于实际的战争游戏中武器换弹的设计,这个 demo 中的枪械采用的子弹打光之后需要进行“冷却”。而下面两个脚本就是实现了这种机制具体的表现效果。
WeaponFuelCellHandler.cs
OverheatBehavior.cs
枪弹通过两个脚本来进行定义,
提供 onShoot 事件,在 WeaponController.cs 中触发。
配置子弹的各种属性,一些特殊的属性,可以通过更多的脚本来提供,如范围伤害,使用 DamageArea.cs 脚本,蓄力攻击的效果等,使用 ProjectileChargeParameters.cs 脚本。
游戏中可可拾取物的配置主要是通过两个脚本实现的:
Pickup.cs 中对可拾取物的表现进行了配置。并提供了 onPick 事件,用来在物品被拾取时触发。
依赖 Pickup.cs 组件,定义了 xxx 拾取物被拾取后触发的功能。
组合了#@#¥%#54523@#¥…
主循环中设置游戏完成的条件,判断是否结束。
管理敌人实体的注册与移除,对场景中敌人进行统计。
对 Actor 进行控制。
任务管理器,提供了任务的注册和管理,对全部任务的完成进行检查。
只……保存了 Audio Mixer,可以后续定制。
好啦,水完了!撒花!