如何讓變數在 Unity Inspector 可以動態更改?

以前在看 Unity 教學時,若想動態變更變數的數值大部分都會用 public,但其實用 private 和自己寫的 class 也能讓他動態變更,若有興趣歡迎繼續往下看!

Photo by fabio on Unsplash

在 private 變數上,加 [SerializeField]

以下為範例,示範 Vector3 和 Vecter3 Array 顯示的樣子 (突然發現 Array 顯示樣子變了!)


[SerializeField] private Vector3 position;

[SerializeField] private Vector3[] positionList;


像這邊 Array 沒指定大小,所以一開始是空的,按 + 新增

會變成這樣


在自己的 Class 上,加 [System.Serializable]

記得要先 using System,或是直接打 System.Serializable,但 System.Serializable 好像比較是比較不推薦的做法,因為每次呼叫可能都要 call 一次 System 庫去找功能,會比較耗效能。範例 (檔案名稱為 ClassSerialize.cs):


using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[Serializable]
class SerailizeClass
{
    public int id;
    public Vector3 direction;
    public List<Vector3> recordedPosition;
}

public class ClassSerialize : MonoBehaviour
{
    [SerializeField] private SerailizeClass[] serailizeClass;
}


上面這邊主要是示範 class 裡面有包含 List/Array。之前很驚訝的是 List 裡面包含自己的 class,若裡面有 List/Array 也是可以 Serialize,像是上面範例那樣。這樣就更方便製作自己想要的工具了。

另外,Serialize 有一些限制,可以參考官方文件:https://docs.unity3d.com/Manual/script-Serialization.html#SerializationRules。像是不能是 static、const 或 readonly。希望這篇能幫助到大家!

留言