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

107 阅读4分钟

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

一、本堂课重点内容:

  1. 3D 游戏中的实体模型、材质与位姿
  2. 相机、光照、天空盒
  3. 游戏控制、刚体属性与物理碰撞
  4. 玩法逻辑与游戏UI

二、详细知识点介绍:

1.3D实体搭建

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

image.png

image.png

image.png

image.png

image.png

2.相机,光照,天空盒

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

image.png

光照
  1. 类型:点光源、平行光、聚光灯、面积光
  2. 颜色
  3. 强度
  4. 阴影类型
天空盒
  1. 相机的清除标志设为"天空盒"。
  2. 窗口-渲染-照明设置
  3. 环境-天空盒材质

3.控制与碰撞

image.png

为主角飞船添加控制逻辑
  1. 添加刚体组件
  • Add Component > Physics > Rigidbody
  • use Gravity 设置为false,忽略重力的影响
  • isKinematic 设置为true,飞船通过脚本而非力影响运动属性
  • 设置Constraints,冻结Z轴位移以及X、Y、Z轴旋转
  1. 添加自定义脚本
  • Add Component > New Script

image.png

image.png

image.png

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

image.png

image.png

  • 敌机与玩家控制的飞船没有碰撞效果
  • 玩家控制的飞船会移出相机视野之外
  • 敌机会不断添加进场景中,导致场景中实体越来越多
设置标签、图层和物理规则

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

  • 主角飞船(Hero):会与敌机、敌机炮弹、升级道具碰撞,但不会与主角飞船的炮弹相碰撞。
  • 主角飞船的炮弹(ProjectileHero) :与敌机、故机的炮弹相碰撞。
  • 敌机(Enemy) :与主角飞船和主角飞船的炮弹相碰撞。
  • 敌机的炮弹(ProjectileEnemy):只与主角飞船相碰撞。
  • 升级道具(PowerUp):只与主角飞船相碰撞。
标签和图层管理器

image.png

image.png

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

image.png

image.png

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。

image.png

image.png

image.png

image.png

image.png

三、课后个人总结:

  • 学习在Unity中创建实体,给实体设置位姿、材质、刚体、脚本。
  • 学会配置相机、光、天空盒。
  • 学习在Unity中创建实体,给实体设置位姿、材质、刚体、脚本。·学会配置相机、光、天空盒。
  • 通过Input.GetAxis()与InputManager监听玩家输入。
  • 用Instantiate()动态生成游戏实体实例。
  • 从Camera.main获得相机参数,设置场景中的物体在画面中的位置。
  • 利用标签、图层管理器区分实体种类并设置物理规则。
  • 通过Collider 组件与OnTrigger函数添加碰撞事件。
  • 通过图形用户界面((GUI)管理游戏界面。
  • 在这次的学习中学到了怎么用Unity3D来进行简单的游戏开发,开拓了视野,基本理解了一个游戏是怎么设计和被开发的。