lucid-super-dream/Assets/Scripts/Editor/SpawnZonePropertyDrawer.cs

83 lines
3.2 KiB
C#

using UnityEditor;
using UnityEngine;
using Weapons.Spawning;
namespace Weapons.Editor
{
[CustomPropertyDrawer(typeof(SpawnZone))]
public class SpawnZonePropertyDrawer : PropertyDrawer
{
private const float spacing = 0.3f;
private float _compositeHeight = 0;
private int numFields = 5;
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
var currentPos = position;
currentPos.height = 18;
var space = currentPos.height * spacing;
numFields = 0;
++numFields;
EditorGUI.LabelField(currentPos, label, EditorStyles.boldLabel);
EditorGUI.indentLevel++;
var currentType = (SpawnType) property.FindPropertyRelative("spawnType").enumValueIndex;
currentPos = EditorGUI.IndentedRect(currentPos);
AddRelativeProperty( property, "numToSpawn", space, ref currentPos);
AddRelativeProperty( property, "spawnDir", space, ref currentPos);
AddRelativeProperty( property, "surfaceOnly", space, ref currentPos);
AddRelativeProperty(property, "offset", space, ref currentPos);
AddRelativeProperty( property, "spawnType", space, ref currentPos);
if (currentType == SpawnType.Circle)
{
AddRelativeProperty( property, "radius", space, ref currentPos);
AddRelativeProperty( property, "arc", space, ref currentPos);
AddRelativeProperty( property, "evenDistribution", space, ref currentPos);
} else if (currentType == SpawnType.Square)
{
AddRelativeProperty( property, "width", space, ref currentPos);
AddRelativeProperty( property, "height", space, ref currentPos);
} else if (currentType == SpawnType.Composite)
{
_compositeHeight = EditorGUI.GetPropertyHeight(property.FindPropertyRelative("composite"));
AddRelativeProperty(property, "composite", space, ref currentPos);
} else if (currentType == SpawnType.Polygon)
{
AddRelativeProperty(property, "numSides", space, ref currentPos);
AddRelativeProperty(property, "numPerSide", space, ref currentPos);
AddRelativeProperty( property, "radius", space, ref currentPos);
}
EditorGUI.indentLevel--;
}
private void AddRelativeProperty(SerializedProperty property, string name, float space, ref Rect currentPos)
{
currentPos.y += currentPos.height + space;
++numFields;
EditorGUI.PropertyField(currentPos, property.FindPropertyRelative(name), true);
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
var baseHeight = base.GetPropertyHeight(property, label);
return (baseHeight * (1 + spacing) * numFields) + _compositeHeight;
}
}
}