这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天
3D实体
3D游戏是由一个个具有形状的实体组成的。每个实体在空间中存在于特定位置,有特定的姿态(旋转角)
位姿态(Tansform)
- 位置 Positon(x,y,z) 三维向量坐标
- 旋转 Rotation(x,y,z) 三维向量坐标
- 缩放 Scale (x,y,z) 三维向量坐标
创建
- 加载3D模型,如fbx,gltf, obj
- 组合参数化的基本几何体(材质、颜色、纹理)
预制体
与面向对象的编程方式不同,游戏开发喜欢采用EC(entity component)结构,用组合的方式把插件挂载到不同的实体上,再把实体放到场景中。
- 把游戏对象保存在工程中,在需要的时候创建出来,这就是预制体(prefab)
- 预制体存储着一个游戏对象,包括游戏对象的所有组件以及其下的所有子游戏对象
相机/光照/天空盒
相机
从三维到二维的降维操作
- 投影
- 透视投影(Perspective)视锥体
- 正交投影(Orthographic)立方体
光照
- 类型:点光源、平行光、聚光灯、面积光
- 颜色、强度、阴影类型
天空盒sky box
在场景外包裹一个盒子,在场景中的所有方向/视角都能看到一定的纹理
控制与碰撞
时序
- 初始化游戏界面
- 物理碰撞检测
- 监听用户输入
- 用户可能会修改实体的逻辑/状态
- 修改渲染
- 停顿-减少资源/性能消耗
- 销毁
碰撞检测
- 每一个实体都可以设置碰撞盒
- 球体碰撞检测的效率较高,计算量小(只需要获取球心坐标和半径)
- 为了增加游戏体验,主角的碰撞盒一般相对小一些
Demo
- 创建主角飞船、敌机飞船模型
- 添加控制逻辑:刚体组件(碰撞后不易发生形变的材质)、自定义脚本
- 随机生成敌机
- 设置标签、图层和物理规则
- 主角飞船Hero:与敌机、敌机炮弹、升级道具碰撞,但不会与主角非常炮弹相碰撞
- 主角飞船的炮弹ProjectileHero:与敌机、敌机炮弹碰撞
- 敌机Enemy:与主角飞船和其炮弹碰撞
- 敌机炮弹ProjectileEnemy: 只与主角飞船碰撞
- 升级道具PowerUp:只与主角飞船相碰撞
- 飞船物理规则设置、碰撞设置
- 飞船增加射击功能、子弹碰撞设置
- 设计和显示计分板
- 重新开始游戏设置