首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >CustomEditor统一:一次选择枚举+显示数组

CustomEditor统一:一次选择枚举+显示数组
EN

Stack Overflow用户
提问于 2018-09-30 06:05:22
回答 1查看 632关注 0票数 0

我试图在Unity上做一件事,但却被困住了;

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

What I got and what I want (image)

这就是我现在得到的脚本

代码语言:javascript
复制
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上没有经验,所以到目前为止我得到的是

代码语言:javascript
复制
[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);
            }
        }

    }

}

这意味着,在编辑器中:

If I change the value of one enum, all the others copy it (image)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-30 06:26:37

试着理解你在做什么。您的错误在于没有修改数组元素和其他一些问题。

这是您的新ClasseTest

代码语言:javascript
复制
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;
}

这是您的新TestCustomInspector类:

代码语言:javascript
复制
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();
    }
}

在Unity中:

希望这能起作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52572924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档