1 回答
TA贡献1851条经验 获得超3个赞
不是真的在编译时,但如果你想在每次在 Unity 中打开项目时进行检查,重新编译代码或加载新场景,你可以使用[InitializeOnLoad]
and SceneManager.sceneLoaded
。
首先有一个像这样的界面
public interface INullReferenceChecker
{
void CheckReferences();
}
然后在eg里面有一个全局编辑器脚本Assets/Editor/RunNullChecks.cs(重要的是那个是放在Editor后面的所以去掉)
[InitializeOnLoad]
public class RunNullChecks
{
public static RunNullChecks
{
// first of all also add a callback so it gets re-run everytime you switch a scene
// removing it first makes sure it is only added once
EditorSceneManager.sceneOpened -= Run;
EditorSceneManager.sceneOpened += Run;
Run();
}
private static void Run(Scene scene, LoadSceneMode mode)
{
Run();
}
public static void Run()
{
// here it depends a bit on your needs
// you either can check only stuff in the Scene like
var nullCheckers = FindObjectsOfType<INullReferenceChecker>();
// this gets only active and enabled components!
// or you could include all prefabs, ScriptableObjects using
//var nullCheckers = Resources.FindObjectsOfTypeAll<INullReferenceChecker>();
// and then let them do whatever they implemented
foreach(var tester in nullCheckers)
{
tester.CheckReferences();
}
}
}
那么你会有
public class PlayerMovement : MonoBehaviour, INullReferenceChecker
{
...
public override void CheckReferences()
{
UnityEngine.Assertions.Assert.IsNotNull(gameManager, "Member \"gameManager\" is required.");
UnityEngine.Assertions.Assert.IsNotNull(playerRigidBody, "Member \"Rigidbody\" is required.");
// you could also simply go for
if(!gameManager) Debug.LogErrorFormat(this, "Member \"{0}\" is required.", nameof(gameManager));
if(!playerRigidBody) Debug.LogErrorFormat(this, "Member \"{0}\" is required.", nameof(playerRigidBody));
}
}
另一种选择也可能是使用[ExecuteInEditMode]
属性。
这使得
Awake
每次打开项目/加载场景/向场景添加新组件时调用的方法Update
每次更改场景中的内容时都会调用方法
然而,您可能会禁用某些代码块,例如Update
检查Application.IsPlaying
和/或Application.isEditor
。
- 1 回答
- 0 关注
- 204 浏览
添加回答
举报