【发布时间】:2018-12-23 06:23:02
【问题描述】:
我正在创建一个体素游戏以在度假时获得乐趣,我遇到了自定义检查器和编辑器,以便在创建新体素时让我的生活更轻松。
问题是:一个简单的体素有一个由6个面组成的网格,每个索引对应一个方向,例如北面是索引0的面,上面是索引4的面,以此类推上。但是,如果我让检查器按原样显示数组,则不能保证每个面都会放置在正确的索引上。
我的想法是创建自定义检查器并使其重新组织数组,编辑器的脚本将包含一个新数组“faces”(参见下面的代码),它接收一个面和一个方向,并显示在检查员,使之成为可能。当前代码是:
using System;
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(VoxelMesh))]
public class VoxelMeshEditor: Editor {
public enum DirectionEnum {
North,
East,
South,
West,
Up,
Down,
Other,
Special,
All
}
[Serializable]
public struct DirectionalFace {
public DirectionEnum direction;
public Face face;
}
[SerializeField] private DirectionalFace[] faces;
private SerializedObject soEditor;
private SerializedProperty spFaces;
private void OnEnable() {
soEditor = new SerializedObject(this);
spFaces = soEditor.FindProperty("faces");
}
public override void OnInspectorGUI() {
base.OnInspectorGUI();
if (EditorGUILayout.PropertyField(spFaces, true)) {
soEditor.ApplyModifiedProperties();
}
}
}
结果是:
它创建了一个不可更改的数组,我无法编辑它。我怎样才能使它可编辑?
提前致谢。
【问题讨论】:
-
序列化数据保存到磁盘,即:.asset 或 .unity 场景文件,即使您的方法有效,您的数据也只会保存到下一次程序集重新加载(重新编译编辑器项目时,即:在任何编辑器脚本更改上)。
-
即使“VoxelMesh”是 ScriptableObject?
-
“VoxelMesh”ScriptableObject 被写入它指向的资产文件。但是,在这种情况下,您正在使用序列化的“VoxelMeshEditor”。您可以尝试一种不同的方法,其中额外的结构是“VoxelMesh”本身的一部分(可选地使用 UNITY_EDITOR 条件),通过 Editor 类的“serializedObject”属性访问,或者将它们创建为 Editor 类中的实例字段并初始化它们在每次负载时(我建议使用这种方法)。