Gameplay Ingredients是一组用于 Unity 游戏的运行时和编辑器工具:一组脚本的集合,可在制作游戏和原型时简化简单的任务。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

74 行
2.8 KiB

using UnityEngine.SceneManagement;
using UnityEngine;
using UnityEditor;
using GameplayIngredients.StateMachines;
namespace GameplayIngredients.Editor
{
[CustomPropertyDrawer(typeof(StateMachineStateAttribute))]
public class StateMachineStatePropertyDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
string propertyName = (attribute as StateMachineStateAttribute).PropertyName;
StateMachine stateMachine;
if (propertyName == "")
stateMachine = (StateMachine)property.serializedObject.targetObject;
else
stateMachine = (StateMachine)property.serializedObject.FindProperty(propertyName).objectReferenceValue;
if (stateMachine == null)
{
EditorGUI.HelpBox(position, "StateMachineStateAttribute property parameter references a null or not a GameplayIngredients.StateMachines.StateMachine type", MessageType.Error);
}
else
{
if(stateMachine != null && stateMachine.States != null)
{
string currentValue = property.stringValue;
int count = stateMachine.States.Length;
int[] indices = new int[count];
GUIContent[] labels = new GUIContent[count];
int selected = -1;
for (int i = 0; i < count; i++)
{
indices[i] = i;
if (stateMachine.States[i] != null)
{
string stateName = stateMachine.States[i].StateName;
if (stateName == currentValue)
selected = i;
labels[i] = new GUIContent(stateName);
}
else
labels[i] = new GUIContent("(Null State, please fix)");
}
int newIdx = EditorGUI.IntPopup(position, new GUIContent(property.displayName), selected, labels, indices);
if (GUI.changed && newIdx >= 0 && stateMachine.States[newIdx] != null)
{
property.stringValue = stateMachine.States[newIdx].StateName;
}
}
else
{
EditorGUI.HelpBox(position, "State machine is null or has no states", MessageType.Error);
}
}
}
static class Styles
{
public static GUIStyle errorfield;
static Styles()
{
errorfield = new GUIStyle(EditorStyles.objectField);
}
}
}
}