这是我参与「第五届青训营 」笔记创作活动的第17天
一、本堂课重点内容:
- 3D 游戏中的实体模型、材质与位姿
- 相机、光照、天空盒
- 游戏控制、刚体属性与物理碰撞
- 玩法逻辑与游戏UI
二、详细知识点介绍:
1.3D实体搭建
3D实体
- 3D游戏是由一个个具有形状的实体组成的。每个实体在空间中存在于特定的位置,有特定的姿态(旋转角度)
2.相机,光照,天空盒
相机
- Clear Flag
- 背景颜色
- Culling Mask
- 投影(透视、正交)
光照
- 类型:点光源、平行光、聚光灯、面积光
- 颜色
- 强度
- 阴影类型
天空盒
- 相机的清除标志设为"天空盒"。
- 窗口-渲染-照明设置
- 环境-天空盒材质
3.控制与碰撞
为主角飞船添加控制逻辑
- 添加刚体组件
- Add Component > Physics > Rigidbody
- use Gravity 设置为false,忽略重力的影响
- isKinematic 设置为true,飞船通过脚本而非力影响运动属性
- 设置Constraints,冻结Z轴位移以及X、Y、Z轴旋转
- 添加自定义脚本
- Add Component > New Script
添加敌机
- 为每架敌机预制体添加一个刚体
- 选中敌机预制体,在菜单栏执行Component > Physics > Rigidbody
- 在新添加的刚体组件中,将Use Gravity设置为false
- 将isKinematic设置为true
- 打开Constraints旁边的三角形展开按钮,冻结Z轴的坐标和XYZ轴的旋转
- 建立敌机的脚本Enemy.cs
- 为每架敌机预制体均添加脚本Enemy.cs
- 敌机与玩家控制的飞船没有碰撞效果
- 玩家控制的飞船会移出相机视野之外
- 敌机会不断添加进场景中,导致场景中实体越来越多
设置标签、图层和物理规则
游戏中存在不同类型的游戏对象,它们需要放置在不同的图层中,并与其他游戏对象发生不同的交互。
- 主角飞船(Hero):会与敌机、敌机炮弹、升级道具碰撞,但不会与主角飞船的炮弹相碰撞。
- 主角飞船的炮弹(ProjectileHero) :与敌机、故机的炮弹相碰撞。
- 敌机(Enemy) :与主角飞船和主角飞船的炮弹相碰撞。
- 敌机的炮弹(ProjectileEnemy):只与主角飞船相碰撞。
- 升级道具(PowerUp):只与主角飞船相碰撞。
标签和图层管理器
为游戏对象指定合适的图层
- 在层级面板中选中_Hero,然后在检视面板中从Layer下拉菜单中选择"Hero"选项。Unity 会询问是否将_Hero的子对象也指定到该图层上,选择“Yes, changechildren”选项。
- 在检视面板中,在Tag 下拉菜单中选择Hero选项,为_Hero设置标签。不需要修改_Hero子对象的标签。
- 从项目面板中选择这5个敌机预设,设置图层为Enemy。如果出现提示,同样选择"Yes, change children”选项。”
- 设置每个敌机预设的标签为Enemy。不需要修改它们的子对象的标签。
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。
三、课后个人总结:
- 学习在Unity中创建实体,给实体设置位姿、材质、刚体、脚本。
- 学会配置相机、光、天空盒。
- 学习在Unity中创建实体,给实体设置位姿、材质、刚体、脚本。·学会配置相机、光、天空盒。
- 通过Input.GetAxis()与InputManager监听玩家输入。
- 用Instantiate()动态生成游戏实体实例。
- 从Camera.main获得相机参数,设置场景中的物体在画面中的位置。
- 利用标签、图层管理器区分实体种类并设置物理规则。
- 通过Collider 组件与OnTrigger函数添加碰撞事件。
- 通过图形用户界面((GUI)管理游戏界面。
- 在这次的学习中学到了怎么用Unity3D来进行简单的游戏开发,开拓了视野,基本理解了一个游戏是怎么设计和被开发的。