Unity学习笔记

        前言:本文主要供自己参考,如果错误欢迎指正。本文并非系统的知识点总结,而对零散知识点的补充说明。

        官方文档: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层都有一个名为状态,调用时只会调用先找到的状态,即第0层的状态。

        若我们在第1层中有一个名为的状态(loop状态),在Player进入下落阶段时,我们执行语句“animator.Play("Falling");”,并执行该阶段的相应代码。等Player退出下落状态时,我们想要通过语句“animator.Play("Empty");”让第0层和第1层都回归状态。

        但正如前面所说,这会导致实现上的错误,即第1层仍处于状态。

        另外,如下所示,这两个语句在同一个语句块中时,并不会出现所谓的“覆盖”,而是依次执行这两个语句。

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;

你可能感兴趣的:(学习笔记,unity)