Unity学习笔记——入门(壹)
学习笔记主要来源于唐老狮的Unity课程,经过个人简单整理而成。目前笔记可能有些地方写的不够好,若发现问题后续会继续完善。笔记总共三个部分:
一、初识Unity
1、游戏引擎
游戏引擎指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程序而不用由零开始。
2、工程文件夹
- Assets:工程资源文件夹(美术资源,脚本等等)
- Library:库文件夹(Unity 自动生成管理)
- Logs:日志文件夹,记录特殊信息(Unity 自动生成管理)
- obj:编译产生中间文件(Unity 自动生成管理)
- Packages:包配置信息(Unity 自动生成管理)
- ProjectSettings:工程设置信息(Unity 自动生成管理)
只有Assets是你需要手动管理的文件夹,备份工程时,只需要复制Assets和ProjectSettings文件夹,其他文件夹 Unity 会在打开工程时自动重建。
3、引擎窗口
- Scene:场景窗口,所有游戏对象所在地,可以对场景进行操控
- Hierarchy:层级面板,显示一个场景中的所有对象的层级列表
- Game:游戏窗口,玩家最终看到的游戏画面
- Inspector:属性面板,查看和设置游戏对象的属性、脚本
- Project:工程目录,主要是
Assets文件夹中的内容,用来管理资源、脚本文件 - Console:控制台窗口,显示调试信息、报错、警告、打印信息等
4、场景操作
-
左键相关
- 鼠标单击:选中单个物体
- 鼠标框选:选中多个物体
Ctrl+ 鼠标单击:多选物体- 长按
ALT键 + 鼠标左键 + 移动鼠标:相对观察视口中心点旋转
-
右键相关
- 鼠标右键按下 + 移动鼠标:旋转视口
- 鼠标右键按下 +
WASD:漫游场景 - 鼠标右键按下 +
WASD+Shift:快速漫游场景 - 长按
ALT键 + 鼠标右键 + 移动鼠标:相对屏幕中心点拉近拉远
-
中键相关
- 滚动鼠标中间:相对屏幕中心点拉近拉远
- 鼠标中间按下 + 移动鼠标:平移观察视口
- 长按
ALT键 + 滚动鼠标中间:鼠标指哪就朝哪拉近拉远
-
选中物体之后
- 按
F键:居中显示物体(或在层级窗口中双击对象)
- 按
5、工具栏
- File:文件菜单,负责文件相关操作,包括新建工程、新建场景、工程打包、打开 / 保存工程等。
- File/Open Project:打开工程
- File/Build Settings:打包设置
- Edit:编辑菜单,负责对象编辑相关操作,包含工程设置、引擎设置、偏好设置等功能。
- Edit/Preferences:偏好设置
- Edit/Project Settings:工程设置
- Assets:资源菜单,对应资源操作,功能和 Project 窗口右键菜单基本一致。
- GameObject:对象菜单,对应对象操作,功能和 Hierarchy 窗口右键菜单基本一致。
- Component:组件菜单,负责脚本 / 组件相关操作,可以添加 Unity 自带组件、系统脚本。
- Window:窗口菜单,负责窗口管理,可以打开 Unity 各核心系统窗口。
- Window/Package Manager:插件包管理
- Help:帮助菜单,负责辅助功能,包含检查更新、查看版本信息、官方文档入口等。
6、特殊文件夹
- Assets(工程资源文件夹):存放工程资源,可通过
Application.dataPath获取工程资源文件夹路径。 - Editor(编辑器脚本文件夹):存放编辑器扩展脚本,只在编辑器运行,不会打包到发布包。
- Resources(资源文件夹):存放需代码动态加载的资源,打包时所有内容都会被打进包,通过
Resources相关API进行加载。 - StreamingAssets(流动资源文件夹):存放需保留原始格式、运行时直接读取的文件,打包后不会压缩。一般用于只读,可通过
Application.streamingAssetsPath获取文件夹路径。 - persistentDataPath(持久数据文件夹):可读可写。不需要自己创建,通过
Application.persistentDataPath可以获取文件夹路径。 - Plugins(插件文件夹):存放原生代码插件、第三方 SDK 等。
- Standard Assets(默认资源文件夹):存放Unity自带的默认资源,里面的代码和资源会优先编译。
二、入门知识
1、对象父子关系
-
在 Unity 中,当游戏对象形成类似层级窗口中的树形结构时,就称它们之间存在父子关系。
-
父对象的位置、旋转、缩放发生变化时,所有子对象都会同步跟随变化。
-
Scene 视图中的
Pivot/Global选项作用Pivot:以选中对象的自身轴心点为基准进行变换,父子对象的轴心点会各自独立。Global:以世界坐标系为基准进行变换,不受对象父子关系影响,变换会对齐世界坐标轴。
2、Unity反射机制
反射知识回顾:程序在运行时,可以查看其他程序集或者自身的元数据,这种行为就叫做反射。
而Unity帮我们封装了对象查找和关联的底层逻辑,比如我们能在Inspector窗口中修改对象Transform组件的内容,能够自定义脚本的字段等等,就是通过反射获取类的所有公共成员,将字段显示在Inspector窗口中做到的。
再比如游戏场景文件(后缀为.unity),本质上是一个配置文件。而Unity有一套专门的机制来识别和处理场景文件,可以读取场景中所有对象的相关配置信息,再通过反射创建对象、关联对应的脚本组件。
3、预制体
预制体(Prefab)是Unity中一种重要的资源类型,允许开发者将游戏对象保存为一个可重复使用的模板。
- 创建:将游戏对象从
Hierarchy拖拽到Project中的Assets文件夹下,即可创建Prefab。 - 实例化:将Prefab从
Project拖拽到Hierarchy或Scene中,即可实例化Prefab。 - 修改:双击
Project中的Prefab文件,即可打开Prefab编辑模式进行修改。或者在场景中修改对象的属性和结构,选择将修改应用到Prefab源文件。 - 变体(Variant):在Hierarchy中右键对象,选择
Create Prefab Variant。变体允许在保持与原始 Prefab连接的同时,对实例化对象进行一些自定义修改。
4、自定义脚本
自定义脚本建议放在Assets/Scripts/文件夹下。
- 创建:
Project窗口右键,选择Create/C# Script,脚本默认继承MonoBehaviour - 挂载:将脚本拖到对象上,或者使用代码
AddComponent - 调节执行顺序:在
Inspector中点击脚本右上角的Execution Order,会转到Project Settings/Script Execution Order,用于调节脚本执行顺序。
5、MonoBehaviour
(1)MonoBehaviour概述
MonoBehaviour类是一个基类,所有Unity脚本都默认派生自该类。MonoBehaviour类提供了框架,允许将脚本附加到编辑器中的游戏对象,并可以使用生命周期函数,以及可以使用协程。- 继承
MonoBehaviour的类不要new,只能挂载到游戏对象上。 - 如果不继承
MonoBehaviour,则按照正常C#的类规则编写即可,一般用于单例模式的管理器类,或者数据结构类等等。
(2)重要成员变量
this.gameObject; // 获取自身对象
this.transform; // 获取自身变换组件
this.enabled; // 脚本是否激活
(3)获取对象脚本的方法
this.GetComponent<T>(); // 获取自身单个脚本
this.GetComponents<T>(); // 获取自身多个脚本
this.GetComponentInChildren<T>(); // 获取自身及子物体的单个脚本
this.GetComponentsInChildren<T>(); // 获取自身及子物体的多个脚本
this.GetComponentInParent<T>(); // 获取自身及父物体的单个脚本
this.GetComponentsInParent<T>(); // 获取自身及父物体的多个脚本
this.TryGetComponents<T>(out component); // 尝试获取脚本
(4)延迟函数
Invoke(methodName, time); // 延迟执行
InvokeRepeating(methodName, time, repeatRate); // 重复延迟执行
CancelInvoke(); // 取消该脚本所有延迟函数执行
CancelInvoke(methodName); // 取消该脚本指定延迟函数执行
IsInvoking(); // 是否有延迟函数
IsInvoking(methodName); // // 是否有指定名的延迟函数
6、生命周期函数
- 帧:游戏的本质就是一个死循环,每一次循环处理游戏逻辑,就会更新一次画面。
- 生命周期函数:Unity底层已经帮我们实现了这个死循环,继承
MonoBehaviour的脚本都拥有一系列生命周期函数,Unity通过反射会自动在特定时机调用这些函数,我们只需要在生命周期函数中按它的规则编写游戏逻辑即可。 - 常用生命周期函数(按执行顺序排列)
Awake:在Start之前并在实例化对象之后调用。OnEnable:在启用对象后立即调用此函数。Start:在第一次帧更新之前调用。FixUpdate:每个物理帧调用一次,物理帧是固定的时间间隔(Project Setting/Time中设置)。OnTriggerXXX:触发器触发后调用。OnCollisionXXX:碰撞器碰撞后调用。Update:每帧调用一次,是帧更新的主要函数。LateUpdate:每帧调用一次,在Update之后调用。OnDisable:对象失活时调用。OnDestroy:对象被销毁时调用。
所有的生命周期函数在官方手册可以找到,更加详细:事件函数的执行顺序 - Unity 手册
- 一些注意事项:个人测试发现,同一脚本内
Awake一定在OnEnable之前,不同脚本间有可能脚本1的OnEnable会在脚本2的Awake之前。但是Start一定在所有Awake和OnEnable之后执行。
7、常用特性
[DisallowMultipleComponent]:让一个对象只能挂一个相同的脚本[SerializeField]:让私有和保护的变量也可以被显示[HideInInspector]:让公共变量的不让其显示[System.Serializeble]:让自定义类型可以被访问[Header("分组说明")]:在Inspector中显示标题[Tooltip("说明内容")]:为变量添加说明[Space()]:让两个字段出现间隔[Range(最小值,最大值)]:修饰数值的滑条范围[TextArea(最少显示行数,超过的数量显示滚动条)]:滚动条显示字符串,不写默认是3行显示滚动条[ContextMenuItem("显示按钮名","方法名")]:为变量添加快捷方法[ContextMenu("测试函数")]:让方法能够在Inspector中执行
8、Unity的Object
Unity里也有Object类,但Unity中的UnityEngine.Object并不是C#中的System.Object,它是 UnityEngine命名空间下的,集成万物之父的一个自定义类。
继承自UnityEngine.Object的类具有特殊功能,这意味着它们可以被拖放到Inspector中的字段中,或者使用Object字段旁边的对象选择器来选取。