前言:本文主要供自己参考,如果错误欢迎指正。本文并非系统的知识点总结,而对零散知识点的补充说明。
官方文档:Unity 脚本 API
0. Unity编辑器
(1)快捷键
- 按住V可快速对齐模型的顶点。
(2)数据丢失
<1> 修改变量名
需要Inspector窗口中重新赋值。
<2> 修改动画事件名
修改动画使用的函数的函数名时,需要在对应的动画中重新绑定该函数。
<3> 修改枚举类型
基本上需要重新选择。
例如,我在某个脚本中声明了一个序列化的Options类型的变量,并勾选了Option2这个项。那么当我修改Options后option2仍存在且值不变时,在Inspector窗口中保存的枚举变量的枚举项才不会改变。
public enum Options
{
option1,
option2,
}
1. 脚本
(1)代码规范
<1> 文件命名
字母、数字、下划线、空格:空格不要连续,末尾不要使用空格。
中文及其它符号:慎用。
(Hierarchy窗口中的对象命名同上)
<2> 代码命名
- 函数、自定义类型:一般纯英文,所有单词首字母大写(其余部分小写)。
- 变量:一般纯英文,第一个单词全部小写,其它单词首字母大写(其余部分小写)。若仅包含缩写,则缩写字母全部小写。
- 若变量名称过长(单词+缩写短语超过3个)导致变量含义不直观,则可以考虑缩写其中的一些词,并用缩写表记录。若无合适的缩写词则可以考虑使用下划线,规则见4。
- 若要<定义大量含义类似的函数或变量>,也可以配合数字及下划线命名。我的规则为:函数、自定义类型第一个字母大写,变量第一个字母小写,数字后面若有字母则用下划线隔开。
- 在没有项目代码规范的情况下,才会使用个人的规范进行补充。制定个人代码规范只是为了代码的含义更加清晰易懂,并不是说只能局限于一套规则(用中文命名一样能跑起来)。
<3> 头文件
VS有时候会自动包含头文件,这有可能导致包包含错误的头文件,使用VS自动补全了错误的代码后应该撤回而非删除。另外,看到未使用的头文件应该删除。
(2)Vector
<1> 点?向量?方向?
vector既可以表示3D世界中的坐标(点),也可以表示3D世界中的位置变化(向量)。
一般来说,用vector表示方向时最好使用单位向量(长度为1)。
(3)Raycast
射线检测时,可以用QueryTriggerInteraction.Ignore忽略触发器检测。
(#)其它
// 不public协程方法, 而是public开启协程的方法
// 这样开启的协程都在该behaviour上,便于管理
// 例如,脚本A调用脚本B上的Start_Function(),
// 则会在脚本B上开启一个协程Function()
IEnumerator Function() {}
public void Start_Function()
{
StartCoroutine(Function());
}
2. 动画
(1)Animator
<1> State名称
不要为不同的State取相同的名称!!!不同层的同名State并不是同一个State!
例如,我们在第0层和第1层都有一个名为<Empty>状态,调用时只会调用先找到的状态,即第0层的<Empty>状态。
若我们在第1层中有一个名为<Falling>的状态(loop状态),在Player进入下落阶段时,我们执行语句“animator.Play("Falling");”,并执行该阶段的相应代码。等Player退出下落状态时,我们想要通过语句“animator.Play("Empty");”让第0层和第1层都回归<Empty>状态。
但正如前面所说,这会导致实现上的错误,即第1层仍处于<Falling>状态。
另外,如下所示,这两个语句在同一个语句块中时,并不会出现所谓的“覆盖”,而是依次执行这两个语句。
animator.Play("Falling");
// 执行一系列操作
animator.Play("Empty"); // 想返回"Empty"状态。
<2> State过渡
- 动画过渡最好不要舍弃动画的某些帧,若动画事件正好绑定在这些舍弃的帧上,则会导致动画事件不执行。
- 从一个状态A过渡到状态B(混合时),会在混合开始时先进入状态B,混合结束后离开状态A,即混合时既处于状态A又处于状态B。
- Trigger类型参数,某些情况下比bool方便,执行过渡后值会自动由true被设为false。
【代码控制过渡】 vs 【Animator窗口中的参数控制过渡】
使用Animator窗口中的参数来控制过渡,还是使用Animator.Play()与Animator.CrossFade()来控制动画过渡呢?代码可以直接开始过渡(切换或混合);而Animator会等到Exit Time判断过渡条件是否都为true,若过渡条件都为true才会开始过渡。无需附加条件的过渡我会选择使用Animator窗口中的箭头过渡,需要附加条件的过渡我会选择使用代码控制(除非不能立马打断当前动画)。
3. UI
(0)注意事项
不要用Ctrl+z撤回UI操作,可能导致Unity崩溃。
(1)UI渲染顺序
canvas的渲染顺序:
① 先判断canvas的渲染模式:Screen Space - Overlay肯定比另外两种后渲染。
② (若①无法得出结果,比较对应camera的depth,越大越后渲染。)
③ (若②无法得出结果,比较sortingLayer,越大越后渲染。)
④ 若①(或③)无法得出结果,比较SortOrder,越大越后渲染。
⑤ 若④无法得出结果,比较在Hierarchy窗口中的位置,下面的后渲染。
其中,两个canvas渲染模式都为Screen Space - Overlay时,跳过②③步骤。
// 1.Screen Space - Camera && World Space
// (1)对应camera中的depth
// (1)Sorting Layer
// (2)Sort Order
// (3)Hierarchy窗口中的顺序
// 2.Screen Space - Overlay(将UI渲染在屏幕最前面)
// (1)Sort Order
// (2)Hierarchy窗口中的顺序
canvas中的UI渲染顺序:比较在Hierarchy窗口中的位置。
(2)自适应UI布局
设置内容为网格布局:Layout group
根据内容的大小设置该UI的大小:Content Size Fitter
设置该UI的弹性大小:Layout Element
宽高比适配器:Aspect Ratio Fitter
4. 输入
Input System | Input System | 1.4.4 (unity3d.com)
5. 导航 && 寻路
6. 图形
7. 音频 && 视频
8. 物理
(1)粒子系统:stop();Clear();一起用才能暂停并清除粒子
附:Unity特性——Attributes
[Header]【标题】:后面紧跟的变量必须序列化。(不能是const或static变量,可能是const或者static无法被序列化?)
[SerializeField]【序列化】:主要是为了让private或protected变量在Inspector窗口中显示。
[HideInInspector]【在Inspector窗口隐藏】:主要是为了让public变量在Inspector窗口中隐藏。
[CreateAssetMenu]【创建资产菜单】:可以快速创建继承自ScriptableObject的派生类的实例。
[Range]【范围】([min]【最小值):限制数值变量的范围。
[TextRrea]【文本域】
[Tooltip]【提示】:在Inspector窗口中,鼠标悬停至该变量名上时会显示提示。
[Space]【行间距】:让Inspector窗口中的排版更加清晰。
注意:尽量不要让两个特性挨在一起,会降低代码可读性。若是含义相近的特性挨在一起可能导致其中一个特性失效。示例,如下。
[Header("item在Hierarchy窗口中的名称")]
[Tooltip("用于切换模型")] public string transformName;
[Header("盔甲的伤害吸收率")]
[Range(0, 1)] public float headArmorPDA;
[Range(0, 1)] public float torsoArmorPDA;
[Space(5)]
[Range(0, 1)] public float headArmorFDA;
[Range(0, 1)] public float torsoArmorFDA;