Unity是全球最受欢迎的游戏开发引擎。从独立开发者到大型游戏工作室,无数团队选择Unity来制作他们的游戏作品。无论你想开发手机游戏、电脑游戏还是主机游戏,Unity都能胜任。
本文将从零开始,系统介绍Unity的核心概念和基础操作,覆盖编辑器界面、游戏对象、组件、脚本、物理系统、UI系统、动画系统、光照渲染、资源管理以及发布部署等全流程内容,帮助新手快速建立完整的知识体系。
第一章 Unity是什么
1.1 游戏引擎的作用
游戏引擎是一套软件框架,它为游戏开发提供核心功能组件。渲染图形、模拟物理、处理音频、管理资源、编写脚本,这些通用功能由引擎统一提供,开发者只需专注于游戏本身的创意和玩法。
如果没有引擎,开发者需要从零开始编写图形渲染代码、物理计算代码、音频处理代码,工作量巨大且重复。以渲染一个3D角色为例,开发者需要处理顶点着色器、片段着色器、光照计算、阴影映射、纹理采样等一系列底层图形学问题,还需要考虑不同显卡的兼容性。引擎将这些复杂度封装起来,开发者只需导入模型、添加材质、挂载脚本,几秒钟就能看到一个角色在场景中行走。
Unity这样的引擎将这些通用能力封装成现成的模块,极大降低了游戏开发的门槛。
1.2 Unity的优势
Unity受到广泛欢迎,主要基于以下几个特点。
跨平台能力强是Unity的显著优势。一套代码可以编译发布到超过二十个平台,包括Windows、macOS、Linux、iOS、Android、PlayStation、Xbox、Switch,以及Web浏览器。开发者无需为每个平台重写代码,只需在构建设置中选择目标平台,点击构建按钮即可。Unity会自动处理平台差异,比如屏幕分辨率适配、输入方式映射、文件系统访问等。
资源生态丰富。Unity资源商店Asset Store拥有海量现成资源,从3D模型、动画、音效到完整项目模板、插件工具、着色器特效,应有尽有。开发者可以直接使用这些资源,节省大量时间。许多资源甚至是免费的,独立开发者可以用极低的成本获取专业级的素材。
学习门槛相对较低。Unity采用C#作为脚本语言,这是一门易学且功能强大的编程语言。对于初学者来说,C#比C++更容易上手。C#没有指针操作,不需要手动管理内存,垃圾回收机制自动处理内存释放。C#的类型系统安全,编译时就能发现许多类型错误。
社区活跃,资料丰富。全球有数百万Unity开发者,遇到问题时几乎都能在网上找到解决方案。Unity官方论坛、Stack Overflow、B站、YouTube上有海量教程和问答。Unity官方还提供了完整的文档和示例项目,供开发者参考学习。
1.3 Unity的应用领域
Unity的应用范围远远超出游戏开发。以下是几个典型领域。
游戏开发是Unity的主场。从2D平台跳跃游戏到3D开放世界大作,从手机休闲游戏到PC硬核游戏,Unity都能胜任。代表作包括《原神》《炉石传说》《空洞骑士》《城市天际线》等。
建筑可视化是Unity的重要应用领域。建筑师可以将CAD模型导入Unity,添加材质、灯光、环境效果,制作可交互的虚拟样板间。客户可以用鼠标或VR设备在房子中自由行走,感受空间布局和装修效果。
工业仿真方面,汽车厂商用Unity模拟驾驶体验,飞机制造商用Unity培训维修人员。Unity的物理引擎和渲染能力可以逼真地模拟各种操作场景。
虚拟现实和增强现实领域,Unity是开发VR和AR应用的首选工具。配合Oculus、HTC Vive、HoloLens等设备,可以创建沉浸式的虚拟体验。
第二章 安装与环境配置
2.1 Unity Hub的安装
Unity Hub是管理Unity版本和项目的工具。使用Unity Hub,可以同时安装多个不同版本的Unity编辑器,方便在不同项目间切换。还需要安装Visual Studio或Visual Studio Code作为代码编辑器。
安装步骤如下。
第一步,从Unity官网下载Unity Hub安装程序。官网地址是unity.com,选择下载Unity Hub按钮。
第二步,运行安装程序,按照提示完成安装。安装路径可以保持默认,也可以自定义。
第三步,启动Unity Hub。首次启动时会提示登录Unity账号。
第四步,在左侧菜单中选择安装,点击添加按钮选择要安装的Unity版本。通常选择最新的长期支持版本,这类版本经过充分测试,稳定性最高。如果是学习新功能,可以选择最新Tech Stream版本。
第五步,在Unity Hub中,还需要添加模块。模块包括对应平台的支持,比如iOS Build Support、Android Build Support、WebGL Build Support。如果不确定需要哪些,至少勾选Windows Build Support和Visual Studio。
第六步,打开项目选项卡,点击右上角的新项目按钮。如果是第一次使用,Unity Hub会提示激活许可证。
第七步,如果已有Unity账号,登录即可;如果没有,需要先注册一个免费的个人版账号。个人版完全免费,没有使用期限限制,功能与专业版基本一致,只是启动时会显示个人版标志。
2.2 创建第一个项目
打开Unity Hub,点击新项目按钮。在弹出的窗口中选择3D核心模板,这是最常用的模板。输入项目名称和保存位置,点击创建项目按钮。
Unity编辑器将启动并打开新项目。首次启动可能需要几分钟,Unity会编译一些内部资源。
建议初学者给自己的项目取一个有意义的名称,比如MyFirstGame,保存在容易找到的位置,比如文档文件夹下的Unity Projects目录。
第三章 Unity编辑器界面
3.1 五大核心窗口
Unity编辑器由多个可调整的窗口组成,最核心的是以下五个窗口。
场景视图是编辑游戏世界的画布。在这里可以摆放物体、调整位置旋转缩放、设置灯光和摄像机。场景视图显示的是游戏世界的编辑状态,不是玩家最终看到的画面。在场景视图中,可以使用鼠标右键旋转视角,按住鼠标中键平移视角,使用滚动滚轮拉近拉远。
游戏视图是玩家看到的画面预览。这里显示的是游戏摄像机捕捉到的内容。点击运行按钮后,游戏视图会展示实际运行效果。在运行状态下,可以在场景视图中观察物体的变化,但无法编辑。停止运行后,所有修改都会丢失。
层级视图列出了当前场景中的所有游戏对象。点击对象可以选中它,拖拽可以调整父子关系。父级对象移动、旋转、缩放时,所有子级对象会跟着变化。层级视图顶部的搜索框可以按名称快速筛选对象。
项目视图显示项目中的所有资源文件,包括脚本、模型、材质、贴图、音频等。资源按照文件夹组织,可以像操作文件系统一样管理。创建新文件夹的方法是右键点击,选择创建,然后选择文件夹。
检视视图显示当前选中对象的详细属性。在这里可以修改组件参数、添加或删除组件。检视视图是编辑游戏对象的核心工具。不同的对象类型,检视视图中显示的内容也不同。
3.2 编辑器布局调整
Unity编辑器支持多种预设布局,可以通过右上角的布局按钮切换。常用布局包括默认布局、宽屏布局和2D模式布局。也可以自由拖拽窗口边缘调整大小,或点击窗口右上角的三个点菜单将其停靠到其他位置。
布局可以保存为自定义布局。调整好窗口位置和大小后,点击布局按钮,选择保存布局,输入布局名称,下次就可以直接切换回来。
3.3 工具栏介绍
Unity编辑器顶部的工具栏包含以下重要功能。
变换工具用于移动、旋转、缩放物体。快捷键Q是手形工具,用于平移场景视图。W是移动工具,用于移动选中的物体。E是旋转工具,用于旋转选中的物体。R是缩放工具,用于缩放选中的物体。T是矩形工具,适合2D UI元素调整。Y是变换工具,可以同时移动、旋转、缩放。
播放控制按钮包括播放、暂停、逐帧运行。点击播放按钮开始运行游戏,点击暂停按钮暂停游戏,点击逐帧按钮可以一帧一帧地前进,方便调试。
坐标切换按钮可以在世界坐标和局部坐标之间切换。中心切换按钮可以在物体中心点和几何中心点之间切换。
第四章 游戏对象与组件
4.1 游戏对象
游戏对象是Unity中的核心概念。场景中的一切物体都是游戏对象,包括角色、道具、墙壁、灯光、摄像机等。
一个空游戏对象只有位置、旋转、缩放三个属性,不具备任何其他功能。要想让游戏对象具有视觉表现或行为逻辑,需要给它添加组件。
创建游戏对象有多种方式。通过菜单栏,选择GameObject,然后选择需要创建的物体类型,如Cube、Sphere、Capsule等。通过层级视图的右键菜单也可以创建游戏对象。还可以通过脚本动态创建,使用Instantiate方法。
4.2 组件
组件是附加到游戏对象上的功能模块。一个游戏对象可以有多个组件,组件的组合决定了这个游戏对象的行为。
常见的组件包括以下几种。
Transform组件是最基础也是最重要的组件,控制游戏对象的位置、旋转和缩放。任何游戏对象都自带Transform组件,无法删除。Transform组件的属性包括Position(X, Y, Z)、Rotation(X, Y, Z)、Scale(X, Y, Z)。
Mesh Filter组件指定游戏对象使用哪个网格模型。例如一个球体模型或一个立方体模型。网格模型定义了物体的形状,由许多小三角形面组成。
Mesh Renderer组件负责渲染网格模型,需要搭配材质才能正确显示颜色和纹理。材质定义了物体表面的外观,包括颜色、贴图、光滑度、金属度等属性。
Collider组件用于检测物理碰撞。Box Collider是盒状碰撞器,适合立方体形状的物体。Sphere Collider是球形碰撞器,适合球形物体。Capsule Collider是胶囊形碰撞器,适合角色等近似人形的物体。Mesh Collider是网格形状碰撞器,精确匹配模型形状,但性能开销较大,适合静态物体。
Rigidbody组件让游戏对象受到物理引擎影响,包括重力作用、受力移动、碰撞响应等。移动游戏对象的最佳实践是给Kinematic物体使用Transform移动,给物理物体使用Rigidbody移动。
4.3 预制件
预制件是Unity中非常实用的功能。它可以将一个配置好的游戏对象保存为资源文件,然后在场景中多次复用。更重要的是,修改预制件源文件时,场景中所有使用该预制件的实例都会自动同步更新。
创建预制件的方法非常简单。在层级窗口中选中游戏对象,将其拖拽到项目窗口中即可。预制件在项目窗口中以蓝色方块图标显示。
预制件有两种类型。普通预制件是完全独立的,对实例的修改不会影响源文件。变体预制件继承自另一个预制件,源文件变化时变体也会变化。
第五章 坐标系与变换
5.1 左手坐标系
Unity使用左手坐标系。X轴指向右方,Y轴指向上方,Z轴指向前方。在3D空间中,物体的位置由三个坐标值确定。X值增加时物体向右移动,Y值增加时物体向上移动,Z值增加时物体向前移动。
理解坐标系非常重要,因为它决定了移动、旋转、缩放等操作的含义。例如,Translate(Vector3.forward)是沿Z轴正方向移动。
5.2 世界坐标与局部坐标
世界坐标是场景的绝对坐标系,以场景原点为基准。所有游戏对象在世界中都有唯一的位置坐标。
局部坐标是以父级游戏对象为基准的坐标系。没有父级的游戏对象,其局部坐标等于世界坐标。当父级移动时,子级的世界坐标也会变化,但局部坐标保持不变。
在场景视图中,可以切换坐标系的显示方式。点击工具栏上的局部/世界切换按钮,在两种模式间切换。世界模式下的移动箭头总是沿着世界轴方向,局部模式下的移动箭头总是沿着物体自身的轴方向。
5.3 移动、旋转、缩放
在场景视图中操作游戏对象有三种基本方式。
移动操作使用平移工具。拖拽红色箭头让物体沿X轴移动,拖拽绿色箭头沿Y轴移动,拖拽蓝色箭头沿Z轴移动。拖拽红色与绿色箭头之间的平面小方块可以在XY平面上移动,类似地有XZ和YZ平面。
旋转操作使用旋转工具。球体上的红绿蓝圆环对应X、Y、Z轴的旋转,最外圈的灰环是围绕屏幕方向的旋转。
缩放操作使用缩放工具。拖拽红色轴末端的方块沿X轴缩放,拖拽绿色轴末端的方块沿Y轴缩放,拖拽蓝色轴末端的方块沿Z轴缩放。拖拽中心位置的立方体可以整体缩放。
5.4 四元数与欧拉角
旋转在3D空间中有两种表示方式。欧拉角使用X、Y、Z三个角度表示旋转,直观易懂,但存在万向锁问题。当两个轴对齐时,会失去一个旋转自由度。四元数使用四个值表示旋转,没有万向锁,适合插值运算,但不易直观理解。
Transform组件的Rotation属性显示为欧拉角,方便编辑。但在代码中,Transform.rotation是四元数类型。
第六章 脚本开发基础
6.1 C#脚本结构
Unity脚本使用C#语言编写。一个基本的Unity脚本通常包含以下结构。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MyScript : MonoBehaviour { void Start() { // 初始化代码,在游戏开始时执行一次 } void Update() { // 每帧执行的代码 } }所有脚本必须继承自MonoBehaviour类,这个类提供了将普通C#类挂载到游戏对象上的能力。MonoBehaviour的派生类可以挂载到游戏对象上,并响应Unity的生命周期事件。
脚本文件名必须与类名完全一致。例如,MyScript.cs文件中定义的类名必须是MyScript。
6.2 生命周期函数
Unity脚本有一系列预定义的生命周期函数,它们在特定时机自动被调用。
Awake在脚本实例被加载时调用,在任何Start函数之前执行。适合进行初始化设置。Awake在对象被激活时就会调用,即使脚本组件被禁用。
Start在脚本启用后、第一次Update之前调用,且只执行一次。适合初始化需要在所有Awake完成后执行的逻辑。如果脚本被禁用,Start不会执行,直到脚本被启用。
Update每一帧调用一次,执行频率与帧率相关。适合处理输入响应、移动等需要持续执行的逻辑。帧率越高,Update调用越频繁。
FixedUpdate以固定时间间隔调用,默认每秒五十次,即每次间隔零点零二秒。适合处理物理相关逻辑,因为物理计算需要稳定的时间步长。
LateUpdate在所有Update完成后调用,适合跟随摄像机等需要其他物体移动完成后再更新的逻辑。
OnEnable在脚本组件被启用时调用。OnDisable在脚本组件被禁用时调用。OnDestroy在脚本组件被销毁时调用。
6.3 访问组件
脚本中经常需要访问其他组件。获取组件有以下常用方法。
// 获取同一游戏对象上的组件 Rigidbody rb = GetComponent<Rigidbody>(); // 获取子物体上的组件 Rigidbody rbChild = GetComponentInChildren<Rigidbody>(); // 获取父物体上的组件 Rigidbody rbParent = GetComponentInParent<Rigidbody>(); // 获取同一对象上的多个组件,返回数组 Rigidbody[] rbs = GetComponents<Rigidbody>();在Start或Awake方法中获取组件引用并缓存,避免在Update中频繁调用GetComponent。
6.4 变量在编辑器中的显示
在脚本中定义的公共变量会在Unity编辑器的检视视图中显示,方便调整数值而无需修改代码。
public class Player : MonoBehaviour { public float speed = 5f; // 在编辑器中显示 private int health = 100; // 不在编辑器中显示 [SerializeField] private string playerName; // 强制显示 }常用的属性标签包括以下几个。
SerializeField强制显示私有变量。HideInInspector隐藏公共变量。Range限制数值范围并显示滑动条。Tooltip给变量添加提示文字。
6.5 移动与输入
控制游戏对象移动是游戏开发的基本需求。以下是一个简单的移动控制脚本。
public class PlayerController : MonoBehaviour { public float speed = 5f; void Update() { float horizontal = Input.GetAxis(Horizontal); float vertical = Input.GetAxis(Vertical); Vector3 direction = new Vector3(horizontal, 0, vertical); transform.Translate(direction * speed * Time.deltaTime); } }Time.deltaTime是上一帧到当前帧的时间间隔。使用deltaTime可以使移动速度与帧率无关,无论帧率高低,物体每秒移动的距离都相同。
Input类提供了读取键盘、鼠标、手柄输入的方法。GetAxis返回平滑的模拟值,范围是负一到正一。GetButton按下时返回true。GetKey检测特定键盘按键。
第七章 物理系统
7.1 刚体组件
Rigidbody组件让游戏对象受到物理引擎的控制。挂载Rigidbody后,物体会受到重力影响自动下落,可以与其他物体发生碰撞,可以接受力的作用而产生移动。
Rigidbody rb = GetComponent<Rigidbody>(); rb.AddForce(Vector3.up * 10f, ForceMode.Impulse);AddForce方法给物体施加一个力,ForceMode参数决定力的作用方式。
ForceMode.Force是连续力,与质量成正比,适用于持续推力。ForceMode.Acceleration是加速度,与质量无关,适用于外星环境。ForceMode.Impulse是瞬时冲量,与质量成正比,适用于爆炸、跳跃等一次性推力。ForceMode.VelocityChange是速度变化,与质量无关。
Rigidbody的重要属性包括Mass质量,影响受力和碰撞效果。Drag空气阻力,阻碍物体移动。Angular Drag角阻力,阻碍物体旋转。Use Gravity是否受重力影响。Is Kinematic是否受物理控制,常用于主动控制又需要碰撞检测的物体。
7.2 碰撞器
碰撞器组件定义了物体的碰撞形状。常见类型包括以下几种。
Box Collider是最常用的碰撞器,性能开销小,适合立方体形状的物体。可以调整中心位置和长宽高尺寸。
Sphere Collider适合球形物体,性能开销也很小。可以调整中心位置和半径。
Capsule Collider适合角色等圆柱形物体,可以调整高度和半径。
Mesh Collider使用模型的精确形状作为碰撞体,精度最高但性能开销也最大,适合静态物体。
碰撞器的属性包括Is Trigger是否作为触发器,勾选后不再产生物理碰撞,而是触发OnTrigger事件。Material物理材质,定义摩擦力和弹力。
7.3 物理材质
物理材质决定碰撞时的物理行为。创建物理材质的方法是在项目窗口中右键点击,选择创建,然后选择物理材质。
物理材质的属性包括Dynamic Friction动摩擦系数,物体滑动时的摩擦力。Static Friction静摩擦系数,物体静止时的摩擦力。Bounciness弹力系数,决定碰撞后的反弹程度。Friction Combine和Bounce Combine决定摩擦力与弹力的组合方式。
7.4 碰撞检测与触发检测
碰撞检测用于处理物体间的物理接触。以下代码演示了碰撞事件的响应。
void OnCollisionEnter(Collision collision) { Debug.Log(与 + collision.gameObject.name + 发生碰撞); } void OnCollisionStay(Collision collision) { // 碰撞持续期间每帧调用 } void OnCollisionExit(Collision collision) { // 碰撞结束时调用 }触发检测需要将Collider的Is Trigger属性勾选,用于检测物体进入、停留、离开区域而不产生物理碰撞。
void OnTriggerEnter(Collider other) { Debug.Log(进入触发区域); } void OnTriggerStay(Collider other) { // 在触发区域内每帧调用 } void OnTriggerExit(Collider other) { // 离开触发区域时调用 }碰撞检测需要两个物体都有Collider,且至少有一个有Rigidbody。触发器检测需要至少一个物体有Rigidbody。
第八章 UI系统
8.1 Canvas
Canvas是Unity UI系统的根组件。所有UI控件必须放置在Canvas之下。
创建Canvas的方法是在层级窗口中右键点击,选择UI,然后选择Canvas。Canvas会自动创建并附带一个EventSystem对象,后者负责处理UI事件的派发。
Canvas的渲染模式有三种选择。Screen Space - Overlay是最常用模式,UI始终覆盖在游戏画面上,不受摄像机影响。Screen Space - Camera模式中,UI在摄像机前方的平面上渲染,可以受摄像机效果影响。World Space模式中,UI像3D物体一样存在于世界中,适合血条、名字标签等跟随角色的UI元素。
8.2 Rect Transform
UI控件使用Rect Transform组件替代普通Transform。Rect Transform比Transform多出锚点、轴心点、宽高等属性。
锚点决定UI控件相对于父级的位置和缩放方式。当父级大小变化时,UI控件会根据锚点自动调整位置和大小。
轴心点是UI控件自身的中心点。旋转和缩放围绕轴心点进行。
8.3 常用UI控件
Text控件用于显示文字,可以调整字体、大小、颜色、对齐方式、行间距、字体样式等。文字内容可以动态修改,通过获取Text组件并设置text属性。
Image控件用于显示图片,可以设置源图像、颜色、材质、图像类型等。图像类型有Simple普通显示、Sliced九宫格拉伸、Tiled平铺、Filled填充显示进度。
Button控件是可点击的按钮。用户点击时触发事件。可以在检视视图的OnClick区域添加按钮被点击时要执行的函数。可以拖拽目标对象,选择要调用的方法。也可以通过代码添加监听器。
Slider控件是滑动条,适合控制音量、进度等连续数值。Sliders提供了最小值、最大值、当前值的属性设置。
Toggle控件是开关或复选框,可以设置是否勾选。Toggle Group可以将多个Toggle分组,实现互斥选择。
Scroll View控件是带滚动条的视图区域,适合展示列表内容。Scroll View包含Viewport视图窗口和Scrollbar滚动条。
Input Field控件是输入框,用户可以输入文本。可以设置内容类型,如标准文本、整数、小数、密码等。
Dropdown控件是下拉菜单,适合选项较多的选择场景。
8.4 UI事件响应
UI控件可以响应多种用户交互事件。通过添加Event Trigger组件,可以响应点击、悬停、拖拽、选择等事件。
常用的UI事件包括指针进入、指针离开、指针点击、指针拖拽、开始拖拽、结束拖拽等。
第九章 动画系统
9.1 动画剪辑
动画剪辑是存储动画数据的资源文件。它记录了一个对象在时间轴上的变换信息,如位置、旋转、缩放的变化序列,也可以记录材质属性、颜色变化、脚本变量值等。
创建动画剪辑的方法是选中游戏对象,打开Animation窗口,点击Create按钮并命名新动画,在窗口中添加关键帧并调整属性值。
动画窗口的常用操作包括录制模式、添加关键帧、移动关键帧、编辑曲线等。红色录制按钮开启后,对物体属性的修改会自动记录为关键帧。
关键帧之间的变化可以通过曲线编辑来调整插值方式。曲线的形状决定了动画的运动节奏。
9.2 动画控制器
动画控制器管理动画状态之间的切换。它是一个状态机,定义了各种动画状态和状态间的过渡条件。
创建动画控制器的方法是在项目窗口中右键点击,选择创建,然后选择动画控制器。创建完成后,双击打开Animator窗口,将动画剪辑拖入其中,建立状态之间的过渡。
动画状态之间的切换可以通过参数控制。常见参数类型有Float浮点型、Int整型、Bool布尔型、Trigger触发器型。
过渡设置中可以调整过渡持续时间、退出时间、条件等参数。过渡持续时间决定从一个状态切换到另一个状态需要多少秒。
9.3 动画层与遮罩
动画层用于同时播放多个动画。例如,角色下半身播放走路动画,上半身同时播放射击动画。
动画层的权重决定该层动画的影响程度。遮罩可以指定动画影响的骨骼范围。
9.4 控制动画的脚本
以下代码展示了如何通过脚本控制动画参数。
public class PlayerAnimation : MonoBehaviour { private Animator animator; void Start() { animator = GetComponent<Animator>(); } void Update() { float speed = Input.GetAxis(Vertical); animator.SetFloat(Speed, speed); if (Input.GetKeyDown(KeyCode.Space)) { animator.SetTrigger(Jump); } } }SetFloat方法设置浮点型参数。SetInt方法设置整型参数。SetBool方法设置布尔型参数。SetTrigger方法触发触发器型参数。
第十章 资源管理
10.1 资源导入
Unity支持多种资源格式的导入。常见的3D模型格式有FBX、OBJ。FBX是最推荐的格式,支持骨骼动画、材质嵌入、多网格合并等特性。
图片格式有PNG、JPG、TGA。PNG支持透明通道,适合需要透明背景的素材。JPG文件体积小,适合不透明的场景。TGA是无压缩格式,适合需要原始质量的素材。
音频格式有MP3、WAV、OGG。MP3文件体积小,适合背景音乐。WAV无损质量,适合音效。OGG是开源格式,平衡质量和体积。
导入资源的方法非常简单,直接将文件拖拽到项目窗口即可。Unity会自动处理并生成对应的资源文件。
10.2 预制件
预制件是保存游戏对象配置的便捷方式。将层级窗口中的对象拖拽到项目窗口即可创建预制件。
对预制件的修改可以通过在场景中编辑实例然后应用,也可以直接编辑预制件资源。打开预制件编辑模式的方法是双击项目窗口中的预制件图标。
预制件实例可以覆盖部分属性而不影响源文件。在检视视图中修改的属性会加粗显示,表示这是覆盖值。
10.3 ScriptableObject
ScriptableObject是一种特殊的数据容器,可以将数据保存为资源文件,非常适合管理游戏中的配置数据,如角色属性表、物品表、技能表等。
using UnityEngine; [CreateAssetMenu(fileName = NewItem, menuName = Game/Item)] public class Item : ScriptableObject { public string itemName; public int price; public Sprite icon; public GameObject prefab; }创建ScriptableObject资源后,可以在编辑器中填写数据,在运行时通过Resources.Load或Addressables加载使用。
10.4 Addressables资源管理
Addressables是Unity的高级资源管理系统,支持异步加载、依赖管理、远程下载、内存自动回收等功能。
对于大型项目,使用Addressables而不是传统的Resources系统,可以显著优化内存占用和加载性能。
第十一章 光照与摄像机
11.1 光源类型
Unity提供四种光源类型。
Directional Light模拟太阳光,方向性光源照射整个场景,位置不影响光照效果。适合场景主光源。方向光可以旋转,旋转角度决定了光线的方向。
Point Light是点光源,从中心向四周发光,类似于灯泡。光照强度随距离衰减。适合室内灯光、火炬、灯泡等。
Spot Light是聚光灯,呈圆锥形向前发光,类似于手电筒。可以设置圆锥角度和范围。
Area Light是面光源,用于烘焙光照,不能在实时渲染中使用。适合模拟大型发光表面,如天花板灯带。
11.2 光照模式
Unity支持三种光照模式。Baked Indirect模式下,只有间接光照被烘焙,直接光照保持实时。Subtractive模式下,主方向光实时,其他光源烘焙。Baked All模式下,所有光照都被烘焙,性能最好但无法动态变化。
11.3 阴影
光源的阴影可以开启或关闭。开启阴影会增加性能开销。阴影的质量可以通过Shadow Type、Resolution、Bias等参数调整。
软阴影边缘模糊,视觉效果好,性能消耗较大。硬阴影边缘锐利,性能消耗较小。
阴影距离决定了多远范围内的物体投射阴影。超过设定距离的物体不再投射阴影,以提高性能。
11.4 摄像机控制
摄像机是玩家看游戏世界的眼睛。摄像机的视野、位置、旋转决定了玩家看到的画面。
摄像机的重要参数包括Field of View视野角度,仅透视摄像机有效。视角越大,看到的范围越广,物体越小。Near Clipping Plane近裁剪面,摄像机看不到比这个距离更近的物体。Far Clipping Plane远裁剪面,摄像机看不到比这个距离更远的物体。
摄像机有多种常用类型。第一人称摄像机模拟从角色眼睛看到的视角,适合射击游戏和探索类游戏。第三人称摄像机从角色后方或上方跟随角色,适合动作游戏和角色扮演游戏。正交摄像机没有透视效果,适合2D游戏和上帝视角的模拟类游戏。
11.5 摄像机跟随
以下是一个简单的第三人称摄像机跟随脚本。
public class CameraFollow : MonoBehaviour { public Transform target; public Vector3 offset = new Vector3(0, 2, -5); public float smoothSpeed = 0.125f; void LateUpdate() { Vector3 desiredPosition = target.position + offset; Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed); transform.position = smoothedPosition; transform.LookAt(target); } }摄像机通常放在LateUpdate中更新,这样可以确保目标物体已经完成当前帧的移动。
第十二章 粒子系统
12.1 粒子系统概述
粒子系统用于模拟大量小物体的运动,如烟雾、火焰、火花、雨雪、魔法特效等。粒子系统由许多独立的粒子组成,每个粒子有独立的位置、速度、颜色、大小、生命周期等属性。
创建粒子系统的方法是在层级窗口中右键点击,选择效果,然后选择粒子系统。
12.2 主要模块
粒子系统有许多可配置的模块,影响粒子的行为。
Emission模块控制粒子的发射速率和发射次数。可以设置每秒发射数量、每次发射数量等。
Shape模块控制粒子的发射形状。可以是球形、锥形、盒形、半球形等。
Velocity Over Lifetime模块控制粒子在整个生命周期内的速度变化。
Color Over Lifetime模块控制粒子在整个生命周期内的颜色变化。
Size Over Lifetime模块控制粒子在整个生命周期内的大小变化。
Renderer模块控制粒子的渲染方式,包括使用的材质、是否投射阴影等。
第十三章 音频系统
13.1 音频源与音频监听器
Unity的音频系统由两个核心组件构成。
Audio Source音频源是发出声音的组件。挂载到游戏对象上,指定Audio Clip,即可播放声音。可以控制音量、音调、循环、3D空间效果等。
Audio Listener音频监听器是接收声音的组件,相当于听众的耳朵。场景中通常只有一个Audio Listener,挂载在主摄像机上。
13.2 播放音频的脚本
public class SoundManager : MonoBehaviour { public AudioSource audioSource; public AudioClip jumpSound; void Start() { audioSource = GetComponent<AudioSource>(); } void OnCollisionEnter(Collision collision) { audioSource.PlayOneShot(jumpSound); } }PlayOneShot方法适合播放短暂的音效,多个音效可以叠加播放。Play方法播放时,同一时间只能播放一个声音。
13.3 音频混音器
音频混音器Audio Mixer用于管理多个音频轨道的混音。可以创建多个音频组,分别调节音量、添加效果、设置输出设备等。
音频混音器支持快照功能,可以在不同状态之间平滑过渡。例如,进入游戏时降低背景音乐音量,进入设置菜单时降低音效音量。
第十四章 发布与构建
14.1 构建设置
完成游戏开发后,需要将其打包成可执行文件。打开文件菜单,选择构建设置。
在构建设置窗口中,选择目标平台,如PC、Mac、Linux、iOS、Android等,点击添加打开场景按钮,将当前场景加入构建列表,点击构建设置按钮选择输出路径,点击构建按钮开始打包。
构建过程会编译代码、打包资源、生成可执行文件。首次构建可能需要几分钟。
14.2 平台特定设置
不同平台有特殊的设置要求。
发布Windows平台需要注意选择目标架构,通常选择x86_64。填写公司名称、产品名称和版本信息。可以设置是否启用全屏模式、分辨率等。
发布Android平台需要配置包名、版本号、最低API级别、目标API级别、签名密钥等。还需要安装Android Build Support模块和Android SDK。
发布iOS平台需要配置Bundle Identifier、版本号、目标SDK等。需要Mac电脑和Xcode才能完成最终打包。
发布WebGL平台需要注意调整压缩格式、最大内存大小、图形API等参数。WebGL构建的输出是一组HTML、JS、Wasm文件,可以部署到Web服务器上。
14.3 性能优化
发布前需要进行性能优化。减少Draw Call数量,合并材质和网格。使用LOD级别,远处物体使用简化模型。剔除不可见物体的渲染。纹理压缩,减少内存占用。音频压缩,平衡质量和文件大小。
第十五章 学习路径与资源推荐
15.1 入门阶段
入门阶段的目标是熟悉Unity编辑器界面,掌握游戏对象和组件的概念,能编写简单的移动和控制脚本,能发布游戏到本地平台。
预计学习时间两到四周。可以通过观看官方教程视频、跟随入门教程完成第一个简单项目来完成这个阶段的学习。
推荐完成的项目包括简单的3D平台跳跃游戏、2D躲避游戏、滚球收集金币游戏等。
15.2 进阶阶段
进阶阶段的目标是掌握物理系统、动画系统、UI系统的使用,能独立开发小型游戏,了解性能优化的基本方法。
预计学习时间一到两个月。这个阶段建议选择一个类型的小游戏作为练习项目,比如射击游戏、跑酷游戏、塔防游戏或角色扮演游戏。
15.3 高级阶段
高级阶段的目标是掌握着色器编程、网络同步、工具扩展、编辑器插件开发等高级特性。
预计学习时间三个月以上。这个阶段可以尝试开发多人在线游戏、开放世界探索游戏、商业化程度较高的项目。
15.4 资源推荐
学习Unity的优质资源包括以下几个。
Unity官方文档是最权威的参考资料,覆盖所有功能细节。官方教程提供了学习项目,可以下载并研究完整项目代码。Unity Learn平台有系统化的课程,从入门到高级应有尽有。
书籍方面,《Unity游戏开发入门经典》内容全面,适合系统学习。《Unity实战》以项目驱动,边做边学。《Unity着色器和屏幕特效开发》适合想深入图形效果的开发者。
视频教程方面,YouTube上有大量优质免费教程。B站也有很多中文教程,适合英语基础薄弱的初学者。
Unity的学习是一个渐进的过程。从零开始可能感到有些吃力,但每完成一个小功能、每解决一个Bug,都是实实在在的进步。建议每天坚持一点点,哪怕只是半小时,也比周末突击八小时效果好。遇到问题先试着自己解决,解决不了再到社区提问。
游戏开发既有技术的严谨,又有艺术的浪漫。希望这份指南能帮助读者迈出游戏开发的第一步,做出属于自己的游戏。