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();
}
}