Unity 3D 实例教程:从零开始的游戏开发之旅
Unity 是一款功能强大且广受欢迎跨平台游戏引擎,使用 C# 作为其主要编程语言,本教程将引导您通过一系列由浅入深的实例,掌握 Unity 的核心技能。

第一部分:基础入门 (新手村)
这个阶段的目标是熟悉 Unity 的界面、基本工作流程和核心概念。
实例 1:创建你的第一个场景
- 目标:了解 Unity 编辑器布局,创建一个包含基本元素的 3D 场景。
- 核心概念:
- 场景:游戏中的一个独立环境,比如一个关卡、一个主菜单。
- 游戏对象:场景中的一切事物,包括角色、灯光、摄像机、UI 元素等。
- 层级视图:显示场景中所有游戏对象的层级结构。
- 场景视图:3D 可视化编辑窗口,用于放置和调整对象。
- 项目视图:存放你的所有资源,如模型、贴图、脚本等。
- 检查器视图:显示选中游戏对象的组件和属性。
- 操作步骤:
- 打开 Unity Hub,创建一个新项目(选择 3D 模板)。
- 在层级视图中,右键创建一个 3D 对象 -> 立方体。
- 在场景视图中移动、旋转、缩放这个立方体。
- 再创建一个 3D 对象 -> 平面,作为地面。
- 创建一个 主摄像机,调整其位置,使其能俯瞰场景。
- 创建一个 方向光,照亮场景。
- 点击顶部的播放按钮,预览你的场景。
实例 2:让物体动起来
-
目标:编写第一个 C# 脚本,让立方体在场景中旋转。
-
核心概念:
- 组件:附加在游戏对象上,赋予对象特定功能的模块。
Transform(变换)、Mesh Renderer(网格渲染器)。 - 脚本:用 C# 编写的组件,用于定义游戏逻辑。
- MonoBehaviour:所有 Unity 脚本的基类,继承它才能让脚本在 Unity 中正常工作。
Start()和Update():Start()在游戏开始时执行一次,Update()每一帧都执行一次,是处理游戏逻辑的主要方法。
- 组件:附加在游戏对象上,赋予对象特定功能的模块。
-
操作步骤:
(图片来源网络,侵删)-
在项目视图中,右键创建一个 C# 脚本,命名为
CubeRotator。 -
双击脚本,用 Visual Studio 或 Rider 打开它。
-
编写以下代码:
using UnityEngine; public class CubeRotator : MonoBehaviour { // Start is called before the first frame update void Start() { Debug.Log("立方体开始旋转了!"); } // Update is called once per frame void Update() { // 每一帧都让立方体绕 Y 轴旋转 1 度 transform.Rotate(0, 1, 0); } } -
回到 Unity,将
CubeRotator脚本拖拽到场景中的立方体游戏对象上。
(图片来源网络,侵删) -
点击播放,你会看到立方体开始旋转,在检查器视图中,你还可以调整旋转速度。
-
第二部分:核心机制探索 (解锁技能)
掌握了基础后,我们来学习游戏开发中最常用的几个核心系统。
实例 3:玩家控制与物理
-
目标:创建一个可以用键盘(WASD 或方向键)控制的玩家小球,并让它能与地面发生物理碰撞。
-
核心概念:
- 刚体:组件,使游戏对象受物理引擎影响,如重力、碰撞、力。
- 碰撞器:组件,定义对象的物理形状,用于检测碰撞。
- 输入管理:
Input类,用于获取键盘、鼠标、手柄等输入。 - 力与速度:通过
rigidbody.AddForce()或直接修改rigidbody.velocity来移动物体。
-
操作步骤:
-
创建一个 3D 对象 -> 球体,作为玩家。
-
选中球体,在检查器中点击 添加组件,搜索并添加 刚体。
-
创建一个 3D 对象 -> 平面 作为地面,确保它有碰撞器(默认自带)。
-
创建一个新的 C# 脚本
PlayerController,编写代码:using UnityEngine; public class PlayerController : MonoBehaviour { public float speed = 5f; private Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } void FixedUpdate() { // FixedUpdate 适合处理物理 float moveHorizontal = Input.GetAxis("Horizontal"); // A/D 或 左/右方向键 float moveVertical = Input.GetAxis("Vertical"); // W/S 或 上/下方向键 Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); rb.AddForce(movement * speed); } } -
将
PlayerController脚本拖拽到玩家球体上。 -
点击播放,现在你可以用键盘控制小球在平面上滚动了。
-
实例 4:碰撞检测与交互
-
目标:当玩家小球碰到一个带有“收集品”标签的物体时,该物体消失,并在控制台打印信息。
-
核心概念:
- 碰撞事件:
OnCollisionEnter()、OnCollisionStay()、OnCollisionExit(),用于处理两个刚体发生碰撞的事件。 - 用于给游戏对象分类,方便在代码中进行识别。
- 碰撞事件:
-
操作步骤:
-
创建一个新的 3D 对象 -> 立方体,作为收集品。
-
在层级视图中选中这个立方体,在检查器的顶部 Tag 下拉菜单中,选择 Add Tag...,创建一个新标签
Collectible,然后选中这个立方体,将其标签设置为Collectible。 -
创建一个新的 C# 脚本
CollectibleItem,编写代码:using UnityEngine; public class CollectibleItem : MonoBehaviour { void OnCollisionEnter(Collision collision) { // 检查碰撞到的物体是否带有 "Player" 标签 if (collision.gameObject.CompareTag("Player")) { Debug.Log("你收集了一个物品!"); // 销毁当前物体(收集品) Destroy(gameObject); } } } -
将
CollectibleItem脚本拖拽到收集品立方体上。 -
确保玩家球体有
Player标签(如果没有,可以像创建Collectible一样创建)。 -
点击播放,控制小球去碰撞立方体,观察控制台输出和立方体的消失。
-
实例 5:用户界面
-
目标:在屏幕上创建一个计分板,显示当前收集到的物品数量。
-
核心概念:
- Canvas:UI 的画布,所有 UI 元素都必须放在 Canvas 下。
- Text - TextMeshPro:用于显示文本的 UI 元素(推荐使用,比旧的 Text 功能更强)。
- 脚本管理全局状态:创建一个
GameManager脚本来管理分数等全局数据。
-
操作步骤:
-
在层级视图中右键,选择 UI -> Canvas,这会自动创建一个 Canvas 和一个 EventSystem。
-
在 Canvas 下右键,选择 UI -> Text - TextMeshPro,这会自动创建一个 TextMeshPro 对象。
-
调整 Text 对象的位置和大小,在检查器中修改其文本内容,"Score: 0"。
-
创建一个新的 C# 脚本
GameManager:using UnityEngine; using TMPro; // 引入 TextMeshPro 命名空间 public class GameManager : MonoBehaviour { public static GameManager instance; // 单例模式,方便其他脚本访问 public int score = 0; public TextMeshProUGUI scoreText; // 在检查器中拖拽赋值 void Awake() { if (instance == null) instance = this; else Destroy(gameObject); } public void AddScore(int amount) { score += amount; scoreText.text = "Score: " + score; } } -
将
GameManager脚本拖拽到场景中(比如一个空的游戏对象上)。 -
选中
GameManager对象,在检查器中找到Score Text字段,将场景中的 TextMeshPro 对象拖拽进去。 -
修改
CollectibleItem脚本,当被收集时调用GameManager:// 在 CollectibleItem.cs 中 using UnityEngine; public class CollectibleItem : MonoBehaviour { void OnCollisionEnter(Collision collision) { if (collision.gameObject.CompareTag("Player")) { Debug.Log("你收集了一个物品!"); // 调用 GameManager 的 AddScore 方法 GameManager.instance.AddScore(10); // 每个物品加10分 Destroy(gameObject); } } } -
点击播放,当你收集物品时,屏幕上的分数会更新。
-
第三部分:项目实战 (小试牛刀)
将学到的知识整合起来,完成一个简单但完整的小游戏。
项目:简单的 3D 收集游戏
游戏设计:
- 玩家控制一个球体。
- 场景中随机分布着一些金色的收集品(立方体)。
- 收集所有物品后,显示胜利信息。
实现步骤:
-
场景搭建:创建一个较大的平面作为地面,放置玩家球体。
-
生成收集品:
- 创建一个空的 GameObject,命名为
SpawnManager。 - 创建一个 C# 脚本
SpawnManager,用于在场景中随机生成多个收集品。// SpawnManager.cs using UnityEngine; using System.Collections.Generic;
public class SpawnManager : MonoBehaviour { public GameObject collectiblePrefab; public int numberOfCollectibles = 10; public Vector3 spawnAreaSize = new Vector3(20, 0, 20);
void Start() { for (int i = 0; i < numberOfCollectibles; i++) { Vector3 randomPosition = new Vector3( Random.Range(-spawnAreaSize.x / 2, spawnAreaSize.x / 2), 0.5f, // 稍微抬高一点,避免陷入地面 Random.Range(-spawnAreaSize.z / 2, spawnAreaSize.z / 2) ); Instantiate(collectiblePrefab, randomPosition, Quaternion.identity); } }* 将你的收集品预制体(先创建一个收集品,从层级视图拖拽到项目视图,就变成了预制体)拖拽到 `SpawnManager` 脚件的 `Collectible Prefab` 字段。 - 创建一个空的 GameObject,命名为
-
胜利条件:
-
修改
GameManager,添加一个检查胜利的方法。// GameManager.cs public class GameManager : MonoBehaviour { // ... 其他代码 ... public void AddScore(int amount) { score += amount; scoreText.text = "Score: " + score; CheckWinCondition(); } void CheckWinCondition() { // 假设总共有10个物品 if (score >= 10 * 10) // 因为每个10分 { Debug.Log("恭喜你赢了!"); // 可以在这里显示一个胜利的UI文本 } } }
-
-
完成与优化:运行游戏,测试流程,你可以添加音效、粒子特效(当收集时)、更美观的材质和光照,让游戏更完善。
第四部分:进阶方向与学习资源
当你掌握了基础后,可以探索更广阔的领域。
进阶学习方向
- 动画系统:学习使用
Animator控制角色动画,如行走、攻击。 - UI 系统:深入学习 UI,如按钮、滑块、生命条、主菜单等。
- 场景管理:学习如何加载和卸载不同的场景(如从主菜单进入游戏)。
- 寻路系统:让 AI 角色能够智能地在地图上移动。
- Shader Graph:通过可视化节点创建自定义的材质和着色器,无需编写代码。
- 性能优化:学习 Profiler 分析性能,优化 Draw Call、内存使用等。
- VR/AR 开发:利用 Unity 的 XR Interaction Toolkit 开发虚拟现实或增强现实应用。
优质学习资源
-
官方资源:
- Unity Learn:https://learn.unity.com/ (官方免费教程,质量极高,从入门到专业应有尽有)
- Unity User Manual:https://docs.unity3d.com/Manual/index.html (最权威的参考手册)
- Scripting Reference:https://docs.unity3d.com/ScriptReference/index.html (所有 API 的详细说明)
-
视频教程:
- Brackeys (YouTube): 虽然已停止更新,但留下了大量经典、通俗易懂的入门教程,是很多人的启蒙老师。
- Sebastian Lague (YouTube): 专注于算法、程序化生成和高质量游戏设计,内容非常有深度。
- Code Monkey (YouTube): 提供大量实用的 C# 编程和 Unity 功能实现教程。
- B站/YouTube: 搜索 "Unity 教程",有大量国内外的优秀 UP 主持续更新内容。
-
社区与问答:
- Unity Forum:https://forum.unity.com/ (官方论坛)
- Reddit (r/Unity3D):https://www.reddit.com/r/Unity3D/ (非常活跃的社区,可以看作品、提问、分享)
- Stack Overflow:https://stackoverflow.com/questions/tagged/unity3d (适合解决具体的编程问题)
学习建议
- 动手实践:看十遍不如自己做一遍,跟着教程做,然后尝试自己修改、添加新功能。
- 多看优秀项目:在 Unity Asset Store、GitHub、Itch.io 上看别人的开源项目和游戏,学习他们的实现思路。
- 不要怕犯错:调试是编程的一部分,学会看错误信息、使用 Debug.Log 是必备技能。
- 从小开始:不要一开始就想做 3A 大作,先从克隆经典小游戏(如 Pong, Flappy Bird)开始,逐步建立信心。
祝你在 Unity 的世界里探索愉快,创造出属于自己的精彩游戏!
