using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using BansheeEngine; namespace BansheeEditor { /// /// Displays GUI for a serializable property containing a reference. /// public class InspectableGameObjectRef : InspectableField { private GameObject propertyValue; private GUIGameObjectField guiField; private bool isInitialized; /// /// Creates a new inspectable game object reference GUI for the specified property. /// /// Name of the property, or some other value to set as the title. /// Determines how deep within the inspector nesting hierarchy is this field. Some fields may /// contain other fields, in which case you should increase this value by one. /// Parent layout that all the field elements will be added to. /// Serializable property referencing the array whose contents to display. public InspectableGameObjectRef(string title, int depth, InspectableFieldLayout layout, SerializableProperty property) : base(title, depth, layout, property) { } /// /// Initializes the GUI elements the first time gets called. /// /// Index at which to insert the GUI elements. private void Initialize(int layoutIndex) { if (property.Type == SerializableProperty.FieldType.GameObjectRef) { guiField = new GUIGameObjectField(property.InternalType, new GUIContent(title)); guiField.OnChanged += OnFieldValueChanged; layout.AddElement(layoutIndex, guiField); } isInitialized = true; } /// protected override bool IsModified() { if (!isInitialized) return true; GameObject newPropertyValue = property.GetValue(); if (propertyValue != newPropertyValue) return true; return base.IsModified(); } /// protected override void Update(int layoutIndex) { base.Update(layoutIndex); if (!isInitialized) Initialize(layoutIndex); propertyValue = property.GetValue(); if (guiField != null) guiField.Value = propertyValue; } /// /// Triggered when the user drops a new game object onto the field, or clears the current value. /// /// New game object to reference. private void OnFieldValueChanged(GameObject newValue) { property.SetValue(newValue); } } }