Unity里繼承MonoBehaviour的腳本,並不是一直都會執行的。Unity默認只有在Play模式下,游戲當前運行場景里的GameObject掛載的腳本才會執行,也就是說,我們必須按下Play按鈕進入游戲,上述腳本才會執行。Unity還有另外的兩種模式:Edit Mode和Prefab 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不同的是,函數並不會不停的執行。
Awake
和Start
:加載時調用,也就是腳本賦給物體的時候被調用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
}
}
}