3D游戏实战开发 | 青训营笔记

139 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 17 天

3D实体

  • 3D游戏是由一个个具有形状的实体组成的。每个实体在空间中存在于特定的位置,有特定的姿态(旋转角度)。

  • 3D实体的创建

    • 通过加载3D模型创建,如 fbx、gltf、obj。
    • 通过组合参数化的基本几何体创建。
  • 3D实体的变换组件

    • 位移变换:三维向量。你所用的游戏引擎是左手坐标系还是右手坐标系?
    • 旋转变换:俯仰角、偏航角、滚转角
  • 缩放变换

  • 3D实体的材质、颜色与纹理设置。

图片.png

图片.png

预制体

  • 预制体

    • 什么是预制体?
    • 预制体与实例化对象的关系是什么?
    • 如何创建预制体?
    • 如何在游戏运行过程中根据预制体实时实例化对象?

图片.png

场景氛围渲染

相机

  • Clear Flag。

  • 背景颜色。

  • Culling Mask。

  • 投影类型

    • 透视投影:far、near、fov
    • 正交投影:far、near、size

图片.png

光照

  • 类型:点光源、平行光、聚光灯、面积光。

  • 颜色。

  • 强度。

  • 阴影类型。

    • 软阴影。
    • 硬阴影。

天空盒

  • 概念:游戏中的天空盒是一个包裹整个场景的立方体,可以很好地渲染并展示整个场景环境。

  • 学习配置天空盒:

    • 相机的清除标志设为“天空盒”。

    • 窗口-渲染-照明-环境-天空盒材质设置。

图片.png

图片.png

3D 实时游戏的执行时序

  • 实时游戏的运行帧

    • 帧率60可以流畅运行,帧率30差强人意,帧率20及以下会感受到明显卡顿

    • 帧率60意味着每一帧运行时间16.67毫秒

    • 一帧内,需要执行物理计算(含运动学与动力学计算、碰撞检测)、用户输入检测、游戏逻辑执行、渲染画面,如果时间还有富余,停顿到16.67毫秒。

    • 游戏中的实体有静态的实体,也有动态的实体。对于动态的实体,我们需要为其设置刚体属性、碰撞/触发属性或执行脚本。

    • 游戏的优化主要是减少物理、逻辑或渲染中的运算量。例如减少无意义的碰撞检测,用更少的计算量达到相同的执行目标,在用户感知不到差异的前提下尽可能裁剪渲染。

图片.png

刚体组件 RigidBody

  • 概念:刚体是指在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体。现实生活中,刚体受力后,运动状态会发生改变(牛顿第一定律);相互作用的两个物体之间的作用力和反作用力总是大小相等,方向相反(牛顿第三定律)。
  • 但是在 3D 游戏中,刚体的性质遵守游戏设定的规则而不是牛顿定律。例如悬浮在空中的踏板、空气墙、无论多大的力都推不动的石子、不受重力作用的裙子。
  • RigidBody 组件中的 Use Gravity:顾名思义,指示当前刚体是否受重力作用。
  • RigidBody 组件中的 isKinematic:是否受脚本规则影响运动而非受牛顿定律控制运动状态。
  • RigidBody 组件中的 Constraints:是否在某个坐标轴上冻结位移状态或旋转状态。

碰撞盒组件 Colider

  • 碰撞盒之间进行碰撞检测,当碰撞盒A与碰撞盒B碰撞时,会调用碰撞盒A所在对象的 OnCollisionEnter 方法,并将碰撞盒B作为参数传入;同时也会调用碰撞盒B所在对象的 OnCollisionEnter 方法,并将碰撞盒A作为参数传入。

  • 如果将碰撞盒的 Trigger 勾选,那么这个碰撞盒会成为触发器,不会碰撞其他碰撞盒或给其他碰撞盒施加力,会穿过其他碰撞盒,仅检测是否与其他碰撞盒重合,触发的事件为 OnTriggerEnter 。

  • 可以通过配置图层 Layer 与 物理规则 Physics 来指定哪些实体之间会进行碰撞检测,减少碰撞检测次数。

    • 菜单栏中执行 Edit > Project Settings > Tags and Layers 命令可以设置项目中的Tags或Layers。
    • 菜单栏中执行 Edit > Project Settings > Physics 命令可以设置项目中不同Layers之间的碰撞规则。
    • 可以选中 GameObject 设置其 Tag 和 Layer。

Unity 脚本:派生自 MonoBehaviour 类

  • Unity 脚本可以作为作者的自定义插件挂载在 GameObject 上,每一帧游戏逻辑的执行阶段,会依次运行每一个有脚本的 GameObject 上的所有脚本。

    • Start() 在首次调用任何 Update 方法之前在帧上调用 Start()。
    • Update() 每帧调用 Update()。
    • FixedUpdate() 用于物理计算且独立于帧率。具有物理系统的频率;每个固定帧率帧调用该函数。
    • LateUpdate() LateUpdate 在每一次调用 Update 函数后调用。
    • OnDisable() 该函数在对象被禁用时调用。对象销毁时也会调用该函数。
    • OnEnable() 该函数在对象变为启用和激活状态时调用。

完成游戏逻辑与游戏GUI

  • 学习在Unity中创建实体,给实体设置位姿、材质、刚体、脚本。

  • 学会配置相机、光、天空盒。

  • 理解实时游戏update的时序机制。

  • 通过Input.GetAxis()与InputManager监听玩家输入。

  • 用Instantiate()动态生成游戏实体实例。

  • 从Camera.main获得相机参数,设置场景中的物体在画面中的位置。

  • 利用标签、图层管理器区分实体种类并设置物理规则。

  • 通过 Collider 组件与 OnCollision、OnTrigger 函数添加碰撞与触发事件。

  • 通过图形用户界面(GUI)管理游戏界面。

图片.png

图片.png