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

160 阅读7分钟

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

一、本堂课重点内容:

本堂课的知识要点有哪些?

  • 3D实体搭建
  • 相机、光照、天空盒
  • 控制与碰撞
  • 玩法逻辑与UI

二、详细知识点介绍:

初识3D 游戏引擎

  • 下载并运行 Unity 软件

  • 熟悉 Unity 界面

    • Scene(场景)面板
    • Game(游戏)面板
    • Hierarchy(层级)面板
    • Project(项目)面板
    • Inspector (检视器)面板
    • Console(控制台)面板
  • 理解 Unity 中的 GameObject (实体)及其挂载的 Component (组件)

    • Camera(相机)实体
    • Light(光照)实体
    • Transform(变换)组件:位置、旋转和缩放
    • Mesh(网格)组件与 Material (材质)组件
    • RigidBody(刚体)组件:物理模拟
    • Collision(碰撞器)组件:碰撞检测
  • Input(游戏输入)与 InputManager(输入管理器)

  • Tag(标签)、Layer(图层)与 Physics(物理规则)

  • Prefab(预制体)与 Instantiate(实例化)

  • 在 GameObject 上挂载 Script(脚本)

  • GUI(图形用户界面)和游戏管理

  • 下载 Unity 之外的另一款 3D 游戏引擎,在其中寻找以上概念在另一款 3D 游戏引擎中的平行概念。以下是建议的另一款 3D 游戏引擎:

    • UE(Unreal Engine 虚幻引擎,UE4 或 UE5)

    • Roblox(罗布乐思)

3D实体搭建

3D实体

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

image.png

3D实体的位姿态(Transform)

  • 位置Position(x,y,z) 是三维向量坐标
  • 旋转 Rotation(x,y,z), 是一个三维向量坐标
  • 缩放 Scale(x,y,z), 是一个三维向量坐标

image.png

image.png

在Unity中,绝大部分情况下,是先缩放,后旋转,最后平移

3D实体的创建

  • 通过加载 3D 模型创建,如 fbx、gltf、obj
  • 通过组合参数化的基本几何体创建。

image.png

3D实体的绘制

  • 材质
  • 颜色
  • 纹理

image.png

敌机模型制作

image.png

预制体

  • 将游戏对象保存在工程中,在需要的时候创建出来,这就是预制体(prefab)
  • 预制体存储着一个游戏对象,包括游戏对象的所有组件以及其下的所有子游戏对象。

image.png

相机、光照、天空盒

相机

  • Clear Flag

  • 背景颜色

  • Culling Mask

  • 投影(透视、正交)

image.png

  • 透视投影(Perspective)

  • 正交投影(Orthographic)

image.png

光照

  • 类型:点光源、平行光、聚光灯、面积光
  • 颜色
  • 强度
  • 阴影类型

image.png

天空盒

  • 相机的清除标志设为“天空盒”
  • 窗口-渲染-照明设置
  • 环境-天空盒材质

image.png

控制与碰撞

初始化 → 物理 → 输入 → 游戏逻辑 → 渲染 → 停顿 → 销毁

Unity - Manual: Order of execution for event functions (unity3d.com)

为主角飞船添加控制逻辑

1.添加刚体组件

  • Add Component>Physics>Rigidbody
  • Use Gravity设置为false,忽略重力的影响
  • isKinematic 设置为true,飞船通过脚本而非力影响运动属性
  • 设置Constraints,冻结z轴位移以及X,Y,Z轴旋转

2.添加自定义脚本

  • Add Component>New Script

MonoBehaviour是一个基类,所有Unity脚本都派生自该类

  • Start()在首次调用任何Update方法之前在帧上调用

  • Update()每帧调用

  • FixedUpdate()每个固定帧调用

  • LateUpdate()lateUpdate在每一次update后统一调用

  • OnGUI()渲染和处理GUI事件,可多次调用

  • OnDisable()在对象销毁时调用

  • OnEnable()在对象变为启用和激活时调用

添加敌机

  • 为每架敌机预制体添加一个刚体

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

  • 为每架敌机预制体均添加脚本 Enemy.cs

//##Enemy.cs 的代码:
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
public class Enemy : MonoBehaviour { [Header("Set in Inspector: Enemy")] public float speed = 10f;
public float fireRate = 0.3f;
public float health = 10; 
public float score = 100;
public Vector3 pos { get{return(this.transform.position); }set{this.transform.position = value; } }// Update is called once per frame void Update() { 
    Move(); 
}
public virtual void Move(){
Vector3 tempPos = pos; 
tempPos.y -= speed * Time.deltaTime; 
pos = tempPos; 
    } 
}
  • 随机生成敌机
    • 新建一个名为 Main 的 C# 脚本,绑定到 Main Camera 上。

image.png

  • 设置标签、图层和物理规则

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

    • 主角飞船(Hero):会与敌机、敌机炮弹、升级道具碰撞,但不会与主角飞船的炮弹相碰撞。

    • 主角飞船的炮弹(ProjectileHero):与敌机、敌机的炮弹相碰撞。

    • 敌机(Enemy):与主角飞船和主角飞船的炮弹相碰撞。

    • 敌机的炮弹(ProjectileEnemy):只与主角飞船相碰撞。

    • 升级道具(PowerUp):只与主角飞船相碰撞。

  • 标签和图层管理器

1.菜单栏中执行Edit > Project Settings > Tags and Layers 命令。

2.打开Tags左侧的三角形展开按钮。单击标签下方的+并输入标签名称。

3.单击Layers旁边的三角形展开按钮从User Layer 8开始,输入图层名称。

  • 物理管理器

    • 菜单栏中执行Edit > Project Settings > Physics 命令。
  • 为游戏对象指定合适的图层

1.层级面板选中_hero,从Layer中选择“Hero”,选择“Yes,change children”。

2.检视面板中,从Tag中选择Hero,为_hero设置标签,不修改其子对象的标签。

3.从项目面板中选择5个敌机预设,设置图层Enemy。

4.设置每一个敌机预设的标签为Enemy。

  • 敌机碰撞主角飞船

为主角飞船和敌机添加碰撞体。每个对象的母体上Add Component > Sphere Collider

  • 添加碰撞代码

在Hero类中添加OnTriggerEnter函数

//在console中输出碰撞对象的名称
//print(“触发碰撞事件:+other.gameObject.name”);
void OnTriggerEnterCollider other){
if(other.tag =="Enemy"){
Destroy(this.gameObject);
  }
}

玩法逻辑与UI

  • 主角飞船增加射击功能
  • 按下空格后实例化新炮弹
  • 为子弹添加碰撞事件
  • 屏幕右上角显示计分板
  • 每次消灭敌机为为玩家增加50分
  • 重新开始游戏

知识点总结:

  • 学习在Unity中创建实体,给实体设置位姿、材质、刚体、脚本

  • 学会配置相机。光、天空盒

  • 理解实时游戏update的时序机制

  • 通过Input.GetAxis()与InputManager监听玩家输入

  • 用Instantiate()动态生成游戏实体实例

  • 从Camera.main获得相机参数,设置场景中的物体在画面中的位置

  • 利用标签、图层管理器区分实体种类并设置物理规则

  • 通过Collider组件OnTrigger函数添加碰撞事件

  • 通过图形用户界面(GUI)管理游戏界面

三、引用参考:

  1. 游戏开发:世嘉新人培训教材

本书由世嘉一线开发者执笔,并被选为世嘉新人培训教材,荣获游戏开发者奥斯卡CEDEC AWARDS 2009著作奖。全方位介绍游戏开发者必须掌握的基础技术,包括游戏编程、数学和物理等,内容充实,帮助读者建立起一套扎实的知识体系。

  1. 游戏设计梦工厂

《游戏设计梦工厂》是南加州大学互动媒体及游戏专业的系主任特雷西•弗雷顿教授的经典著作。作为一本将现代游戏工业与先进教学体系完美融合的书籍,通过《游戏设计梦工厂》你将学会“以体验为中心”的设计哲学和围绕这一核心的一系列设计方法及工具。

  1. GAMES 101 - 现代计算机图形学入门-闫令琪 (中级)

从计算机图形学的角度学习游戏制作的数学基础,有助于同学们了解位姿变换的具体数学实现方法(在引擎中只需要调用方法即可),了解相机、光照的数学模型。有助于初学者更好地理解游戏引擎中的某些功能的底层实现。

  1. GAMES 104 - 现代游戏引擎入门必修课-王希 (高级)

包含现代游戏引擎各个模块的算法与原理的大观概览。对于游戏制作者理解现代3D游戏引擎的实现原理有非常基础的帮助。

  1. GAMES 202 - 高质量实时渲染-闫令琪 (技美专用)

对于想要了解渲染原理或有志于做技美的同学建议通过这门课程学习。比如:想要通过写shader的方式做真实感或非真实感的游戏渲染,了解粒子系统、后处理或使用显卡加速游戏渲染的方式。