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脚本通常包含以下结构。
cs
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 访问组件
脚本中经常需要访问其他组件。获取组件有以下常用方法。
cs
// 获取同一游戏对象上的组件
Rigidbody rb = GetComponent<Rigidbody>();
// 获取子物体上的组件
Rigidbody rbChild = GetComponentInChildren<Rigidbody>();
// 获取父物体上的组件
Rigidbody rbParent = GetComponentInParent<Rigidbody>();
// 获取同一对象上的多个组件,返回数组
Rigidbody[] rbs = GetComponents<Rigidbody>();
在Start或Awake方法中获取组件引用并缓存,避免在Update中频繁调用GetComponent。
6.4 变量在编辑器中的显示
在脚本中定义的公共变量会在Unity编辑器的检视视图中显示,方便调整数值而无需修改代码。
cs
public class Player : MonoBehaviour
{
public float speed = 5f; // 在编辑器中显示
private int health = 100; // 不在编辑器中显示
[SerializeField]
private string playerName; // 强制显示
}
常用的属性标签包括以下几个。
SerializeField强制显示私有变量。HideInInspector隐藏公共变量。Range限制数值范围并显示滑动条。Tooltip给变量添加提示文字。
6.5 移动与输入
控制游戏对象移动是游戏开发的基本需求。以下是一个简单的移动控制脚本。
cs
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后,物体会受到重力影响自动下落,可以与其他物体发生碰撞,可以接受力的作用而产生移动。
cs
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 碰撞检测与触发检测
碰撞检测用于处理物体间的物理接触。以下代码演示了碰撞事件的响应。
cs
void OnCollisionEnter(Collision collision)
{
Debug.Log(与 + collision.gameObject.name + 发生碰撞);
}
void OnCollisionStay(Collision collision)
{
// 碰撞持续期间每帧调用
}
void OnCollisionExit(Collision collision)
{
// 碰撞结束时调用
}
触发检测需要将Collider的Is Trigger属性勾选,用于检测物体进入、停留、离开区域而不产生物理碰撞。
cs
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 控制动画的脚本
以下代码展示了如何通过脚本控制动画参数。
cs
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是一种特殊的数据容器,可以将数据保存为资源文件,非常适合管理游戏中的配置数据,如角色属性表、物品表、技能表等。
cs
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 摄像机跟随
以下是一个简单的第三人称摄像机跟随脚本。
cs
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 播放音频的脚本
cs
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,都是实实在在的进步。建议每天坚持一点点,哪怕只是半小时,也比周末突击八小时效果好。遇到问题先试着自己解决,解决不了再到社区提问。
游戏开发既有技术的严谨,又有艺术的浪漫。希望这份指南能帮助读者迈出游戏开发的第一步,做出属于自己的游戏。