You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.8 KiB
77 lines
2.8 KiB
5 years ago
|
// ----------------------------------------------------------------------------
|
||
|
// Unite 2017 - Game Architecture with Scriptable Objects
|
||
|
//
|
||
|
// Author: Ryan Hipple
|
||
|
// Date: 10/04/17
|
||
|
// ----------------------------------------------------------------------------
|
||
|
|
||
|
/******************************************************************************
|
||
|
* Note from me:
|
||
|
* If you have not watched this presentation, drop everything and watch it now
|
||
|
* https://youtu.be/raQ3iHhE_Kk
|
||
|
*
|
||
|
* YOU MUST MASTER THIS CONTENT!
|
||
|
*****************************************************************************/
|
||
|
|
||
|
using UnityEditor;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace Architecture.Variables
|
||
|
{
|
||
|
[CustomPropertyDrawer(typeof(FloatReference))]
|
||
|
public class FloatReferenceDrawer : PropertyDrawer
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Options to display in the popup to select constant or variable.
|
||
|
/// </summary>
|
||
|
private readonly string[] popupOptions =
|
||
|
{ "Use Constant", "Use Variable" };
|
||
|
|
||
|
/// <summary> Cached style to use to draw the popup button. </summary>
|
||
|
private GUIStyle popupStyle;
|
||
|
|
||
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
||
|
{
|
||
|
if (popupStyle == null)
|
||
|
{
|
||
|
popupStyle = new GUIStyle(GUI.skin.GetStyle("PaneOptions"));
|
||
|
popupStyle.imagePosition = ImagePosition.ImageOnly;
|
||
|
}
|
||
|
|
||
|
label = EditorGUI.BeginProperty(position, label, property);
|
||
|
position = EditorGUI.PrefixLabel(position, label);
|
||
|
|
||
|
EditorGUI.BeginChangeCheck();
|
||
|
|
||
|
// Get properties
|
||
|
SerializedProperty useConstant = property.FindPropertyRelative("UseConstant");
|
||
|
SerializedProperty constantValue = property.FindPropertyRelative("ConstantValue");
|
||
|
SerializedProperty variable = property.FindPropertyRelative("Variable");
|
||
|
|
||
|
// Calculate rect for configuration button
|
||
|
Rect buttonRect = new Rect(position);
|
||
|
buttonRect.yMin += popupStyle.margin.top;
|
||
|
buttonRect.width = popupStyle.fixedWidth + popupStyle.margin.right;
|
||
|
position.xMin = buttonRect.xMax;
|
||
|
|
||
|
// Store old indent level and set it to 0, the PrefixLabel takes care of it
|
||
|
int indent = EditorGUI.indentLevel;
|
||
|
EditorGUI.indentLevel = 0;
|
||
|
|
||
|
int result = EditorGUI.Popup(buttonRect, useConstant.boolValue ? 0 : 1, popupOptions, popupStyle);
|
||
|
|
||
|
useConstant.boolValue = result == 0;
|
||
|
|
||
|
EditorGUI.PropertyField(position,
|
||
|
useConstant.boolValue ? constantValue : variable,
|
||
|
GUIContent.none);
|
||
|
|
||
|
if (EditorGUI.EndChangeCheck())
|
||
|
property.serializedObject.ApplyModifiedProperties();
|
||
|
|
||
|
EditorGUI.indentLevel = indent;
|
||
|
EditorGUI.EndProperty();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|