An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
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.

142 lines
6.5 KiB

// This code is part of the Fungus library (http://fungusgames.com) maintained by Chris Gregan (http://twitter.com/gofungus).
// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE)
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
namespace Fungus.EditorUtils
{
[CustomEditor (typeof(SetVariable))]
public class SetVariableEditor : CommandEditor
{
protected struct VariablePropertyInfo
{
public string name;
public SerializedProperty dataProp;
public VariablePropertyInfo(string name, SerializedProperty dataProp) {
this.name = name;
this.dataProp = dataProp;
}
}
protected SerializedProperty variableProp;
protected SerializedProperty setOperatorProp;
// Variable data props
protected Dictionary<System.Type, VariablePropertyInfo> propertyInfoByVariableType;
protected List<SerializedProperty> variableDataProps;
public override void OnEnable()
{
base.OnEnable();
variableProp = serializedObject.FindProperty("variable");
setOperatorProp = serializedObject.FindProperty("setOperator");
// Get variable data props by name
propertyInfoByVariableType = new Dictionary<System.Type, VariablePropertyInfo>() {
{ typeof(BooleanVariable), new VariablePropertyInfo("Boolean", serializedObject.FindProperty("booleanData")) },
{ typeof(IntegerVariable), new VariablePropertyInfo("Integer", serializedObject.FindProperty("integerData")) },
{ typeof(FloatVariable), new VariablePropertyInfo("Float", serializedObject.FindProperty("floatData")) },
{ typeof(StringVariable), new VariablePropertyInfo("String", serializedObject.FindProperty("stringData")) },
{ typeof(AnimatorVariable), new VariablePropertyInfo("Animator", serializedObject.FindProperty("animatorData")) },
{ typeof(AudioSourceVariable), new VariablePropertyInfo("AudioSource", serializedObject.FindProperty("audioSourceData")) },
{ typeof(ColorVariable), new VariablePropertyInfo("Color", serializedObject.FindProperty("colorData")) },
{ typeof(GameObjectVariable), new VariablePropertyInfo("GameObject", serializedObject.FindProperty("gameObjectData")) },
{ typeof(MaterialVariable), new VariablePropertyInfo("Material", serializedObject.FindProperty("materialData")) },
{ typeof(ObjectVariable), new VariablePropertyInfo("Object", serializedObject.FindProperty("objectData")) },
{ typeof(Rigidbody2DVariable), new VariablePropertyInfo("Rigidbody2D", serializedObject.FindProperty("rigidbody2DData")) },
{ typeof(SpriteVariable), new VariablePropertyInfo("Sprite", serializedObject.FindProperty("spriteData")) },
{ typeof(TextureVariable), new VariablePropertyInfo("Texture", serializedObject.FindProperty("textureData")) },
{ typeof(TransformVariable), new VariablePropertyInfo("Transform", serializedObject.FindProperty("transformData")) },
{ typeof(Vector2Variable), new VariablePropertyInfo("Vector2", serializedObject.FindProperty("vector2Data")) },
{ typeof(Vector3Variable), new VariablePropertyInfo("Vector3", serializedObject.FindProperty("vector3Data")) }
};
}
public override void DrawCommandGUI()
{
serializedObject.Update();
SetVariable t = target as SetVariable;
var flowchart = (Flowchart)t.GetFlowchart();
if (flowchart == null)
{
return;
}
// Select Variable
EditorGUILayout.PropertyField(variableProp);
if (variableProp.objectReferenceValue == null)
{
serializedObject.ApplyModifiedProperties();
return;
}
// Get selected variable
Variable selectedVariable = variableProp.objectReferenceValue as Variable;
System.Type variableType = selectedVariable.GetType();
// Get operators for the variable
SetOperator[] setOperators = SetVariable.operatorsByVariableType[variableType];
// Create operator list
List<GUIContent> operatorsList = new List<GUIContent>();
foreach (var setOperator in setOperators)
{
switch (setOperator)
{
case SetOperator.Assign:
operatorsList.Add(new GUIContent("="));
break;
case SetOperator.Negate:
operatorsList.Add(new GUIContent("=!"));
break;
case SetOperator.Add:
operatorsList.Add(new GUIContent("+="));
break;
case SetOperator.Subtract:
operatorsList.Add(new GUIContent("-="));
break;
case SetOperator.Multiply:
operatorsList.Add(new GUIContent("*="));
break;
case SetOperator.Divide:
operatorsList.Add(new GUIContent("\\="));
break;
default:
Debug.LogError("The " + setOperator.ToString() + " operator has no matching GUIContent.");
break;
}
}
// Get previously selected operator
int selectedIndex = System.Array.IndexOf(setOperators, t._SetOperator);
if (selectedIndex < 0)
{
// Default to first index if the operator is not found in the available operators list
// This can occur when changing between variable types
selectedIndex = 0;
}
// Get next selected operator
selectedIndex = EditorGUILayout.Popup(new GUIContent("Operation", "Arithmetic operator to use"), selectedIndex, operatorsList.ToArray());
setOperatorProp.enumValueIndex = (int)setOperators[selectedIndex];
VariablePropertyInfo propertyInfo = propertyInfoByVariableType[variableType];
EditorGUILayout.PropertyField(propertyInfo.dataProp, new GUIContent(propertyInfo.name));
serializedObject.ApplyModifiedProperties();
}
}
}