在腳本的 Class 名稱上,加入 [ExecuteInEditMode] 屬性(Attribute),之後再將該腳本拖曳至場景的物件上,Unity 在編輯模式中,就會去執行該腳本了。
 
但是大家會發現,就算是加入 [ExecuteInEditMode] 了,但腳本中的 Update 或者 OnGUI,Unity 都只會執行一次而已,所以以下還有一個功能。
 
該功能是將一個方法或者函數加入編輯模式中的 update 裡面,加入之後,Unity 在編輯模式中,就會在每一幀都去執行呼叫的動作。
UnityEditor.EditorApplication.update += Method 或 Function;
 
不過執行測試完之後,記得移除阿!
 
可執行以下程式碼去移除。
UnityEditor.EditorApplication.update -= Method 或 Function;
 
或者直接將 UnityEditor.EditorApplication.update += Method 或 Function; 程式碼拿掉並儲存也可以,只要腳本有被更動就可以了。
因為每當腳本有被更動時,Unity 都會將 UnityEditor.EditorApplication.update 給清空。 
 
而若要發佈時,腳本中也不能夠有 UnityEditor 這類的程式碼,因為 Unity 不允許正式發佈的 App 中,有引用到 UnityEditor。
 
 
以下我們實際來操作看看:
 
步驟一:
我們建立一個腳本,命名隨意,這邊我命名為 "TestEditMode"。

image01.jpg

 
 
步驟二:
打開腳本 "TestEditMode",我們新增程式碼,讓物件持續往右跑,當物件跑到一定範圍時,則自動回到原點,編輯如下。
 
using UnityEngine;

public class TestEditMode : MonoBehaviour
{
    private void Update()
    {
        // 這邊會讓物件持續往右邊跑
        this.transform.Translate( new Vector3(0.1f, 0.0f, 0.0f) );

        // 當物件超出一個範圍時, 則將物件還原到原點
        if ( this.transform.position.x > 3.0f )
            this.transform.position = Vector3.zero;
    }
}
 
 
 
步驟三:
在場景上新增一個物件,這邊我們新增一個方塊。

image02.jpg

 
 
步驟四:
將剛建立的腳本 "TestEditMode" 拖曳到方塊身上。

image03.jpg

 
 
步驟五:
我們切換到遊戲模式的視窗,並且 "不要執行" 播放按鈕。

image04.jpg

 
這時候大家會看到,畫面中的方塊是沒有動作的,這是正常的,因為我們還沒將 [ExecuteInEditMode] 加到腳本裡面。
所以只有按下播放按鈕進行測試時,方塊才會有動作。
 
 
步驟六:
這時候我們將 [ExecuteInEditMode] 加入腳本 "TestEditMode" 中,並且新增 Log,讓我們知道程式有在執行。
 
using UnityEngine;

// 加入 ExecuteInEditMode 屬性, 讓該腳本在 "編輯模式" 中, 也可以運作.
[ExecuteInEditMode]
public class TestEditMode : MonoBehaviour
{
    private void Update()
    {
        // 加入 Log, 告知我們目前腳本正在運作
        Debug.Log( "腳本 Update 正在運作中! " );

        // 這邊會讓物件持續往右邊跑
        this.transform.Translate( new Vector3(0.1f, 0.0f, 0.0f) );

        // 當物件超出一個範圍時, 則將物件還原到原點
        if ( this.transform.position.x > 3.0f )
            this.transform.position = Vector3.zero;
    }
}
 
 
 
步驟七:
跟步驟五一樣,切換到遊戲模式的視窗,並且 "不要執行" 播放按鈕。
這時候我們會發現方塊移動了,且 Log 也印出訊息!

image05.jpg

 
但是它只運作了一次!
正確的說,是因為 Unity 有被更動,所以該腳本會被連帶的刷新。
 
如果我們試著去拖動 Unity 的視窗,會發現腳本持續的運作!這是因為 Unity 持續被更動,而連帶著腳本一起被刷新。

image05.jpg

image06.jpg

image07.jpg

 
 
步驟八:
現在我們將更新的方法加入 UnityEditor.EditorApplication.update 中,讓該方法可以在編輯模式中,持續的運作。
 
private void Awake()
{
    // 當腳本被啟動時, 就將需要持續運作的方法加入編輯模式中的 Update
    // 讓該方法可以在編輯模式中, 一樣可以持續運作
    UnityEditor.EditorApplication.update += Update;
}
 
 
 
步驟九:
因為我們是將程式碼放在 Awake 中,而 Awake 只會執行一次,所以我們必須將腳本移除,再重新指定,這樣 Awake 才會被執行。
先移除

image08.jpg

 
再重新指定

image03.jpg

 
 
步驟十:
跟步驟五一樣,切換到遊戲模式的視窗,並且 "不要執行" 播放按鈕。
這時候我們會發現方塊移動了,且 Log 也印出訊息!
而且是持續的!

image09.jpg

 
 
若想要移除的話,只需要將 UnityEditor.EditorApplication.update 拿掉就行了。
 
private void Awake()
{
    // 當腳本被啟動時, 就將需要持續運作的方法加入編輯模式中的 Update
    // 讓該方法可以在編輯模式中, 一樣可以持續運作
    // UnityEditor.EditorApplication.update += Update;

    // 將上面程式碼註解掉, 就可以關閉持續運作
}
 
 
接著等 Unity 更新完畢後,就會發現腳本沒有持續運作了!
因為我們 [ExecuteInEditMode] 還沒有移除,所以腳本依舊會在 Unity 被更動時運作。

image05.jpg

 
 
 
arrow
arrow

    岳 發表在 痞客邦 留言(1) 人氣()