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

129 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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

在场景外包裹一个盒子,在场景中的所有方向/视角都能看到一定的纹理

控制与碰撞

时序

  1. 初始化游戏界面
  2. 物理碰撞检测
  3. 监听用户输入
  4. 用户可能会修改实体的逻辑/状态
  5. 修改渲染
  6. 停顿-减少资源/性能消耗
  7. 销毁

碰撞检测

  • 每一个实体都可以设置碰撞盒
  • 球体碰撞检测的效率较高,计算量小(只需要获取球心坐标和半径)
  • 为了增加游戏体验,主角的碰撞盒一般相对小一些

Demo

  1. 创建主角飞船、敌机飞船模型
  2. 添加控制逻辑:刚体组件(碰撞后不易发生形变的材质)、自定义脚本
  3. 随机生成敌机
  4. 设置标签、图层和物理规则
    • 主角飞船Hero:与敌机、敌机炮弹、升级道具碰撞,但不会与主角非常炮弹相碰撞
    • 主角飞船的炮弹ProjectileHero:与敌机、敌机炮弹碰撞
    • 敌机Enemy:与主角飞船和其炮弹碰撞
    • 敌机炮弹ProjectileEnemy: 只与主角飞船碰撞
    • 升级道具PowerUp:只与主角飞船相碰撞
  5. 飞船物理规则设置、碰撞设置
  6. 飞船增加射击功能、子弹碰撞设置
  7. 设计和显示计分板
  8. 重新开始游戏设置