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 關注
- 255 瀏覽
添加回答
舉報