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

161 阅读6分钟

  这是我参与【第五届青训营】伴学笔记创作活动的第6天。

3D实体搭建

(在游戏场景中搭建静态物体)
  3D实体 | 变换组件 | 简单材质 | 预制体

3D实体

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

3D实体的位姿态(Transform)

  1. 位置 Position(x,y,z),是一个三维向量坐标

  2. 旋转 Rotation (x,y,z),是一个三维向量坐标
      其中沿x旋转的俯仰角也叫偏角,沿z旋转的滚转角也叫侧滚

  3. 缩放 Scale(x,y,z),是一个三维向量坐标

    在 Unity 中,绝大部分情况下,是先缩放,后旋转,最后平移。
    坐标系也分左手坐标系和右手坐标系,所以使用前要先确定是左手还是右手。

3D实体的创建

  1. 通过加载3D模型创建,如 fbx、gltf、obj。
      由美术提前创建好时使用。
  2. 通过组合参数化的基本几何体创建。
      由多个基础几何体组合成。

3D实体的绘制

  1. 材质
  2. 颜色
  3. 纹理

敌机模型制作

  图中通过不同的球体制作出了五个不同的敌机:

预制体

  • 将游戏对象保存在工程中,在需要的时候创建出来,这就是预制体(prefab)。
  • 预制体存储着一个游戏对象,包括游戏对象的所有组件以及其下的所有子游戏对象。

相机、光照、天空盒

(营造游戏场景中的氛围感)
  相机实体 | 两种投影方式 | 光照设置 | 天空盒

相机

  1. Clear Flag :在游戏场景中没有任何实体的位置,可以纯色或天空盒。
  2. 背景颜色
  3. Culling Mask :裁剪用,不常用
  4. 投影(透视、正交):
  • 透视投影(Perspective):常用于写实类的游戏,第一人称或第三人称的游戏。在视锥体中的实体将被看到。
  • 正交投影(Orthographic):常用于早期设计类的游戏

光照

  1. 类型:点光源、平行光、聚光灯、面积光
  2. 颜色
  3. 强度
  4. 阴影类型

天空盒

(其实是一个图片,有现成的)

  1. 相机的清除标志设为“天空盒”
  2. 窗口 -- 渲染 -- 照明设置
  3. 环境 -- 天空盒材质

控制与碰撞

(让实体在游戏场景中动起来)
  实时游戏时序 | 输入管理器 | 碰撞盒 标签与层级

实时游戏时序

docs.unity3d.com/Manual/Exec…
每一帧:不要求短,只需要连贯,所以需要停顿。

为主角飞船添加控制逻辑

  1. 添加刚体组件(在运动过程中不会发生形变的物质称为刚体)
  • Add Component > Physics > Rigidbody。
  • Use Gravity设置为false,忽略重力影响。
  • isKinematic设置为true,飞船通过脚本而非力影响运动属性。
  • 设置Constraints,冻结Z轴位移以及X,Y,Z轴旋转。
  1. 添加自定义脚本
  • Add Component > New Script
    此外
    MonoBehaviour是一个基类,所以Unity脚本都派生自该类。
    其中较重要的函数列举如下:
  • Start()
    在首次调用任何Update方法之前在帧上调用Start。
  • Update()
    每帧调用Update。
  • FixedUpdate()
    用于物理计算且独立于帧率。具有物理系统的频率;每个固定帧率调用该函数。
  • LateUpdate()
    LateUpdate在每次调用Update函数后调用。
  • OnGUI()
    系统调用OnGUI的渲染和处理GUI事件,OnGUI实现可以每帧调用多次(每个事件调用一次)
  • OnDisable()
    该函数在对象被禁用时调用。对象销毁时也会调用该函数。
  • OnEnable()
    该函数在对象变为启用和激活状态时调用。 docs.unity3d.com/cn/2020.2/S…


Input.GetAxis()和输入管理器(InputManager)

  • InputManager是Unity设置输入响应方式的管理列表,它的位置在Edit > Project Setting > Input中

添加敌机

  1. 为每架敌机预制体添加一个刚体。
  • 选中敌机预制体,在菜单栏执行Component > Physics > Rigidbody。
  • 在新添加的刚体组件中将。Use Gravity设置为false。
  • 将isKinematic设置为true。
  • 打开Constraints旁边的三角形展开按钮。冻结Z轴的坐标和XYZ轴的旋转。
  1. 建立敌机的脚本 Enemey.cs。
  2. 为每架敌机预制体均添加脚本 Enemey.cs。
    敌机的代码:

随机生成敌机

  • 新建一个名为Main的C#脚本,绑定到Main Camera上。
  • 敌机与玩家控制的飞船没有碰撞效果。
  • 玩家控制的飞船会移出相机视野之外。
  • 敌机会不断添加进场景中,导致场景中的实体越来越多。

设置标签、图层和物理规则

  在游戏中存在不同类型的游戏对象,它们需要放置在不同的图层中,并与其他游戏对象发生不同的交互。

  • 主角飞船(Hero):会与敌机、敌机炮弹、升级道具碰撞。但不会与主角飞船的炮弹相碰撞。
  • 敌机(Enemy):与主角飞船和主角飞船的炮弹相碰撞。
  • 敌机的炮弹(ProjectileEnemy):只与主角飞船相碰撞。
  • 升级道具(PowerUp):只与主角飞船相碰撞。

标签和图层管理器

  1. 菜单栏中执行Edit > Project Settings > Tags and Layers命令。
  2. 打开Tags左侧的三角形展开按钮,单击标签下方的+符号并输入标签名称。
  3. 单击Layers旁边的三角形展开按钮从User Layer 8开始谢谢。,依次输入图层名称。

物理管理器

  • 菜单栏中执行Edit > Project Settings > Physics命令。

为游戏对象制定合适的图层

  1. 在层级面板中选中_Hero,然后在检视面板中从 Layer 下拉菜单中选择"Hero"选项。Unity 会询问是否将_Hero的子对象也指定到该图层上,选择“Yes, change children”选项。
  2. 在检视面板中,在 Tag 下拉菜单中选择 Hero 选项,为_Hero设置标签。不需要修改_Hero子对象的标签。
  3. 从项目面板中选择这5个敌机预设,设置图层为 Enemy。如果出现提示,同样选择“Yes, change children”选项。
  4. 设置每个敌机预设的标签为Enemy。不需要修改它们的子对象的标签。

敌机碰撞主角飞船

  • 为主角飞船和敌机添加碰撞体。球体碰撞检测的效率较高。我们将主角飞船与敌机飞船及其子组件上已有的碰撞盒去掉,对每个对象的母体上Add Component > Sphere Collider。

添加碰撞代码

  • 在Hero类中添加OnTriggerEnter函数