UnityKey2

前言

依然是小Tips。

加载前回调

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
这个特性使得被标记的静态方法可以在加载场景之前执行。

具体描述:

Description
Allow a runtime class method to be initialized when a game is loaded at runtime without action from the user.

Methods marked [RuntimeInitializeOnLoadMethod] are invoked after the game has been loaded. This is after the Awake method has been invoked.

Note: The execution order of methods marked [RuntimeInitializeOnLoadMethod] is not guaranteed.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Create a non-MonoBehaviour class which displays
// messages when a game is loaded.
using UnityEngine;
class MyClass
{
[RuntimeInitializeOnLoadMethod]
static void OnRuntimeMethodLoad()
{
Debug.Log("After scene is loaded and game is running");
}
[RuntimeInitializeOnLoadMethod]
static void OnSecondRuntimeMethodLoad()
{
Debug.Log("SecondMethod After scene is loaded and game is running.");
}
}

与之对应的加载后回调函数:

OnLevelWasLoaded: This function is executed to inform the game that a new level has been loaded.

UnityAction匿名函数表达方式

1
2
var executeAllButton = Add("Run All Tests", () => StartCoroutine(ExecuteAllInCoroutine(executeAll)));
Button Add(string title, UnityAction test){}

当你调用一个agent.SetDestination,他的路径计算过程和完成与否其实对我们来说是不可见的。所以有的参数不一定忠实的表达了当前的状态,比如 remainingDistance,所幸API中存在NavMeshAgent.pathPending这么一个参数,用来表达路径计算完成且所有属性更新完毕,true表示虽然计算完成,但是没有准备好(譬如一些状态参数的更新,寻路算法不仅仅事关路径计算)。

1
2
3
4
5
6
7
8
9
10
11
float dist = 0;
if (localAgent.pathPending)
{
//因为下文需要用到remainingDistance,但是不能确定navigation是在什么阶段进行的路径计算,以及各种属性更新,所以通知路径更新
//通常来说,计算path都会用到多线程加速,这也许会是一方面原因。
dist = Vector3.Distance(localAgent.transform.position, target);
}
else
{
dist = localAgent.remainingDistance;
}

Animator的动画执行顺序问题

通常来说一个动画,可能会做成不带位移,不带旋转,换句话说,动画的root节点不会发生任何Transform变换,但是免不了有的情况会出现带位移,如果需要他保持原点,把root绑定一下,这样他的root节点就不接收位移和旋转了。这是在美术不需要修改模型动画的前提下做的一定程度的约束,但是最终的动画结果可能不尽人意。

由此引申的一个话题就是,如果我希望人工干预动画里的某一批节点的transform,则可以旋转从lateupdate做手脚,即是在动画系统结算完成后干预,当然,也可以使用avatar mask。

当帧率过小时的FixedUpdate

主要作用于物理模拟,因为刚体效果的体现,是和时间有关的。帧率过小时,意味着update调用次数也少,但是fixed次数是和时间有关的,相比之下,反而比update的次数多了

对UI的位置做初始化

如果需要对UI的锚点,相对位置做初始化。

在设置锚点信息后,会使用RectTransform.anchoredPosition绑定

Lod bias

lod 切换精度,精度越高,切换的越灵敏,快速。