Unity 3D 中文入门完整指南
第一部分:准备工作与基础知识
第一章:初识 Unity
-
什么是 Unity?
(图片来源网络,侵删)- Unity 是一款由 Unity Technologies 开发的跨平台游戏引擎,你可以用它来创建 2D、3D、VR 和 AR 游戏及应用程序。
- 核心优势:强大的编辑器、庞大的资源商店、活跃的社区、支持发布到几乎所有主流平台(Windows, macOS, iOS, Android, PlayStation, Xbox, Switch 等)。
-
安装 Unity Hub 和 Unity Editor
- Unity Hub:一个管理工具,用于安装、管理和切换不同版本的 Unity 编辑器。
- Unity Editor:实际的开发环境,也就是你用来“做游戏”的软件。
- 安装步骤:
- 访问 Unity 官网:https://unity.com/cn
- 下载并安装 Unity Hub。
- 打开 Unity Hub,点击“安装”选项卡,然后点击“安装编辑器”。
- 在安装界面,你可以选择一个 LTS (Long-Term Support) 版本,3.x,LTS 版本更稳定,推荐初学者使用。
- 在“模块”选择中,必须勾选 “Built-in render pipeline”(内置渲染管线)和 “Windows Build Support” (Windows 构建支持,用于打包 PC 版游戏)。
- 点击“下一步”并完成安装。
-
创建你的第一个项目
- 打开 Unity Hub,点击“新建”项目。
- 选择 3D (Core) 模板,给项目起一个名字(
MyFirstGame),选择一个存放位置,然后点击“创建”。 - 等待 Unity Editor 加载完成,你将看到熟悉的默认场景。
第二章:Unity 编辑器核心界面详解
当你创建新项目后,会看到一个包含多个窗口的界面,这些是 Unity 的核心组成部分。
-
Scene (场景) 视图
(图片来源网络,侵删)- 作用:这是你的“工作台”,你可以在这里摆放、移动、旋转和缩放游戏中的所有物体(如角色、地形、灯光等)。
- 操作:
- 鼠标左键拖动:旋转视角。
- 鼠标右键拖动:平移视角。
- 鼠标滚轮:缩放视角。
- F 键:将选中的物体聚焦到视图中央。
-
Game (游戏) 视图
- 作用:这是你“玩游戏”的窗口,它显示的是最终玩家在游戏中看到的画面,你可以在这里测试你的游戏。
- 控制:点击左上角的播放按钮(▶️)开始运行游戏,再次点击停止。
-
Hierarchy (层级) 面板
- 作用:一个场景中所有物体的“家谱”或“列表”,场景中的每一个物体(摄像机、灯光、角色等)都会在这里显示为一个条目。
- 理解:物体的层级关系决定了它们的组织结构,比如一个“玩家”物体下可以有一个“手臂”子物体。
-
Project (项目) 面板
- 作用:你的“资源管理器”,这里存放着构成你游戏的所有文件,包括:
- 脚本:用 C# 编写的代码文件(
.cs)。 - 预制体:可重复使用的游戏物体模板(
.prefab)。 - 材质:定义物体表面外观的文件(
.mat)。 - 模型:3D 模型文件(
.fbx,.obj)。 - 贴图:图片文件(
.jpg,.png)。 - 场景:游戏的不同关卡(
.unity)。
- 脚本:用 C# 编写的代码文件(
- 注意:不要在 Windows 资源管理器中直接移动或删除这里的文件,请在 Unity 内部进行操作。
- 作用:你的“资源管理器”,这里存放着构成你游戏的所有文件,包括:
-
Inspector (检查器) 面板
(图片来源网络,侵删)- 作用:物体的“属性表”,当选中 Hierarchy 或 Project 面板中的任何一个物体时,Inspector 会显示该物体的所有组件和属性。
- 理解:这是你修改物体参数的地方,你可以改变一个立方体的颜色、大小,或者为它添加新的功能(脚本)。
-
其他重要面板
- Console (控制台):显示编译错误、警告和调试信息,写代码时,这里是你的好朋友。
- Package Manager (包管理器):用于管理 Unity 的官方和第三方插件。
第二部分:核心概念与基础操作
第三章:游戏对象 与组件
这是 Unity 的核心思想,一定要理解!
- 游戏对象:可以理解为“东西”,任何你能在场景中看到或与之交互的东西都是一个 GameObject,它本身什么也做不了,只是一个“空壳”。
- 组件:是赋予游戏对象“功能”和“数据”的积木,每个组件都负责一块特定的功能。
- Transform (变换):每个 GameObject 都自带的最基本组件,它决定了物体的位置、旋转和缩放。
- Mesh Filter (网格过滤器):决定了物体的“形状”(比如立方体、球体)。
- Mesh Renderer (网格渲染器):决定了物体的“外观”,比如颜色、贴图。
- Camera (摄像机):让玩家能看到世界的“眼睛”。
- Light (灯光):照亮场景的光源。
- Script (脚本):你写的 C# 代码,是让游戏“活”起来的关键。
关系:GameObject (容器) + Components (功能模块) = 一个有功能的游戏实体。
第四章:你的第一个 C# 脚本
让物体动起来!
-
创建脚本:
- 在 Project 面板中,右键点击 -> Create -> C# Script。
- 将其命名为
MoveCube。
-
编写代码:
- 双击
MoveCube.cs文件,它会自动用 Visual Studio (或你安装的其他代码编辑器) 打开。 - 删除默认的
Start()和Update()函数之间的所有内容,输入以下代码:
using UnityEngine; public class MoveCube : MonoBehaviour { // Update is called once per frame void Update() { // 获取当前物体的 Transform 组件 // 每一帧,将物体在 X 轴上移动 0.01 个单位 transform.Translate(Vector3.right * 0.01f); } }- 代码解释:
using UnityEngine;:引入 Unity 的核心库。public class MoveCube : MonoBehaviour:定义一个名为MoveCube的类,它继承自MonoBehaviour,所有 Unity 脚本都必须继承自MonoBehaviour才能附加到游戏对象上。void Update():这是一个 Unity 的“魔法函数”,它会在每一帧被自动调用,非常适合处理持续性的动作,比如移动、检测输入等。transform.Translate(...):调用物体的Transform组件的Translate方法,使其移动。Vector3.right代表 X 轴正方向。
- 双击
-
附加脚本到物体:
- 回到 Unity 编辑器。
- 从 Project 面板中,将
MoveCube.cs脚本拖拽到 Hierarchy 面板中的Cube物体上。 - 选中
Cube物体,在 Inspector 面板中,你会看到它现在多了一个Move Cube (Script)组件。
-
运行游戏:
- 点击顶部的播放按钮(▶️)。
- 你会发现场景中的立方体开始向右移动了!点击停止按钮(⏹️)停止游戏。
第三部分:实战小项目:会跳跃的立方体
现在我们来做一个更完整的交互:让立方体响应键盘按键跳跃。
第五章:获取用户输入
-
修改脚本:
- 打开
MoveCube.cs脚本,修改Update()函数如下:
void Update() { // 获取水平轴的输入值 (A/D 或 左/右箭头) float moveHorizontal = Input.GetAxis("Horizontal"); // 获取垂直轴的输入值 (W/S 或 上/下箭头) float moveVertical = Input.GetAxis("Vertical"); // 创建一个移动向量 Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); // 应用移动 transform.Translate(movement * speed * Time.deltaTime); }- 问题:
speed是什么?我们还没有定义它。
- 打开
-
添加公共变量:
- 在
MoveCube类的开头(Update函数外面),添加以下代码:
public class MoveCube : MonoBehaviour { // 在 Inspector 面板中可调节的变量 public float speed = 5.0f; void Update() { // ... (Update 函数内容不变) } }- 解释:
public关键字使得这个变量可以在 Unity 的 Inspector 面板中被修改。float speed = 5.0f;定义了一个浮点数变量speed,并赋初值为 5.0。- 回到 Unity,选中
Cube,你会发现在 Inspector 面板的Move Cube组件下,多了一个 Speed 字段,你可以在这里实时调整移动速度。
- 在
-
添加跳跃功能:
- 我们还需要一个变量来控制跳跃力度,跳跃不是持续的,所以应该用
Update检测按键,用另一个函数Start或FixedUpdate来执行跳跃。 - 完整的
MoveCube.cs脚本如下:
using UnityEngine; public class MoveCube : MonoBehaviour { public float speed = 5.0f; public float jumpForce = 7.0f; private bool isGrounded = false; // 是否在地面上 private Rigidbody rb; // 刚体组件的引用 // Start is called before the first frame update void Start() { // 获取物体上的 Rigidbody 组件 rb = GetComponent<Rigidbody>(); } // Update is called once per frame void Update() { float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = Input.GetAxis("Vertical"); Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); transform.Translate(movement * speed * Time.deltaTime); // 如果玩家按下了空格键,并且物体在地面上,则执行跳跃 if (Input.GetButtonDown("Jump") && isGrounded) { // 给刚体一个向上的力 rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse); isGrounded = false; // 跳跃后立刻设置为非地面状态 } } // 当物体与另一个物体碰撞时调用 private void OnCollisionEnter(Collision collision) { // 如果碰撞到的物体名字是 "Ground" if (collision.gameObject.name == "Ground") { isGrounded = true; // 标记为在地面 } } }- 新概念:
Start():这个函数只在游戏开始的第一帧被调用一次,适合用来获取组件、初始化变量。Rigidbody:刚体组件,它能让物体受物理影响,如重力、碰撞、力等,要让物体跳跃,必须给它添加Rigidbody。GetComponent<Rigidbody>():在Start中获取当前物体上的Rigidbody组件,并保存在rb变量中。Input.GetButtonDown("Jump"):检测玩家是否按下了“跳跃”键(默认是空格键)。rb.AddForce(...):给刚体施加一个力,使其跳跃。OnCollisionEnter:当物体发生碰撞时自动调用的函数。isGrounded:一个标志位,用于防止玩家在空中连续跳跃。
- 我们还需要一个变量来控制跳跃力度,跳跃不是持续的,所以应该用
第六章:完善场景
-
创建地面:
- 在 Hierarchy 面板中,右键 -> 3D Object -> Plane,创建一个平面作为地面。
- 选中这个
Plane,在 Inspector 中将其Scale(缩放) 调大一些,(5, 1, 5)。 - 为了方便识别,选中
Plane,在 Inspector 顶部的Tag(标签) 下拉菜单中,选择Add Tag...,点击 号,新建一个名为Ground的标签,然后回到Plane的 Inspector,将其Tag设置为Ground。 - 或者更简单,直接在 Inspector 顶部的
Name(名字) 处,将Plane改名为Ground。
-
添加物理材质(可选,但推荐):
- 在 Project 面板中,右键 -> Create -> Physics Material。
- 将其命名为
Bouncy。 - 选中
Bouncy,在 Inspector 中,调整Bounciness(弹性) 和Friction(摩擦力) 的值。 - 将
Bouncy材质拖拽到场景中的Ground物体上。
-
添加摄像机跟随:
- 为了让摄像机一直跟随我们的立方体,我们可以写一个简单的脚本。
- 创建一个新脚本
CameraFollow。 - 编写代码:
using UnityEngine; public class CameraFollow : MonoBehaviour { public Transform target; // 要跟随的目标 (我们的立方体) public Vector3 offset; // 摄像机与目标的偏移量 void LateUpdate() { // 每一帧的末尾更新摄像机位置 // 摄像机的位置 = 目标的位置 + 偏移量 transform.position = target.position + offset; } }- 将
CameraFollow.cs脚本拖拽到 Hierarchy 中的Main Camera上。 - 选中
Main Camera,在 Inspector 面板中,你会看到Camera Follow组件。 - 点击
Target字段右侧的小圆圈,从弹出的窗口中选择Cube。 - 在
Offset字段中,输入一个合适的偏移值,(0, 5, -10),这样摄像机就会在立方体的斜上方。
第七章:总结与下一步
恭喜你!你已经完成了你的第一个 Unity 小项目:一个可以用 WASD 或方向键移动,用空格键跳跃,并且摄像机会跟随的立方体。
回顾你学到的东西:
- Unity 编辑器的基本布局和操作。
- 游戏对象、组件和脚本的核心理念。
- 如何创建和编写 C# 脚本。
- 如何使用
Update和Start函数。 - 如何获取用户输入 (
Input.GetAxis,Input.GetButtonDown)。 - 如何使用
Rigidbody实现物理效果(跳跃)。 - 如何使用
OnCollisionEnter检测碰撞。 - 如何使用公共变量在 Inspector 中调试参数。
下一步可以学习什么?
- Unity 官方教程:Unity Learn 平台提供了大量高质量、结构化的免费教程,是进阶的最佳途径。
- 学习更多 C#:深入学习面向对象编程、类、继承等,这会让你写出更强大、更优雅的代码。
- UI 系统:学习如何制作游戏中的菜单、血条、计分板等。
- 动画系统:让你的角色动起来。
- 粒子系统:制作火焰、烟雾、魔法特效等。
- 寻路系统:让敌人或 NPC 能够智能地在地图上移动。
学习 Unity 是一个持续的过程,多动手、多尝试、多看别人的代码,你很快就能成为一名优秀的游戏开发者!祝你学习愉快!
