[Unity] 如何讓場景物件也能拖拉到 Inspector 中?

發表日期:
2020.12.26
/
分類:
當你想要用 Unity 內建的 SceneManager 切換場景時通常是手動輸入名字讓他跑,但是應該是時候意識到這是一個非常不好的作法,因為無法保證未來不會有人更動這個場景名稱

當你想要用 Unity 內建的 SceneManager 切換場景時通常是手動輸入名字讓他跑,但是應該是時候意識到這是一個非常不好的作法,因為無法保證未來不會有人更動這個場景名稱。

之前我有找到能直接下 public Object xxxx 來讓 Inspector 能直接拖拉場景物件,但是有遇到 1. 能拖拉其他不相干的物件2. 編譯出來後可能無法動作 問題,所以基本上 Object 是行不通的。

那該怎麼做才能輕鬆指定場景呢?在 Mirror Networking 包中有個編輯器腳本名為 SceneDrawer.cs,搭配 SceneAttribute.cs 即可用 [Scene] public string xxx 在 Inspector 中顯示出場景拖拉欄位。
目前這個解決方案應該算是最好的解法,要說缺點的話就是我們宣告的 string 能拿到的資訊是場景的「路徑」,所以得自己用字串處理來抓出其中的名稱 (在最後我們會提到)。

原始碼資料

首先請 Clone 以下兩支腳本內容到你的專案中。

SceneDrawer.cs

請放置於任何名為 Editor 的資料夾下。

SceneAttribute.cs

放在 Assets 以下任一位置就行。

如何使用?

隨意新增一個繼承 MonoBehaviour 的腳本,內容如下,並將它掛載到一個空物件上。

最後你就能直接拖拉場景物件到 Inspector 中啦!

在前面我們有提到,這邊字串拿到的場景資訊是它的「路徑」,所以如果我們要拿來做場景切換還需要一到字串處理的程序。我的作法是用路徑中的斜槓分割後,取得最後一個元素並移除 .unity 副檔名後就是場景名稱,請參考下方原始碼:

更新 TestScript.cs 內容,在 Start 中 Log 出場景名稱。

最後結果如下,我們已成功取出場景名稱,之後就能用這筆資料來進行場景操作。

comments powered by Disqus