unity 最简单的一种解释方式就是:一款跨平台的游戏引擎
游戏引擎 最简单的说法就是:帮我们集成游戏开发所需的大部分功能,在它的基础上,添加和制作游戏视觉、音效、玩法等
游戏引擎一般具有以下几个模块:1.图形;2.音频;3.物理;4.网络;5.脚本
引擎定位Unity作为跨平台游戏引擎,支持2D/3D开发、VR/AR内容及数字孪生项目,2025年已迭代至2023 LTS版本。
核心优势:可视化编辑器+脚本扩展,覆盖Windows/macOS/Linux/Android/iOS等20+平台。
版本选择:新手建议使用Unity Hub安装2023.3.1f1 LTS版本,兼顾稳定性与功能完整性。
开发环境配置
安装流程:通过Unity Hub下载编辑器时需勾选Android Build Support模块,VS2022作为默认脚本编辑器。
工程结构:重点管理Assets(资源)、Library(编译缓存)、ProjectSettings(配置)三大目录。
界面功能区
场景视图:通过WASD键移动视角,Shift+鼠标右键旋转摄像机。
层级面板:支持对象拖拽排序和父子关系绑定,快捷键Ctrl+D快速复制物体。
资源管理技巧
模型导入:设置LOD组减少GPU负载,对非2的N次方尺寸图片启用Sprite Packer压缩。
脚本规范:类名需与文件名一致,使用IEnumerator实现协程避免卡顿。
模式 | 介绍 |
---|---|
2D | 使用Unity内置渲染管道的2D项目。默认使用2D的项目设置,包括图像导入参数,Sprite打包器,场景视图,照明和正交相机。 |
3D | 使用Unity内置渲染管道的3D项目。默认使用3D的项目设置,包括2018的新功能线性颜色空间和渐进式光照贴图。 |
3Dwith Extras(preview) | 与3D模板类似,但包含了后处理,预设和示例内容。 |
High End(preview) | 适用于支持Shader Model 5.0(DX11及以上版本)的平台上的高端图形。该模板使用HD RP,一种现代渲染流水线,其中包括高级材质类型和可配置的混合Tile / Cluster延迟/前向照明架构 |
Lightweight(preview) | 关注主要使用烘焙照明解决方案的项目。这是一个单通道前向渲染器,每个对象都有光照剔除。减少项目的绘图调用次数,使其成为低端硬件的理想解决方案。 |
lightweightVR(preview) | 开发主要使用烘焙照明解决方案的VR项目,重点关注性能 |
一个完整的 Unity 项目包含以下文件
文件夹名 | 作用 |
---|---|
Assets | 工程中所有资源的存放目录 |
Library | Unity自动生成的中间文件目录 |
Packages | Unity的包管理器相关文件存放目录 |
ProjectSettings | 工程的相关设置 |
Temp | 存放一些临时文件,关闭Unity会该目录会自动消失 |
sln文件和csproj文件 | Unity自动生成的Visual Studio工程文件,用于代码编写和调试 |
注意:这些文件中,Assets、Packages、ProjectSettings三个文件夹是必须的,不能删除,其他文件可以由 Unity自动生成。
在存档、拷贝工程源文件时,可以只保留 Assets、Packages、ProjectSettings 这三个文件夹来减小文件体积。
新增工程后打开工程文件夹,会发现 Scenes 文件夹下有两个文件:
SampleScene.unity Unity引擎的场景文件,以.unity为扩展名
SampleScene.unity.meta meta文件保存了对应资源的ID、配置等信息,非常重要
简介
一个游戏包含多个场景(关卡),一个场景包含多个 GameObject(游戏对象)
层级窗口展示Scene(场景)中所有的 GameObject(游戏对象)。这个 GameObject 可以显示出来是一个模型,也可以是一个UI元素,也可以是一个空物体
内容介绍
简介
Inspector窗口类似属性窗口,可以修改、设置选中物体、资源的各种属性(把 C# 脚本添加到 Componemt 里面去,脚本可以读写这些属性,脚本就是这样去实现游戏逻辑的)
使用方式
上图红框位置中有一个复选框,指示了这个物体是否是激活状态。
• 勾选:即激活状态,物体上的所有组件都会运行,简单来说物体会显示出来。
• 不勾选:即隐藏状态,物体不会显示,物体上的组件也不会运行。
修改物体的active状态的快捷键是Shift + Alt +A。
active状态右侧的输入框就是GameObject的名称,也是Hierarchy中显示的名字。修改名称可以直接在这个输入框中修改,然后按回车确认。或者直接在Hierarchy中物体上右键菜单Rename或按F2(Windows)重命名。
Tag 即标签,你可以给一个物体添加标签用于区分不同的物体,比如用朋友和敌人来区分不同的角色。
物体的默认标签都是Untagged即未贴标签。你可以自定义需要的标签内容。点击上图菜单中最下方的Add Tag...会弹出添加Tag的窗口。
注意:每个物体只能有一个Tag
Layer在很多时候(摄像机、物理检测)时非常有用。
物体的默认Layer都是Default即默认。点击上图菜单中最下方的Add Layer...会弹出添加Layer的窗口。
注意:
• Layer不能增加,只能选择8-31之间的数字,只有24个。由于Layer数量有限,在能用Tag时不要使用Layer。而且一定要设计分配好Layer,否则后期修改Layer会是一项浩大的工程。
• 每个物体只能选择一个Layer。
物体之间的碰撞关系(是否碰撞)
物体之间的覆盖关系(谁在谁上层)
矩阵上的是否勾选代表两物体之间是否可以碰撞
一个游戏包含一个或多个Scene。
Scene包含了游戏的环境、UI和各种功能。可以把Scene当成游戏的一个关卡。
当你新建一个Unity的3D工程,默认会打开SampleScene。场景中包含一个Main Camera(相机)和Directional Light(灯光)。
场景中所有的物体都是一个GameObject,例如场景里的角色、房子、石头、灯光、相机、特效等。
但其实,一个GameObject只凭自身什么事情都做不了,它只是个容器
如果你想给GameObject添加属性,让它变成灯光、或者树、或者相机,你需要给它添加Component(组件) 。你可以给一个GameObject添加一个或多个的Component,来让它拥有不同的外观和功能。
Unity 有许多内置组件(如 Box Collider、Capsule Collider),能大大加快你的开发效率,我们还可以使用C# 脚本自定义组件
你可以把空物体当作其他物体的父物体,这就类似一个文件夹,把其他物体放了进去。这样更方便编辑管理(通过父物体整体移动、旋转、隐藏/显示等),Hierarchy的结构也更清晰。
很多组件并没有对应的模型、界面或者特效,强加给任何一个都不合理。这时候使用一个空物体作为组件的容器更合适,比如游戏中全局使用的脚本。
有的模型的轴心点位置可能离模型本身很远或没有放在合适的位置。这会造成物体的位置、旋转与物体本身不符。例如一个轴心有问题的模型,可能出现以下问题:
不同的 Component 为 GameObject 提供不同的功能
如果想要给一个GameObject添加功能,就需要给它添加组件。添加组件有两种方式:手动添加和通过代码添加。
添加组件有多种方式:
在 Unity 中可以直接修改属性,这是游戏测试人员干的事,通过手动修改属性后可以直接体验游戏,可以通过测试得出组件各种属性的最佳值
通过 C# 脚本读其他组件后,读写组件的属性,这是游戏研发人员干的事,这样可以根据不同情况去设置组件的属性值,完成游戏逻辑
Transform是每个GameObject必须有的组件,创建GameObject就会自动附带,而且不能删除,在Inspector中显示在最上面
它的功能是确定一个GameObject在空间中的位置、缩放和旋转
这三个值都是相对于父物体的值,如果没有父物体,就是世界空间(即相对于世界坐标原点)的值
游戏开发中许多地方都会用到图片(又叫贴图、纹理)资源,比如模型的贴图、UI界面图片、粒子特效的图片等等。
对于大部分图片来说,导入设置只需要保持默认值即可。但是你需要了解各个参数,在遇到问题的时候有线索去解决。
一般建议使用png格式。
设置并不会改变图片源文件,只是Unity引擎在使用这个图片时,会使用设置后的图片数据。
贴图有多种用途,在导入的时候也需要进行不同的设置。
Texture Type属性的可选项有:
默认选中。选中此选项可以让贴图的颜色存储在伽马空间中。非HDR颜色的纹理应该选中此属性(如反射和高光贴图)。如果贴图存储了特定含义的信息,并且在shader中需要使用对应值(例如平滑度或金属度)则不要选中此属性。
设置alpha通道的生成方式,默认是 Input Texture Alpha
默认选中。
是否将alpha通道作为图片的透明度,一般情况都会选中;某些情况下可能仅在代码中使用alpha通道中的数据,但是图片本身是非透明的,则不选中。
6.1 Non Power of 2(非2的N次幂)
上文中介绍了贴图尺寸是2的n次幂会对提高性能,在可能的情况下应该尽可能使用2的n次幂大小。但是有些情况可能需要用到非2的n次幂的情况,就需要设置这个属性。这个属性的默认值是To nearest。
6.2 Read/Write Enabled
默认禁用。
有时候需要在代码中获取贴图中的数据(如Texture2D.SetPixels,Texture2D.GetPixels和其他Texture2D函数),需要启用此功能才能操作。
注意
启用此选项后,会创建该Texture的副本,该贴图占用的内存会加倍。如果不是一定需要读写贴图数据,不要选中此选项。
该选项仅适用于未压缩和DXT压缩类型的贴图纹理,其他压缩类型的贴图无法使用。
6.3 Gnerate Mip Maps
Mipmap是一组逐渐缩小的图片,用于提高3D实时渲染的性能。远离相机的物体会使用更小尺寸的贴图。使用Mipmap会提高33%的内存占用,但是不用mipmap会导致更大的性能损失。对于游戏内的贴图,基本上都应该使用mipmap,例外的情况有:UI图片、天空盒、光标、Cookie贴图。Mipmap也可以避免很多种贴图失真和闪烁的情况。
6.4 mipmap预览
贴图的preview窗口中,可以通过右上角的滚动条查看mipmap不同级别的情况。
6.5.Wrap Mode
默认值是Clamp。这个属性设置贴图在平铺时的不同形式。
Wrap Mode需要同时设置材质球中的Tiling属性,才能看出效果。
6.5.1 Repeat平铺时自身重复。
6.5.2 Clamp贴图的边缘会被拉伸。
6.5.3 Mirror 贴图在重复时会呈现镜像的效果。
6.5.4 Mirror Once只镜像一次,然后边缘拉伸。
6.5.5 Per-axis每个轴上可以单独设置平铺的模式。
6.6 Filter Mode
默认是bilinear。选择纹理在被3D变换拉伸时如何被过滤。
6.7Aniso Level
以陡峭的角度查看纹理时提高纹理质量。对于地板和地面纹理来说,使用这个参数很有用,但是相应的也会占用显卡的资源。
压缩设置中,可以设置一个整体的参数,也可以对不同平台进行单独设置。
7.1Max Size
设置贴图的最大尺寸
7.2 Resize Algorithm
缩放算法
Mitchell 默认的高质量缩放算法
Bilinear 对于噪波贴图,这个算法可能有更锐利的细节
7.3 Compression
压缩的质量设置。压缩质量越高,图片的保真度越高,导入Unity编辑器时所花的时间越多。
7.4 Format
在Default中,Unity会根据你选择的压缩质量,自动选择Format。
也可以对不同的平台单独设置。
7.5 Use Crunch Compress
这是一种有损的压缩格式。这种算法能最大程度降低贴图占用的空间。Crunch Textures可能需要很长时间才能进行压缩,但运行时的解压缩速度非常快。
Project中可以通过label搜索资源,一个资源可以设置多个label。
在Unity中渲染一个物体,最重要的三个概念是材质(Material),贴图(Texture),着色器(Shader)。
• 材质通过使用贴图,Tiling参数,颜色参数等来定义物体表面应该如何呈现。材质的可配置参数取决于材质使用的着色器。
• 着色器是一段代码,基于场景的光照信息和材质的配置,计算物体最终渲染的顶点位置和颜色。着色器决定了材质上面的可配置参数。
• 贴图是位图图像。材质可以对贴图进行引用,然后着色器在计算GameObject的表面颜色时可以使用贴图中的信息。除了GameObject表面的基本颜色(Albedo)外,贴图还可以丰富材质表面的许多其他方面,例如自发光、表面凹凸等。
这三者之间的关系是:
对于大多数的写实渲染需求(角色、场景、环境等),使用内置的Standard着色器通常是最好的选择。
通常情况下,物体的Mesh网格只给出了物体的大概形状,大部分细节都由贴图提供。贴图是绘制在物体网格表面的图像。你可以把贴图想象成有弹性的壁纸,这个壁纸可以通过拉伸、压缩贴到网格的表面。通常贴图的定位(UV信息)是通过3D建模软件完成的。
一张贴图要想贴到模型上,必须先将贴图赋予一个材质,然后将材质与模型关联。
贴图有不同类型和用途,例如:
其他用途的贴图,在讲Unity内置的Standard Shader时会讲解。
一个材质可以使用多张贴图,比如同时使用漫反射贴图和法线贴图,就能让模型有基本颜色的基础上,细节更加丰富。
贴图的尺寸应该尽可能使用2的n次幂的大小,比如256x256,512x1024等尺寸 。
2D游戏中,贴图需要设置为Sprite。在场景中绘制时类似一个纸片的形式,没有厚度。
一般情况2D游戏的角色需要一系列的图片来实现角色的不同状态或者动画。
使用Unity内置的GUI系统时,用到的图片需要设置为Sprite。
游戏的图形用户界面(GUI)可以让玩家查看信息、进行交互。例如,显示游戏当前得分、游戏菜单是游戏中常见的GUI。虽然界面的图片与模型表面的贴图有很大不同,但是都是使用的图片资源。
网格非常适合表示实体物体,但对于魔法遗留的火焰,烟雾和火花等效果并不适合。粒子系统可以更好地处理这种特效。粒子一般用来表示很小的东西,比如液体或气体。当大量粒子一起运动时,可以产生非常逼真的效果。例如,可以将火焰贴图的粒子从中心点以极快的速度发射出去来模拟爆炸;可以用大量高速向下运动的水珠来模拟瀑布。
材质是连接贴图、着色器和模型的重要资源
在Project窗口任一文件夹或空白处右键,Create > Material可以创建一个新的材质。新创建的材质默认会被设置为Standard着色器,所有贴图属性为空,如下图所示:
材质创建后,可以在Project窗口中选中,在Inspector中修改其所有属性。将材质拖拽到场景或Hierarchy中的任一物体即可将材质赋予对应的物体。
注意:
如果一个模型有多个材质,不要使用拖拽的方式赋予材质,否则会将多个材质全部替换为拖拽的材质。正确的做法是:将材质拖拽到模型Mesh Renderer的Materials列表的对应位置。
编辑材质的第一步是确定要使用的着色器,可以点击材质的Shader下拉菜单选择着色器
。
选中的着色器决定了材质包含的可配置的属性。
属性的类型包括颜色、滑条、贴图、数字、向量。如果将材质赋予了场景中的模型,修改属性会实时反馈到场景的模型上。
其中修改贴图属性有两种办法:
• 将贴图从Project窗口中拖到材质的贴图属性的小方框中(最常用)
• 点击材质属性的小圆点,可以从列表中选择贴图