Unity 在編輯模式下運行程式碼
一直以來我們的Class都會繼承MonoBehavior但是繼承了Monobehavior的Class只在Play模式下執行,但當Play模式結束,所有被程式修改的部分都會復原,有時候我們會想要「保留」我們所做的更動,這時我們就得讓程式碼在編輯模式下也能運行,這裡有兩種方式可以達到這個效果
1.[ExecuteInEditMode]
2.[ExecuteAlways]
1.首先我們先創建一個資料夾叫做Prefab
2.在場景中新建一個Text 並把字體大小設定為14
3.把Text拖曳到Prefab資料夾中做成Prefab物件並創建一個資料夾叫做Code
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就可以看到程式執行的結果
結果一:Debug的資訊已經印出
結果二:Prefab資料夾中的Text字體大小已經被替換為18了
6.接下來試試先把MainCamera上的PrintAwake移除並進入遊戲模式此時卻發現,Prefab的字體大小又變回14
解釋:這是因為[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字體大小仍然保持更動狀態,所以我們可以用這個屬性在專案中做預製物件修改。
註記:這篇其實算是我工作上用到的功能,算是私人筆記,Unity官方也有文章,感謝觀看 :))
留言列表