You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/3rd/ThirteenPixels/Placr/Editor/PlacrModifierList.cs

101 lines
2.5 KiB
C#

// Copyright © Sascha Graeff/13Pixels.
namespace ThirteenPixels.Placr
{
using UnityEngine;
using UnityEditor;
using System;
using System.Linq;
internal class PlacrModifierList : ScriptableObject
{
[Serializable]
private class ModifierSlot
{
private readonly Type type;
public PlacrModifierBase modifier;
public bool active = false;
public ModifierSlot(Type type)
{
this.type = type;
modifier = (PlacrModifierBase)CreateInstance(type);
}
public void ApplyTo(GameObject gameObject)
{
if (active)
{
modifier.ApplyTo(gameObject);
}
}
public void SetActive(bool active)
{
this.active = active;
}
}
private SerializedObject serializedObject;
[SerializeField]
private ModifierSlot[] slots = default;
public int activeModifierCount => slots.Count(slot => slot.active);
private void Awake()
{
InitializeTypes();
serializedObject = new SerializedObject(this);
}
private void InitializeTypes()
{
slots = TypeCache.GetTypesDerivedFrom<PlacrModifierBase>()
.Where(type => !type.IsAbstract)
.Select(type => new ModifierSlot(type))
.ToArray();
}
public void ApplyTo(GameObject gameObject)
{
foreach (var slot in slots)
{
slot.ApplyTo(gameObject);
}
}
public void Display()
{
if (serializedObject == null)
{
serializedObject = new SerializedObject(this);
}
serializedObject.Update();
foreach (var slot in slots)
{
GUILayout.BeginVertical(GUI.skin.GetStyle("Box"));
var wasActive = slot.active;
var active = GUILayout.Toggle(wasActive, slot.modifier.title);
if (active != wasActive)
{
slot.SetActive(active);
}
if (active)
{
slot.modifier.DisplayProperties();
}
GUILayout.EndVertical();
}
serializedObject.ApplyModifiedPropertiesWithoutUndo();
}
}
}