Unity Inspector能否初始化二维数组?自定义脚本实现方法咨询
解决Unity中二维数组无法在Inspector初始化的问题
Unity默认不支持在Inspector面板中直接初始化多维数组(比如int[,]),但完全可以通过脚本实现初始化,下面提供两种实用方案:
方案一:用OnValidate自动初始化
在你的MonoBehaviour类中添加OnValidate方法,该方法会在脚本加载或Inspector值变更时自动执行,帮你完成数组初始化:
using UnityEngine; public class ArrayHandler : MonoBehaviour { [SerializeField] private int rowCount = 2; [SerializeField] private int columnCount = 2; [SerializeField] private int[,] twoDimensionalArray; private void OnValidate() { // 防止行数/列数为0的无效值 rowCount = Mathf.Max(1, rowCount); columnCount = Mathf.Max(1, columnCount); // 仅当数组尺寸与设定值不符时重新初始化 if (twoDimensionalArray == null || twoDimensionalArray.GetLength(0) != rowCount || twoDimensionalArray.GetLength(1) != columnCount) { twoDimensionalArray = new int[rowCount, columnCount]; // 可选:给数组设置默认值,比如全部设为1 for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { twoDimensionalArray[i, j] = 1; } } } } }
使用时,你只需在Inspector中调整rowCount和columnCount的数值,数组会自动更新为对应大小,还能顺便设置默认值。
方案二:自定义Editor脚本实现可视化编辑
如果需要在Inspector中直接编辑二维数组的每个元素,可以编写自定义Editor脚本(需放在项目的Editor文件夹下):
using UnityEditor; using UnityEngine; [CustomEditor(typeof(ArrayHandler))] public class ArrayHandlerEditor : Editor { public override void OnInspectorGUI() { ArrayHandler targetScript = (ArrayHandler)target; // 让用户输入行列数 targetScript.rowCount = EditorGUILayout.IntField("行数", targetScript.rowCount); targetScript.columnCount = EditorGUILayout.IntField("列数", targetScript.columnCount); // 修正非法数值 targetScript.rowCount = Mathf.Max(1, targetScript.rowCount); targetScript.columnCount = Mathf.Max(1, targetScript.columnCount); // 初始化或更新数组尺寸 if (targetScript.twoDimensionalArray == null || targetScript.twoDimensionalArray.GetLength(0) != targetScript.rowCount || targetScript.twoDimensionalArray.GetLength(1) != targetScript.columnCount) { targetScript.twoDimensionalArray = new int[targetScript.rowCount, targetScript.columnCount]; } // 绘制数组元素编辑区域 EditorGUILayout.Space(); EditorGUILayout.LabelField("二维数组元素"); for (int i = 0; i < targetScript.rowCount; i++) { EditorGUILayout.BeginHorizontal(); for (int j = 0; j < targetScript.columnCount; j++) { targetScript.twoDimensionalArray[i, j] = EditorGUILayout.IntField( targetScript.twoDimensionalArray[i, j], GUILayout.Width(50) ); } EditorGUILayout.EndHorizontal(); } // 保存修改 if (GUI.changed) { EditorUtility.SetDirty(target); } } }
添加这个脚本后,你就能在Inspector面板中直接编辑二维数组的每个元素,操作更直观。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

