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

252 阅读5分钟

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

一、本堂课重点内容:

讲述了一个简单的小游戏开发流程。

二、详细知识点介绍:

1.3D实体搭建

3D实体

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

3D实体的位姿态

  1. 位置Position (x, y, z),是一个三维向量坐标
  2. 旋转Rotation (x, y, z),是一个三维向量坐标
  3. 缩放Scale (x, y, z),是一个三维向量坐标

在Unity中,绝大部分情况下,是先缩放,后旋转,最后平移。

3D实体的创建

  1. 通过加载3D模型创建,如fbx、gltf、obj。
  2. 通过组合参数化的基本几何体创建。

3D实体的绘制

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

预制体

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

2.相机,光照,天空盒

相机

  1. Clear Flag。
  2. 背景颜色。
  3. Culling Mask。
  4. 投影(透视、正交)

光照

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

天空盒

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

3.控制与碰撞

为主角飞船添加控制逻辑

1.添加刚体组件。

  • Add Component > Physics > Rigidbody.
  • Use Gravity设置为false,忽略重力的影响。
  • isKinematic设置为true,飞船通过脚本而非力影响运动属性。
  • 设置Constraints ,冻结Z轴位移以及X、Y、Z轴旋转。

2.添加自定义脚本。

  • Add Component > New Script

添加敌机

为每架敌机预制体添加一个刚体。

  • 选中敌机预制体,在菜单栏执行Component > Physics > Rigidbody
  • 在新添加的刚体组件中,将Use Gravity设置为false.
  • 将isKinematic设置为true。
  • 打开Constraints旁边的三角形展开按钮,冻结Z轴的坐标和XYZ轴的旋转。

建立敌机的脚本Enemey.cs。

为每架敌机预制体均添加脚本Enemy.cs。

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

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

  • 主角飞船(Hero) :会与敌机、敌机炮弹、升级道具碰撞,但不会与主角飞船的炮弹相碰撞。
  • 主角飞船的炮弹(ProjectileHero) :与敌机、敌机的炮弹相碰撞。
  • 敌机(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.

4.玩法逻辑与UI

主角飞船增加射击功能

  1. 新建一个新的预制体, 命名为ProjectileHero。模型为-一个立方体,Position与Rotation均为[0,0,0],Scale为[0.25,1,0.5]。 保留默认的Box Collider. Box Collider的Size.z设置为10.
  2. 创建一个名为Mat Projectile 的新材质,将着色器指定为ProtoTools > UnlitAlpha,并将新材质应用到ProjectileHero上。
  3. 为ProjectileHero游戏对象添加一个新的刚体组件,设置如下:
  • Use Gravity为false
  • isKinematic为false
  • Collision Detection为Continuous
  • Constraints冻结Z坐标与X、Y、 Z旋转轴
  1. Tag和Layer均设置为ProjectileHero。

5.知识点总结

  • 在Unity中创建实体,给实体设置位姿、材质、刚体、脚本。
  • 配置相机、光、天空盒。
  • 理解实时游戏update的时序机制。
  • 通过Input.GetAxis()与InputManager监听玩家输入。
  • 用Instantiate (动态生成游戏实体实例。
  • 从Camera.main获得相机参数, 设置场景中的物体在画面中的位置。
  • 利用标签、图层管理器区分实体种类并设置物理规则。
  • 通过Collider组件与OnTrigger函数添加碰撞事件。
  • 通过图形用户界面(GUI)管理游戏界面。

三、课后个人总结:

通过对本次课程的学习让我了解了3D游戏开发大致的一个流程,明白了一个简单的3D游戏是如何一步一步开发出来的,以及如何给3D模型增加物理引擎、平移旋转动作、射击效果以及碰撞等等,让我对游戏的开发有了初步的认知。

四、引用参考:

字节青训营录播-3D游戏实战开发-录播