【问题标题】:Unity - Custom Inspector non-editable arrayUnity - 自定义检查器不可编辑数组
【发布时间】: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 类中的实例字段并初始化它们在每次负载时(我建议使用这种方法)。

标签: c# unity3d


【解决方案1】:

尝试将 DirectionalFace[] faces 变量从私有更改为公共。

【讨论】:

  • 了解 SetDirty() 方法
  • 来自文档本身:“脏标志在内部用于查找需要保存到磁盘的更改资产”,我什至无法编辑数组,尝试使用 SetDirty 并没有改变了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多