Unity ExecuteInEditMode詳解

Unity裏繼承MonoBehaviour的腳本,並不是一直都會執行的。Unity默認只有在Play模式下,遊戲當前運行場景裏的GameObject掛載的腳本纔會執行,也就是說,我們必須按下Play按鈕進入遊戲,上述腳本纔會執行。Unity還有另外的兩種模式:Edit ModePrefab Mode,Edit Mode就是正常的Unity編輯狀態,Prefab Mode是進入Prefab對其進行編輯時對應的模式。

爲了滿足使用的需求,Unity支持通過[ExecuteInEditMode][ExecuteAlways]兩種參數使腳本在Play Mode以外的狀態下被執行,[ExecuteEditMode]支持腳本在Edit Mode下運行,[ExecuteAlways]是在Unity2018.3及以後的版本新加入的功能,能夠支持腳本一直運行。(ps:由於[ExecuteInEditMode] 並沒有考慮Prefab Mode,嚴格意義上講Prefab Mode也屬於Edit Mode,所以這個功能會逐漸被Unity棄用,最後應該會被[ExecuteAlways]所替代)

兩種的寫法是差不多的,只需要在對應腳本的類前加上對應代碼即可,如下所示,

[ExecuteInEditMode]
public class Example1 : MonoBehaviour {
	...
}

[ExecuteAlways]
public class Example2 : MonoBehaviour {
	...
}

ExecuteInEditMode

值得注意的是,與PlayMode不同的是,函數並不會不停的執行。

  • AwakeStart:加載時調用,也就是腳本賦給物體的時候被調用
  • Update : 只有當場景中的某個物體發生變化時,才調用,當進程切出去再回來,也會調用一次。
  • OnGUI : 當GameView接收到一個Event時才調用。
  • OnRenderObject 和其他的渲染回調函數 : SceneView或者GameView重繪時,比如,一直移動鼠標的時候OnRenderObject會被調用。

使用了[ExecuteAlways]參數的類,仍然可以在原來的Play Mode下正常運行,舉個例子,如下圖所示:

[ExecuteInEditMode]
public class TestA : MonoBehaviour
{
    private void Awake()
    {
        Debug.Log(1);
    }

    private void Start()
    {
        Debug.Log(2);
    }

    private void Update()
    {
        Debug.Log(3);
    }
}

在Edit Mode下,將其掛載到一個GameObject下,會打印如下消息:
在這裏插入圖片描述
運行遊戲,可以看到又調用了一次Awake和Start函數:
在這裏插入圖片描述
關閉遊戲,回到Edit Mode:
在這裏插入圖片描述

ExecuteAlways
ExecuteAlways可以看作是ExecuteInEditMode的改進版,支持Prefab Mode下的腳本調用,其餘的與ExecuteInEditMode基本完全相同,具體代碼如下:

[ExecuteAlways]
public class Example : MonoBehaviour {
    void Start()
    {
        if (Application.IsPlaying(gameObject))
        {
        	// 若在Play Mode下
            // Play logic
        }
        else
        {
        	// 若在Edit Mode下
            // Editor logic
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章