Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 请参见Unity Inspector中的数组枚举索引_C#_Unity3d - Fatal编程技术网

C# 请参见Unity Inspector中的数组枚举索引

C# 请参见Unity Inspector中的数组枚举索引,c#,unity3d,C#,Unity3d,简而言之,我有一些数组,这些数组由枚举中的索引引用。然而,在Unity的inspector窗口中,它只是显示“元素0、元素1等”。我希望列表显示枚举的索引值。除非Unity添加了一个新功能,否则我想这需要一个特殊的编辑器脚本,但游戏代码似乎甚至不能与编辑器代码交互。那我该怎么做呢?提前谢谢 如果我有这个: 公共枚举对象列表 { 汽车 剑,, 朋友, 抑郁, 天体 } [以某种方式声明使用我的ObjectList枚举] public bool[]hasItem=new bool[(int)Obje

简而言之,我有一些数组,这些数组由枚举中的索引引用。然而,在Unity的inspector窗口中,它只是显示“元素0、元素1等”。我希望列表显示枚举的索引值。除非Unity添加了一个新功能,否则我想这需要一个特殊的编辑器脚本,但游戏代码似乎甚至不能与编辑器代码交互。那我该怎么做呢?提前谢谢

如果我有这个:

公共枚举对象列表
{
汽车
剑,,
朋友,
抑郁,
天体
}
[以某种方式声明使用我的ObjectList枚举]
public bool[]hasItem=new bool[(int)ObjectList.NumObjects];
理想情况下,检查员现在会显示:

Has Item
    Size        4
    Car         []
    Sword       []
    Friends     []
    Depression  []
而不是:

Has Item
    Size        4
    Element 0   []
    Element 1   []
    Element 2   []
    Element 3   []
编辑:作为Int数组的附加示例(不仅仅是bool)


不完全是你怎么描述的,但已经存在一些非常相似的东西:


我重写了一些脚本:

将此脚本放置在
资产
中的任何位置,例如
资产/插件/枚举标志

EnumFlagAttribute.cs

使用UnityEngine;
公共类EnumFlagAttribute:PropertyAttribute
{
公共枚举标记布局
{
下拉列表,
列表
}
公共FlagLayout _layout=FlagLayout.下拉列表;
公共EnumFlagAttribute(){}
公共枚举FlagAttribute(FlagLayout布局)
{
_布局=布局;
}
}
并将此编辑器脚本复制到名为
editor
的文件夹中(它放在
资产中的位置并不重要,只是它的名称计数),例如
Assets/Plugins/EnumFlag/editor
→Unity会自动从最终生成中排除放置在名为
Editor
文件夹中的所有脚本,因此不会因
UnityEditor
命名空间而出现生成错误

EnumFlagDrawer.cs

使用UnityEditor;
使用UnityEngine;
[CustomPropertyDrawer(typeof(EnumFlagAttribute))]
公共类EnumFlagDrawer:PropertyDrawer
{
public override void OnGUI(Rect位置、SerializedProperty属性、GUIContent标签)
{
EditorGUI.BeginProperty(位置、标签、属性);
if(property.propertyType==SerializedPropertyType.Enum)
{
开关(((EnumFlagAttribute)属性)。\u布局)
{
案例EnumFlagAttribute.FlagLayout.Dropdown:
property.intValue=EditorGUI.MaskField(位置、标签、property.intValue、property.enumNames);
打破
案例EnumFlagAttribute.FlagLayout.List:
var buttonsIntValue=0;
var enumLength=property.enumNames.Length;
var flagSet=新布尔值[enumLength];
LabelField(新的Rect(position.x,position.y,EditorGUIUtility.labelWidth,EditorGUIUtility.singleLineHeight),标签);
EditorGUI.indentLevel++;
var posX=位置x;
EditorGUI.BeginChangeCheck();
{
对于(变量i=0;i如果(((EnumFlagAttribute.FlagLayout)property.intValue)HasFlag((EnumFlagAttribute.FlagLayout)(1)上也有类似的问题。您需要为数组大小构建自定义检查器,请注意,您应该使用Enum.GetNames(typeof(MyEnum)).Length;,使用枚举的最后一项有点麻烦,而且考虑到它不是数组的元素……好吧,你明白了。@Everts我想这就是我之前一直在寻找的内容,但没有找到一个简单的enum.Length,我感到震惊。看起来这样做可能会有一点额外的开销,尽管必须创建一个完整的a一系列字符串名称只是为了询问它的长度。除非数组已经存在?当你调用时,它实际上会创建一个新数组,但这只是一次,所以我不会真的为它操心。谢谢你的回答。我没有意识到我必须将枚举更改为位掩码才能实现它。问题是我还有其他ar射线,例如我希望使用相同解决方案的int数组。有没有办法对int[]numItems执行此操作?实际上没有那么容易,至少不是作为属性…查看我的更新这似乎是尽可能接近我想要的。我希望不必更改我的数据类型,但我会尝试一下!谢谢!
Num Item
    Size        4
    Car         0
    Sword       10
    Friends     0
    Depression  50