Unity 系列 - Unity 入门级教程

448 阅读18分钟

入门概述

什么是 Unity

unity 最简单的一种解释方式就是:一款跨平台的游戏引擎
游戏引擎 最简单的说法就是:帮我们集成游戏开发所需的大部分功能,在它的基础上,添加和制作游戏视觉、音效、玩法等
游戏引擎一般具有以下几个模块:1.图形;2.音频;3.物理;4.网络;5.脚本

Unity 编辑器

项目模式分类

模式介绍
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 项目包含以下文件

image

文件夹名作用
Assets工程中所有资源的存放目录
LibraryUnity自动生成的中间文件目录
PackagesUnity的包管理器相关文件存放目录
ProjectSettings工程的相关设置
Temp存放一些临时文件,关闭Unity会该目录会自动消失
sln文件和csproj文件Unity自动生成的Visual Studio工程文件,用于代码编写和调试

注意:这些文件中,Assets、Packages、ProjectSettings三个文件夹是必须的,不能删除,其他文件可以由 Unity自动生成
在存档、拷贝工程源文件时,可以只保留 Assets、Packages、ProjectSettings 这三个文件夹来减小文件体积。

新增工程后打开工程文件夹,会发现 Scenes 文件夹下有两个文件:

image

SampleScene.unity Unity引擎的场景文件,以.unity为扩展名
SampleScene.unity.meta meta文件保存了对应资源的ID、配置等信息,非常重要

编辑器主窗口

image.png

Hierarchy 窗口

简介

一个游戏包含多个场景(关卡),一个场景包含多个 GameObject(游戏对象)

层级窗口展示Scene(场景)中所有的 GameObject(游戏对象)。这个 GameObject 可以显示出来是一个模型,也可以是一个UI元素,也可以是一个空物体

image

内容介绍

  1. 父子关系
    父子关系可以理解为:把一个杯子放在桌子上,如果移动、旋转桌子,这个杯子也会相应的跟着桌子移动、旋转,但杯子相对桌子的位置不变。类似的,在Unity中,如果移动、旋转父物体,子物体会跟随父物体移动、旋转,但相对位置不变。
  2. 显示顺序
    通过拖动可以改变物体在Hierarchy中显示的顺序。除了在UI系统中,改变物体的顺序对显示和功能几乎没有影响。

Inspector 窗口

简介

Inspector窗口类似属性窗口,可以修改、设置选中物体、资源的各种属性(把 C# 脚本添加到 Componemt 里面去,脚本可以读写这些属性,脚本就是这样去实现游戏逻辑的)

image

使用方式

  1. GameObject的状态

image

上图红框位置中有一个复选框,指示了这个物体是否是激活状态。
• 勾选:即激活状态,物体上的所有组件都会运行,简单来说物体会显示出来。
• 不勾选:即隐藏状态,物体不会显示,物体上的组件也不会运行。
修改物体的active状态的快捷键是Shift + Alt +A。

  1. GameObject的名称

active状态右侧的输入框就是GameObject的名称,也是Hierarchy中显示的名字。修改名称可以直接在这个输入框中修改,然后按回车确认。或者直接在Hierarchy中物体上右键菜单Rename或按F2(Windows)重命名。

  1. Tag标签

image

Tag 即标签,你可以给一个物体添加标签用于区分不同的物体,比如用朋友和敌人来区分不同的角色。
物体的默认标签都是Untagged即未贴标签。你可以自定义需要的标签内容。点击上图菜单中最下方的Add Tag...会弹出添加Tag的窗口。
注意:每个物体只能有一个Tag

  1. Layer 层

image

Layer在很多时候(摄像机、物理检测)时非常有用。
物体的默认Layer都是Default即默认。点击上图菜单中最下方的Add Layer...会弹出添加Layer的窗口。

注意:
• Layer不能增加,只能选择8-31之间的数字,只有24个。由于Layer数量有限,在能用Tag时不要使用Layer。而且一定要设计分配好Layer,否则后期修改Layer会是一项浩大的工程。
• 每个物体只能选择一个Layer。

碰撞层和显示层

  • 碰撞层逻辑

物体之间的碰撞关系(是否碰撞)

  • 显示层逻辑

物体之间的覆盖关系(谁在谁上层)

image.png

碰撞层矩阵

矩阵上的是否勾选代表两物体之间是否可以碰撞

image.png

Scene 和 GameObject 的理解

Scene

一个游戏包含一个或多个Scene。
Scene包含了游戏的环境、UI和各种功能。可以把Scene当成游戏的一个关卡
当你新建一个Unity的3D工程,默认会打开SampleScene。场景中包含一个Main Camera(相机)和Directional Light(灯光)。

  • 相机是游戏中的眼睛,可以理解为眼睛所在的位置和方向
  • 灯光是游戏中的光源,光源可以照亮游戏世界中的物体。

GameObject

场景中所有的物体都是一个GameObject,例如场景里的角色、房子、石头、灯光、相机、特效等。
image

但其实,一个GameObject只凭自身什么事情都做不了,它只是个容器

如果你想给GameObject添加属性,让它变成灯光、或者树、或者相机,你需要给它添加Component(组件) 。你可以给一个GameObject添加一个或多个的Component,来让它拥有不同的外观和功能。

Unity 有许多内置组件(如 Box Collider、Capsule Collider),能大大加快你的开发效率,我们还可以使用C# 脚本自定义组件

Empty GameObject 的妙用

  1. 类似文件夹的功效

你可以把空物体当作其他物体的父物体,这就类似一个文件夹,把其他物体放了进去。这样更方便编辑管理(通过父物体整体移动、旋转、隐藏/显示等),Hierarchy的结构也更清晰。

image

  1. 作为组件的容器

很多组件并没有对应的模型、界面或者特效,强加给任何一个都不合理。这时候使用一个空物体作为组件的容器更合适,比如游戏中全局使用的脚本。

image

  1. 作为物体的轴心点

有的模型的轴心点位置可能离模型本身很远或没有放在合适的位置。这会造成物体的位置、旋转与物体本身不符。例如一个轴心有问题的模型,可能出现以下问题:

  • 位置坐标和实际位置有差别
  • 旋转时会根据轴心点旋转,导致不按预期旋转

Component(组件)

什么是 Component(组件

不同的 Component 为 GameObject 提供不同的功能

怎么添加组件

如果想要给一个GameObject添加功能,就需要给它添加组件。添加组件有两种方式:手动添加和通过代码添加。

添加组件有多种方式:

  • 点击Inspector中的Add Component按钮(快捷键Ctrl+Shift+A),选择/搜索添加组件;
  • 从Project中将脚本(脚本是一种自定义组件)拖到GameObject上;
  • 打开菜单栏Component,找到并点击要添加的组件。

修改组件属性就是修改游戏逻辑

  1. 手动修改属性

在 Unity 中可以直接修改属性,这是游戏测试人员干的事,通过手动修改属性后可以直接体验游戏,可以通过测试得出组件各种属性的最佳值

  1. C# 脚本修改属性

通过 C# 脚本读其他组件后,读写组件的属性,这是游戏研发人员干的事,这样可以根据不同情况去设置组件的属性值,完成游戏逻辑

Transform组件

Transform是每个GameObject必须有的组件,创建GameObject就会自动附带,而且不能删除,在Inspector中显示在最上面

image

它的功能是确定一个GameObject在空间中的位置、缩放和旋转

  • Position:位置,分别表示x,y,z轴的坐标
  • Rotation:旋转,分别表示围绕x,y,z轴的旋转,单位是角度
  • Scale:缩放,分别表示x,y,z轴方向上的缩放比例。1代表不缩放

这三个值都是相对于父物体的值,如果没有父物体,就是世界空间(即相对于世界坐标原点)的值

图片的使用

游戏开发中许多地方都会用到图片(又叫贴图、纹理)资源,比如模型的贴图、UI界面图片、粒子特效的图片等等。
对于大部分图片来说,导入设置只需要保持默认值即可。但是你需要了解各个参数,在遇到问题的时候有线索去解决。

图片要求

  1. 格式
  • BMP
  • EXR
  • GIF
  • HDR
  • IFF
  • JPG
  • PICT
  • PNG
  • PSD
  • TGA
  • TIFF

一般建议使用png格式。

  1. 尺寸大小
    理想情况下,贴图的宽高应该是2的n次幂(如2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048等),可以加快纹理取样的速度,减少内存占用,提高性能。在可能的情况下,尽可能使用2的n次幂大小的贴图。不一定需要是正方形的,例如可以是64*128的分辨率。
    如果贴图出现加载不出来的情况,可以看一下是否贴图尺寸过大。

导入设置

设置并不会改变图片源文件,只是Unity引擎在使用这个图片时,会使用设置后的图片数据。

1. Texture Type

贴图有多种用途,在导入的时候也需要进行不同的设置。
Texture Type属性的可选项有:

  • Default:最常用的设置,可以设置贴图导入的大部分属性
  • Normal Map:用于法线贴图(法线贴图是模型常用的一种贴图类型)
  • Editor GUI and Legacy:用于编辑器GUI或者旧的OnGUI
  • Sprite (2D and UI):用于2D游戏和UI
  • Cursor:用于自定义光标
  • Cookie:用于灯光的Cookie属性的贴图
  • Lightmap:用于光照贴图(在max或maya中烘焙过的模型的光照贴图导入后使用此选项)
  • Single Channel:用于只需要一个通道的情况

2. Texture Shape

  • 2D:默认,大部分的图片都会使用2D设置,例如模型贴图、UI等
  • Cube:贴图会被设置为cubemap,一般用于天空盒、反射等情况。这种帖图需要按照特定的格式制作,在Unity中会被展开为立方体或球体 。

3. sRGB(Color Texture)

默认选中。选中此选项可以让贴图的颜色存储在伽马空间中。非HDR颜色的纹理应该选中此属性(如反射和高光贴图)。如果贴图存储了特定含义的信息,并且在shader中需要使用对应值(例如平滑度或金属度)则不要选中此属性。

4. Alpha Source

设置alpha通道的生成方式,默认是 Input Texture Alpha

  • None:不管图片本身是否有alpha通道,该贴图将没有alpha通道
  • Input Texture Alpha:如果图片有alpha通道,使用这个alpha通道;如果没有,则该贴图也没有alpha通道
  • From Gray Scale:从图片的RGB值的平均值生成alpha通道

5. Alpha is Transparency

默认选中。
是否将alpha通道作为图片的透明度,一般情况都会选中;某些情况下可能仅在代码中使用alpha通道中的数据,但是图片本身是非透明的,则不选中。

6. Advanced(高级设置)

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属性,才能看出效果。

image

6.5.1 Repeat平铺时自身重复。

image

6.5.2 Clamp贴图的边缘会被拉伸。

image

6.5.3 Mirror 贴图在重复时会呈现镜像的效果。

image

6.5.4 Mirror Once只镜像一次,然后边缘拉伸。

image

6.5.5 Per-axis每个轴上可以单独设置平铺的模式。

image
image

6.6 Filter Mode

默认是bilinear。选择纹理在被3D变换拉伸时如何被过滤。

6.7Aniso Level

以陡峭的角度查看纹理时提高纹理质量。对于地板和地面纹理来说,使用这个参数很有用,但是相应的也会占用显卡的资源。

7. 压缩设置

压缩设置中,可以设置一个整体的参数,也可以对不同平台进行单独设置。

image

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可能需要很长时间才能进行压缩,但运行时的解压缩速度非常快。

8. Label设置

Project中可以通过label搜索资源,一个资源可以设置多个label。

渲染与贴图

渲染

在Unity中渲染一个物体,最重要的三个概念是材质(Material),贴图(Texture),着色器(Shader)。
• 材质通过使用贴图,Tiling参数,颜色参数等来定义物体表面应该如何呈现。材质的可配置参数取决于材质使用的着色器。
• 着色器是一段代码,基于场景的光照信息和材质的配置,计算物体最终渲染的顶点位置和颜色。着色器决定了材质上面的可配置参数。
• 贴图是位图图像。材质可以对贴图进行引用,然后着色器在计算GameObject的表面颜色时可以使用贴图中的信息。除了GameObject表面的基本颜色(Albedo)外,贴图还可以丰富材质表面的许多其他方面,例如自发光、表面凹凸等。

这三者之间的关系是:

  • 一个材质只能使用一种着色器,一种着色器可以被多个材质使用。
  • 一个材质可能需要多张不同的贴图(基本的漫反射贴图、法线贴图、高光贴图等),一张贴图可以被多个不同的材质复用。
  • 材质可以和网格Mesh关联起来,网格的表面最终会显示成对应材质的样子。

对于大多数的写实渲染需求(角色、场景、环境等),使用内置的Standard着色器通常是最好的选择。

Texture(贴图)

通常情况下,物体的Mesh网格只给出了物体的大概形状,大部分细节都由贴图提供。贴图是绘制在物体网格表面的图像。你可以把贴图想象成有弹性的壁纸,这个壁纸可以通过拉伸、压缩贴到网格的表面。通常贴图的定位(UV信息)是通过3D建模软件完成的。

  1. 3D模型的贴图

一张贴图要想贴到模型上,必须先将贴图赋予一个材质,然后将材质与模型关联。
贴图有不同类型和用途,例如:

  • Albedo(反照率)贴图:一个材质最基础的贴图,能表示材质表面反射的颜色及比率。

image

  • 法线贴图:一种特殊的贴图通过贴图的方式来实现模型表面的凸凹,增加模型的细节

image

其他用途的贴图,在讲Unity内置的Standard Shader时会讲解。
一个材质可以使用多张贴图,比如同时使用漫反射贴图和法线贴图,就能让模型有基本颜色的基础上,细节更加丰富。
贴图的尺寸应该尽可能使用2的n次幂的大小,比如256x256,512x1024等尺寸 。

  1. 2D图形

2D游戏中,贴图需要设置为Sprite。在场景中绘制时类似一个纸片的形式,没有厚度。
一般情况2D游戏的角色需要一系列的图片来实现角色的不同状态或者动画。

  1. GUI

使用Unity内置的GUI系统时,用到的图片需要设置为Sprite。
游戏的图形用户界面(GUI)可以让玩家查看信息、进行交互。例如,显示游戏当前得分、游戏菜单是游戏中常见的GUI。虽然界面的图片与模型表面的贴图有很大不同,但是都是使用的图片资源。

  1. 粒子

网格非常适合表示实体物体,但对于魔法遗留的火焰,烟雾和火花等效果并不适合。粒子系统可以更好地处理这种特效。粒子一般用来表示很小的东西,比如液体或气体。当大量粒子一起运动时,可以产生非常逼真的效果。例如,可以将火焰贴图的粒子从中心点以极快的速度发射出去来模拟爆炸;可以用大量高速向下运动的水珠来模拟瀑布。

材质

什么是材质

材质是连接贴图、着色器和模型的重要资源

创建材质

在Project窗口任一文件夹或空白处右键,Create > Material可以创建一个新的材质。
新创建的材质默认会被设置为Standard着色器,所有贴图属性为空,如下图所示:
image
材质创建后,可以在Project窗口中选中,在Inspector中修改其所有属性。
将材质拖拽到场景或Hierarchy中的任一物体即可将材质赋予对应的物体。
注意:
如果一个模型有多个材质,不要使用拖拽的方式赋予材质,否则会将多个材质全部替换为拖拽的材质。正确的做法是:将材质拖拽到模型Mesh Renderer的Materials列表的对应位置。

编辑材质

编辑材质的第一步是确定要使用的着色器,可以点击材质的Shader下拉菜单选择着色器。
image
选中的着色器决定了材质包含的可配置的属性。
属性的类型包括颜色、滑条、贴图、数字、向量。如果将材质赋予了场景中的模型,修改属性会实时反馈到场景的模型上。
其中修改贴图属性有两种办法:
• 将贴图从Project窗口中拖到材质的贴图属性的小方框中(最常用)
image
• 点击材质属性的小圆点,可以从列表中选择贴图
image

参考文章