这是我参与「第五届青训营 」笔记创作活动的第10天
一、本堂课重点内容:
讲述了一个简单的小游戏开发流程。
二、详细知识点介绍:
1.3D实体搭建
3D实体
3D游戏是由一个个具有形状的实体组成的。每个实体在空间中存在于特定的位置,有特定的姿态(旋转角度)。
3D实体的位姿态
- 位置Position (x, y, z),是一个三维向量坐标
- 旋转Rotation (x, y, z),是一个三维向量坐标
- 缩放Scale (x, y, z),是一个三维向量坐标
在Unity中,绝大部分情况下,是先缩放,后旋转,最后平移。
3D实体的创建
- 通过加载3D模型创建,如fbx、gltf、obj。
- 通过组合参数化的基本几何体创建。
3D实体的绘制
- 材质。
- 颜色。
- 纹理。
预制体
- 将游戏对象保存在工程中,在需要的时候创建出来,这就是预制体(prefab)。
- 预制体存储着-个游戏对象, 包括游戏对象的所有组件以及其下的所有子游戏对象。
2.相机,光照,天空盒
相机
- Clear Flag。
- 背景颜色。
- Culling Mask。
- 投影(透视、正交)
光照
- 类型:点光源、平行光、聚光灯、面积光。
- 颜色。
- 强度。
- 阴影类型。
天空盒
- 相机的清除标志设为"天空盒"。
- 窗口-渲染照明设置。
- 环境-天空盒材质。
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) :只与主角飞船相碰撞。
标签和图层管理器
- 菜单栏中执行Edit > Project Settings > Tags and Layers命令。
- 打开Tags左侧的三角形展开按钮。单击标签下方的+符号并输入标签名称。
- 单击Layers旁边的三角形展开按钮从User Layer 8开始,依次输入图层名称。
物理管理器
- 菜单栏中执行Edit > Project Settings > Physics命令。
为游戏对象指定合适的图层
- 在层级面板中选中_ Hero, 然后在检视面板中从Layer下拉菜单中选择"Hero"选项。Unity 会询问是否将Hero的子对象也指定到该图层上,选择"Yes, change children"选项。
- 在检视面板中,在Tag下拉菜单中选择Hero选项,为Hero设 置标签。不需要修改Hero子 对象的标签。
- 从项目面板中选择这5个敌机预设,设置图层为Enemy。如果出现提示,同样选择"Yes, change children"选项。
- 设置每个敌机预设的标签为Enemy。不需要修改它们的子对象的标签。
敌机碰撞主角飞船
- 为主角飞船和敌机添加碰撞体。球体碰撞检测的效率较高。我们将主角飞船与敌机飞船及其子组件上已有的碰撞盒去掉,每个对象的母体上Add Component > Sphere Collider.
4.玩法逻辑与UI
主角飞船增加射击功能
- 新建一个新的预制体, 命名为ProjectileHero。模型为-一个立方体,Position与Rotation均为[0,0,0],Scale为[0.25,1,0.5]。 保留默认的Box Collider. Box Collider的Size.z设置为10.
- 创建一个名为Mat Projectile 的新材质,将着色器指定为ProtoTools > UnlitAlpha,并将新材质应用到ProjectileHero上。
- 为ProjectileHero游戏对象添加一个新的刚体组件,设置如下:
- Use Gravity为false
- isKinematic为false
- Collision Detection为Continuous
- Constraints冻结Z坐标与X、Y、 Z旋转轴
- Tag和Layer均设置为ProjectileHero。
5.知识点总结
- 在Unity中创建实体,给实体设置位姿、材质、刚体、脚本。
- 配置相机、光、天空盒。
- 理解实时游戏update的时序机制。
- 通过Input.GetAxis()与InputManager监听玩家输入。
- 用Instantiate (动态生成游戏实体实例。
- 从Camera.main获得相机参数, 设置场景中的物体在画面中的位置。
- 利用标签、图层管理器区分实体种类并设置物理规则。
- 通过Collider组件与OnTrigger函数添加碰撞事件。
- 通过图形用户界面(GUI)管理游戏界面。
三、课后个人总结:
通过对本次课程的学习让我了解了3D游戏开发大致的一个流程,明白了一个简单的3D游戏是如何一步一步开发出来的,以及如何给3D模型增加物理引擎、平移旋转动作、射击效果以及碰撞等等,让我对游戏的开发有了初步的认知。
四、引用参考:
字节青训营录播-3D游戏实战开发-录播