C# CustomEditor Unity:立即选择枚举+;显示阵列

C# CustomEditor Unity:立即选择枚举+;显示阵列,c#,unity3d,editor,inspector,C#,Unity3d,Editor,Inspector,我正试图做一件关于团结的事情,却被抓住了 这可能有点复杂,但看看您是否可以帮助我: 这是我现在拿到的剧本 public class ClasseTest : MonoBehaviour{ public enum TiposDeMissoes { TipoMatarGente, TipoPegarItem, }; public TiposDeMissoes TiposMissoes; [Serializabl

我正试图做一件关于团结的事情,却被抓住了

这可能有点复杂,但看看您是否可以帮助我:

这是我现在拿到的剧本

public class ClasseTest : MonoBehaviour{


    public enum TiposDeMissoes
    {
        TipoMatarGente,
        TipoPegarItem,
    };
        public TiposDeMissoes TiposMissoes;


    [Serializable]
    public class MatarGente
    {
        public int IDmissao;
        public GameObject[] ObjetosAtivarPraMissao;
        public GameObject[] Checkpoints;
        public GameObject[] InimigosPraMatar;
    }
    [Serializable]
    public class PegarItem
    {
        public int IDmissao;
        public GameObject[] ObjetosAtivarPraMissao;
        public GameObject[] Checkpoints;
        public GameObject[] ItemsEntregar;
    }

    [Serializable]
    public class Missoes
    {
        public TiposDeMissoes TiposMissoes;
        public PegarItem[] PegarItem;
        public MatarGente[] MatarGente;
    }

    public Missoes[] MissoesJogasso;

}
如果在枚举中选择了PegarItem,我只知道如何显示类PegarItem

现在只有PegarItem和MatarGente,但会有更多的课程

我做了一些研究,发现如果我想做到这一点,我应该使用OnInspectorGUI(如果有其他方法,请告诉我)

我在CustomEditor上没有任何经验,所以到目前为止我得到的是

[CustomEditor(typeof(ClasseTest))]
public class TestCustomInspector : Editor
{
    public int numMissoes;

    public override void OnInspectorGUI()
    {
        ClasseTest script = (ClasseTest)target;

        numMissoes = EditorGUILayout.IntField("Numero de Missoes", numMissoes);

        EditorGUILayout.LabelField("Editante");
        var serializedObject = new SerializedObject(target);
        var property = serializedObject.FindProperty("MissoesJogasso");
        serializedObject.Update();
        EditorGUILayout.PropertyField(property, true);
        serializedObject.ApplyModifiedProperties();

        for (int i = 0; i < numMissoes; i++)
        {
            script.TiposMissoes = (ClasseTest.TiposDeMissoes)EditorGUILayout.EnumPopup("TIPO DE MISSAO", script.TiposMissoes);

            if (script.TiposMissoes == ClasseTest.TiposDeMissoes.TipoMatarGente)
            {
                script.TiposMissoes = (ClasseTest.TiposDeMissoes)EditorGUILayout.EnumPopup("Matar Gentes", script.TiposMissoes);
            }

            if (script.TiposMissoes == ClasseTest.TiposDeMissoes.TipoPegarItem)
            {
                script.TiposMissoes = (ClasseTest.TiposDeMissoes)EditorGUILayout.EnumPopup("Pegar Item", script.TiposMissoes);
            }
        }

    }

}
[CustomEditor(typeof(ClasseTest))]
公共类TestCustomInspector:编辑器
{
公共国际货币基金组织;
公共覆盖无效OnInspectorGUI()
{
ClasseTest脚本=(ClasseTest)目标;
numMissoes=EditorGUILayout.IntField(“错误编号”,numMissoes);
EditorGUILayout.LabelField(“Editante”);
var serializedObject=新的serializedObject(目标);
var属性=serializedObject.FindProperty(“MissoesJogasso”);
serializedObject.Update();
EditorGUILayout.PropertyField(property,true);
serializedObject.ApplyModifiedProperties();
对于(int i=0;i
这意味着,在编辑中:

这正是我不想要的。 大家记住,当编辑器选择MatarGente或PegarItem时,我想显示这些类所包含的所有可能的变量。这包括具有非特定长度的数组。
此外,如果有2个“MatarGente”,我希望能够用不同的对象填充这些数组,并在以后检索这些信息以在其他地方使用。

试图了解您在做什么。您的错误是没有修改数组元素和其他一些问题

这是您新的
ClasseTest

using System;
using UnityEngine;
using System.Collections.Generic;

public class ClasseTest : MonoBehaviour
{
    public enum TiposDeMissoes
    {
        TipoMatarGente,
        TipoPegarItem,
    }

    [Serializable]
    public class MatarGente
    {
        public int IDmissao;
        public GameObject[] ObjetosAtivarPraMissao;
        public GameObject[] Checkpoints;
        public GameObject[] InimigosPraMatar;
    }

    [Serializable]
    public class PegarItem
    {
        public int IDmissao;
        public GameObject[] ObjetosAtivarPraMissao;
        public GameObject[] Checkpoints;
        public GameObject[] ItemsEntregar;
    }

    [Serializable]
    public class Missoes
    {
        public TiposDeMissoes TiposMissoes;
        public PegarItem[] PegarItem;
        public MatarGente[] MatarGente;
    }

    public List<Missoes> MissoesJogasso;
    public int NumMissoes;
}
团结一致:


希望这能起作用。

不完全是这样,但看起来比以前好多了。我现在可以单独更改枚举值,这样它们就不会再互相更改了,但每次我在第一个字段(“错误编号”,nummisses)上键入内容时,控制台中都不会出现一条消息,上面写着“参数超出范围:参数名称索引”@Milena我已经更新了
TestCustomInspector
类,告诉我它是否有效。但到目前为止,这是一个巨大的升级。谢谢。我会测试它。我在那一个上又犯了3个错误。对不起:x我会尝试从你发送的另一个版本中找出一些东西。如果你使用了很多数组和列表,你可能会想进入其中。刚开始的时候有点棘手,但是一旦你掌握了它,它就非常酷并且容易编码
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;

[CustomEditor(typeof(ClasseTest))]
public class TestCustomInspector : Editor
{
    public override void OnInspectorGUI()
    {
        ClasseTest script = (ClasseTest)target;

        script.NumMissoes = EditorGUILayout.IntField("Numero de Missoes", script.NumMissoes);
        // Ensure it cannot go into negative numbers.
        if (script.NumMissoes < 0) script.NumMissoes = 0;

        // Create the list if it does not exist.
        if(script.MissoesJogasso == null) script.MissoesJogasso = new List<ClasseTest.Missoes>();

        // numMissoes being greater than the current count means we need to extend the list.
        if (script.NumMissoes > script.MissoesJogasso.Count)
        {
            for (int i = 0; i < script.NumMissoes; i++)
            {
                script.MissoesJogasso.Add(new ClasseTest.Missoes());
            }
        }
        // numMissoes being less than the current count means we need to decrease the list.
        else if(script.NumMissoes < script.MissoesJogasso.Count)
        {
            int difference = script.MissoesJogasso.Count - script.NumMissoes;

            // Remove the last element difference number of times.
            for (int i = 0; i < difference; i++)
            {
                script.MissoesJogasso.RemoveAt(script.MissoesJogasso.Count - 1);
            }
        }

        var serializedTarget = new SerializedObject(target);

        for (int i = 0; i < script.MissoesJogasso.Count; i++)
        {
            var missoes = script.MissoesJogasso[i];

            switch(missoes.TiposMissoes)
            {
                case ClasseTest.TiposDeMissoes.TipoMatarGente:
                    missoes.TiposMissoes = (ClasseTest.TiposDeMissoes)EditorGUILayout.EnumPopup("Matar Gentes", missoes.TiposMissoes);
                    DrawProperty(serializedTarget, string.Format("MissoesJogasso.Array.data[{0}].MatarGente", i));
                    break;

                case ClasseTest.TiposDeMissoes.TipoPegarItem:
                    missoes.TiposMissoes = (ClasseTest.TiposDeMissoes)EditorGUILayout.EnumPopup("Pegar Item", missoes.TiposMissoes);
                    DrawProperty(serializedTarget, string.Format("MissoesJogasso.Array.data[{0}].PegarItem", i));
                    break;
            }
        }
    }

    private void DrawProperty(SerializedObject serializedObject, string propertyName)
    {
        var property = serializedObject.FindProperty(propertyName);
        serializedObject.Update();
        EditorGUILayout.PropertyField(property, true);
        serializedObject.ApplyModifiedProperties();
    }
}