gpt4 book ai didi

c# - Unity - 在检查器中自定义结构图

转载 作者:太空宇宙 更新时间:2023-11-03 20:51:27 25 4
gpt4 key购买 nike

我有一个自定义结构,代码如下:

[Serializable]
public struct HexPoint : IEquatable<HexPoint>
{
public readonly int x;
public readonly int y;
public readonly int z;

// Some custom methods for initializations and operators
}

如果我将 x、y 和 z 变量设置为非只读,它们将在 unity inspector 中正常显示。但是,我有一些他们需要满足的规则(实际上是 x+y+z=0),所以我添加了 readonly 以防止人们弄乱它。

但作为只读变量,它们不会显示(因为它们不能被修改)! :(

我想知道它们是否是我在统一检查器中显示它们的一种方式,类似于 PropertyDrawer。我知道我可以将我的结构切换到一个类,因为 PropertyDrawer 是为类保留的,但我想将它保留为一个结构。

那么,有没有办法显示这些值呢?并最终使用自定义初始化程序修改它们?

非常感谢!

最佳答案

readonly 使它们也非序列化 -> 不显示在检查器中

请注意 PropertyDrawer 限于class 类型,但也可用于struct 类型。


实际上不需要 CustomPropertyDrawer

你可以有 public readonly properties访问私有(private)字段并在 Inspector 中显示它们使用 [SerializeField]这使得它们只能通过 Inspector 进行编辑,而不能通过其他类进行编辑。

[Serializable]
public struct HexPoint : IEquatable<HexPoint>
{
// Those are not displayed in the inspector,
// readonly and accessible by other classes
public int x { get { return _x; } }
public int y { get { return _y; } }
public int z { get { return _z; } }

// if you prefer you can also use the expression body style instead
//public int x => _x;
//public int y => _y;
//public int z => _z;

// Those are displayed and editable in the Inspector
// but private and therefor not changeable by other classes
[SerializeField] private int _x;
[SerializeField] private int _y;
[SerializeField] private int _z;

public bool Equals(HexPoint other)
{
return _x == other._x && _y == other._y && _z == other._z;
}

public override bool Equals(object obj)
{
return obj is HexPoint other && Equals(other);
}

public override int GetHashCode()
{
unchecked
{
var hashCode = _x;
hashCode = (hashCode * 397) ^ _y;
hashCode = (hashCode * 397) ^ _z;
return hashCode;
}
}
}

如果您真的想使用 PropertyDrawer 来另外禁止在检查器中编辑这些值,但仍然保存并查看它们,您可以添加一个,例如

[Serializable]
public struct HexPoint : IEquatable<HexPoint>
{
// Those are not displayed in the inspector,
// readonly and accessible by other classes
public int x { get { return _x; } }
public int y { get { return _y; } }
public int z { get { return _z; } }

// if you prefer you can also use the expression body style instead
//public int x => _x;
//public int y => _y;
//public int z => _z;

// Those are displayed and editable in the Inspector
// but private and therefor not changeable by other classes
[SerializeField] private int _x;
[SerializeField] private int _y;
[SerializeField] private int _z;

public bool Equals(HexPoint other)
{
return _x == other._x && _y == other._y && _z == other._z;
}

public override bool Equals(object obj)
{
return obj is HexPoint other && Equals(other);
}

public override int GetHashCode()
{
unchecked
{
var hashCode = _x;
hashCode = (hashCode * 397) ^ _y;
hashCode = (hashCode * 397) ^ _z;
return hashCode;
}
}

#if UNITY_EDITOR

[CustomPropertyDrawer(typeof(HexPoint))]
public class HexPointDrawer : PropertyDrawer
{
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
return EditorGUIUtility.singleLineHeight * (EditorGUIUtility.wideMode ? 1 : 2);
}

public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
// Find the SerializedProperties by name
var x = property.FindPropertyRelative(nameof(_x));
var y = property.FindPropertyRelative(nameof(_y));
var z = property.FindPropertyRelative(nameof(_z));

// Using BeginProperty / EndProperty on the parent property means that
// prefab override logic works on the entire property.
EditorGUI.BeginProperty(position, label, property);
{
// Makes the fields disabled / grayed out
EditorGUI.BeginDisabledGroup(true);
{
// In your case the best option would be a Vector3Field which handles the correct drawing
EditorGUI.Vector3IntField(position, label, new Vector3Int(x.intValue, y.intValue, z.intValue));
}
EditorGUI.EndDisabledGroup();
}
EditorGUI.EndProperty();
}
}

#endif
}

提示,用于在更改后检查值 MonoBehaviour.OnValidate您可能会感兴趣

关于c# - Unity - 在检查器中自定义结构图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54748945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com