Unity 在編輯模式下運行程式碼

一直以來我們的Class都會繼承MonoBehavior但是繼承了Monobehavior的Class只在Play模式下執行,但當Play模式結束,所有被程式修改的部分都會復原,有時候我們會想要「保留」我們所做的更動,這時我們就得讓程式碼在編輯模式下也能運行,這裡有兩種方式可以達到這個效果
1.[
ExecuteInEditMode]

2.[ExecuteAlways]

image

 

1.首先我們先創建一個資料夾叫做Prefab

image

2.在場景中新建一個Text 並把字體大小設定為14

image

3.把Text拖曳到Prefab資料夾中做成Prefab物件並創建一個資料夾叫做Code

image

image

4.創建一支名為PrintAwake的程式碼

using UnityEngine;
using UnityEditor;
using UnityEngine.UI;

[ExecuteInEditMode]
public class PrintAwake : MonoBehaviour
{
    public Text theText;
    void Awake()
    {
       
//取得prefab
        theText = AssetDatabase.LoadAssetAtPath("Assets/Prefab/Text.prefab", typeof(Text)) as Text;
        Debug.Log("
在編輯模式下執行");
        Test();
    }

    void Test()
    {
        Debug.Log("
更改字體大小");
        theText.fontSize = 18;
    }
}

5.接下來我們把PrintAwake拖曳到場景中的MainCamera上,這時我們不需要按下PLay就可以看到程式執行的結果

image

結果一:Debug的資訊已經印出

image

結果二:Prefab資料夾中的Text字體大小已經被替換為18

image

6.接下來試試先把MainCamera上的PrintAwake移除並進入遊戲模式此時卻發現,Prefab的字體大小又變回14

image

解釋:這是因為[ExecuteInEditMode]這個屬性加在程式馬上後,程式碼會在編輯模式下執行,但卻會在遊戲模式下復原,就跟原本的程式碼是「相反」的,原本是會在遊戲模式下執行編輯模式下復原,但有時我們要做出永久的更動,所以我們必須要使用另一種屬性[ExecuteAlways]。

7.接下來我們修改一下PrintAwake程式碼把[ExecuteInEditMode]修改成[ExecuteAlways]

using UnityEngine;
using UnityEditor;
using UnityEngine.UI;

[ExecuteAlways]
public class PrintAwake : MonoBehaviour
{
    public Text theText;
    void Awake()
    {
       
//取得prefab
        theText = AssetDatabase.LoadAssetAtPath("Assets/Prefab/Text.prefab", typeof(Text)) as Text;
        Debug.Log("
在編輯模式下執行");
        Test();
    }

    void Test()
    {
        Debug.Log("
更改字體大小");
        theText.fontSize = 18;
    }
}

8.接下來我們重新把PrintAwake拖曳到MainCamera上,同樣看到Prefab字體大小被修改了,接著移除程式碼進入遊戲模式,我們發現字體並沒有復原,再次退出遊戲模式後Text字體大小仍然保持更動狀態,所以我們可以用這個屬性在專案中做預製物件修改。

image

註記:這篇其實算是我工作上用到的功能,算是私人筆記,Unity官方也有文章,感謝觀看 :))

arrow
arrow

    『迷途』 發表在 痞客邦 留言(2) 人氣()