• 随便看看官方教程-FPS Microgame


    edit date: 2019-11-19 11:16:25

    0x00

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

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

    0x01

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

    可以在这个网站上下载,自己做成材质放进来。

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

    在这个项目中,使用的嵌套 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 的结构如下:

    Player预制体结构

    玩家控制的角色脚本入口为 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 组件

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

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

    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

    好啦,水完了!撒花!

  • 相关阅读:
    Linux命令之常用基础命令备查手册
    vue3学习源码笔记(小白入门系列)------provide和 inject 跨层级数据传递原理
    聚类基本概念及常见聚类算法和EM算法
    Linux网卡流量测速脚本
    U盘插入提示格式化才能使用,但里面有数据无法复制出来怎么解决?
    Spring IoC和DI详解
    做废20个账号才总结出的短视频运营干货
    word可以画神经网络图吗,如何画神经网络结构图
    数据挖掘十大算法--Apriori算法
    Android 后台服务启动Actvity
  • 原文地址:https://blog.csdn.net/ShihEuan/article/details/126302149