cvr-props/Assets/ABI.CCK/Scripts/Editor/CCK_CVRInteractableEditor.cs
2023-07-30 01:20:46 +02:00

1053 lines
No EOL
57 KiB
C#
Executable file

using System;
using System.Collections.Generic;
using System.Reflection;
using ABI.CCK.Components;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
namespace ABI.CCK.Scripts.Editor
{
[CustomEditor(typeof(ABI.CCK.Components.CVRInteractable))]
[CanEditMultipleObjects]
public class CCK_CVRInteractableEditor : UnityEditor.Editor
{
private CVRInteractable _interactable;
private static string[] gameObjectStates = new string[] {"Enable", "Disable", "Toggle" };
private static string[] variableComparisions = new string[] {"Buffer -> static", "Buffer -> Buffer" };
private static string[] variableComparitors = new string[] {"==", ">=", ">", "<", "<=", "!=" };
private static string[] arithmeticConstellations = new string[] {"Buffer -> static", "Buffer -> Buffer", "Buffer -> Random" };
private static string[] arithmeticOperators = new string[] {"+", "-", "*", "÷", "mod", "pow", "log"};
private static string[] timerModes = new string[] {"once on enable", "repeat", "deactivate self"};
private static string[] spawnableUpdateTypes = new string[] {"Override", "Add", "Subtract", "Toggle"};
private static string[] apfSetTypes = new string[] {"Static", "Variable Buffer"};
private static string[] apfSetTypesString = new string[] {"Static", "Property"};
public override void OnInspectorGUI()
{
if (_interactable == null) _interactable = (CVRInteractable)target;
_interactable.tooltip = EditorGUILayout.TextField("Tooltip:", _interactable.tooltip);
EditorGUILayout.LabelField("Triggers:", EditorStyles.boldLabel);
var actionIndex = 0;
foreach (CVRInteractableAction trigger in _interactable.actions)
{
GUILayout.BeginVertical("HelpBox");
GUILayout.BeginHorizontal ();
trigger.actionType = (CVRInteractableAction.ActionRegister) EditorGUILayout.EnumPopup("Trigger:", trigger.actionType);
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal ();
GUILayout.BeginVertical ("GroupBox");
trigger.execType = (CVRInteractableAction.ExecutionType) EditorGUILayout.EnumPopup("Broadcast Type:", trigger.execType);
if (trigger.actionType == CVRInteractableAction.ActionRegister.OnEnterCollider ||
trigger.actionType == CVRInteractableAction.ActionRegister.OnExitCollider ||
trigger.actionType == CVRInteractableAction.ActionRegister.OnEnterTrigger ||
trigger.actionType == CVRInteractableAction.ActionRegister.OnExitTrigger)
{
LayerMask tempMask = EditorGUILayout.MaskField("Layer:", InternalEditorUtility.LayerMaskToConcatenatedLayersMask(trigger.layerMask), InternalEditorUtility.layers);
trigger.layerMask = InternalEditorUtility.ConcatenatedLayersMaskToLayerMask(tempMask);
}
if (trigger.actionType == CVRInteractableAction.ActionRegister.OnTimer)
{
trigger.floatVal = EditorGUILayout.FloatField("Seconds:", trigger.floatVal);
trigger.floatVal2 = EditorGUILayout.Popup("Mode:", (int)trigger.floatVal2, timerModes);
}
if (trigger.actionType == CVRInteractableAction.ActionRegister.OnInteractDown ||
trigger.actionType == CVRInteractableAction.ActionRegister.OnInteractUp)
{
trigger.floatVal = EditorGUILayout.FloatField("Distance:", trigger.floatVal);
}
if (trigger.actionType == CVRInteractableAction.ActionRegister.OnVariableBufferUpdate)
{
trigger.varBufferVal = (CVRVariableBuffer) EditorGUILayout.ObjectField("Value:", trigger.varBufferVal, typeof(CVRVariableBuffer), true);
}
if (trigger.actionType == CVRInteractableAction.ActionRegister.OnVariableBufferComparision)
{
trigger.floatVal = EditorGUILayout.Popup("Type:", (int)trigger.floatVal, variableComparisions);
trigger.varBufferVal = (CVRVariableBuffer) EditorGUILayout.ObjectField("Value 1:", trigger.varBufferVal, typeof(CVRVariableBuffer), true);
if (trigger.varBufferVal != null)
{
trigger.varBufferVal.AddInteracteable(_interactable);
}
trigger.floatVal2 = EditorGUILayout.Popup("Comparitor:", (int)trigger.floatVal2, variableComparitors);
if (trigger.floatVal == 0)
{
trigger.floatVal3 = EditorGUILayout.FloatField("Value 2:", trigger.floatVal3);
}
else
{
trigger.varBufferVal2 = (CVRVariableBuffer) EditorGUILayout.ObjectField("Value 2:", trigger.varBufferVal2, typeof(CVRVariableBuffer), true);
if (trigger.varBufferVal2 != null)
{
trigger.varBufferVal2.AddInteracteable(_interactable);
}
}
}
if (trigger.actionType == CVRInteractableAction.ActionRegister.OnCron)
{
trigger.stringVal = EditorGUILayout.TextField("Cron String", trigger.stringVal);
}
if (trigger.actionType == CVRInteractableAction.ActionRegister.OnWorldTrigger)
{
trigger.floatVal = EditorGUILayout.IntField("Index", (int) trigger.floatVal);
}
if (trigger.actionType == CVRInteractableAction.ActionRegister.OnParticleHit)
{
GUIStyle foldoutStyle = new GUIStyle (EditorStyles.foldout);
foldoutStyle.margin.left = 12;
GUIStyle areaStyle = new GUIStyle ();
areaStyle.margin.left = 20;
trigger.specificParticleSystemsCollapse = EditorGUILayout.Foldout(trigger.specificParticleSystemsCollapse, "Specific Particle Systems", foldoutStyle);
EditorGUILayout.BeginVertical(areaStyle);
if (trigger.specificParticleSystemsCollapse)
{
int pointerCount = Mathf.Max(0, EditorGUILayout.IntField("Size", trigger.specificParticleSystems.Count));
while (pointerCount < trigger.specificParticleSystems.Count)
trigger.specificParticleSystems.RemoveAt(trigger.specificParticleSystems.Count - 1);
while (pointerCount > trigger.specificParticleSystems.Count)
trigger.specificParticleSystems.Add(null);
for (int i = 0; i < trigger.specificParticleSystems.Count; i++)
{
trigger.specificParticleSystems[i] = (ParticleSystem) EditorGUILayout.ObjectField("Element " + i,
trigger.specificParticleSystems[i], typeof(ParticleSystem));
}
}
EditorGUILayout.EndVertical();
}
if (trigger.actionType == CVRInteractableAction.ActionRegister.OnPointerEnter)
{
GUIStyle foldoutStyle = new GUIStyle (EditorStyles.foldout);
foldoutStyle.margin.left = 12;
GUIStyle areaStyle = new GUIStyle ();
areaStyle.margin.left = 20;
trigger.allowedPointerCollapse = EditorGUILayout.Foldout(trigger.allowedPointerCollapse, "Allowed Pointers", foldoutStyle);
EditorGUILayout.BeginVertical(areaStyle);
if (trigger.allowedPointerCollapse)
{
int pointerCount = Mathf.Max(0, EditorGUILayout.IntField("Size", trigger.allowedPointer.Count));
while (pointerCount < trigger.allowedPointer.Count)
trigger.allowedPointer.RemoveAt(trigger.allowedPointer.Count - 1);
while (pointerCount > trigger.allowedPointer.Count)
trigger.allowedPointer.Add(null);
for (int i = 0; i < trigger.allowedPointer.Count; i++)
{
trigger.allowedPointer[i] = (CVRPointer) EditorGUILayout.ObjectField("Element " + i,
trigger.allowedPointer[i], typeof(CVRPointer));
}
}
EditorGUILayout.EndVertical();
trigger.allowedTypesCollapse = EditorGUILayout.Foldout(trigger.allowedTypesCollapse, "Allowed Types", foldoutStyle);
EditorGUILayout.BeginVertical(areaStyle);
if (trigger.allowedTypesCollapse)
{
int pointerCount = Mathf.Max(0, EditorGUILayout.IntField("Size", trigger.allowedTypes.Count));
while (pointerCount < trigger.allowedTypes.Count)
trigger.allowedTypes.RemoveAt(trigger.allowedTypes.Count - 1);
while (pointerCount > trigger.allowedTypes.Count)
trigger.allowedTypes.Add(null);
for (int i = 0; i < trigger.allowedTypes.Count; i++)
{
trigger.allowedTypes[i] = EditorGUILayout.TextField("Element " + i,
trigger.allowedTypes[i]);
}
}
EditorGUILayout.EndVertical();
}
if (trigger.actionType == CVRInteractableAction.ActionRegister.OnInputDown ||
trigger.actionType == CVRInteractableAction.ActionRegister.OnInputUp)
{
trigger.interactionFilter = (CVRInteractableAction.InteractionFilter) EditorGUILayout.EnumPopup("Interaction Filter", trigger.interactionFilter);
trigger.interactionInput = (CVRInteractableAction.InteractionInput) EditorGUILayout.EnumPopup("Interaction Input", trigger.interactionInput);
trigger.interactionInputModifier = (CVRInteractableAction.InteractionInputModifier) EditorGUILayout.EnumFlagsField("Interaction Input Modifier", trigger.interactionInputModifier);
}
if (trigger.actionType == CVRInteractableAction.ActionRegister.OnAPFTrigger ||
trigger.actionType == CVRInteractableAction.ActionRegister.OnAPFBoolChange ||
trigger.actionType == CVRInteractableAction.ActionRegister.OnAPFIntChange ||
trigger.actionType == CVRInteractableAction.ActionRegister.OnAPFFloatChange ||
trigger.actionType == CVRInteractableAction.ActionRegister.OnAPFStringChange)
{
trigger.execType = CVRInteractableAction.ExecutionType.LocalNotNetworked;
trigger.stringVal = EditorGUILayout.TextField("Key", trigger.stringVal);
}
else
{
trigger.delay = EditorGUILayout.FloatField("Delay (Seconds):", trigger.delay);
}
if(trigger.varBufferVal != null) trigger.varBufferVal.AddInteracteable(_interactable);
if(trigger.varBufferVal2 != null) trigger.varBufferVal2.AddInteracteable(_interactable);
EditorGUILayout.LabelField("Actions:", EditorStyles.boldLabel);
for (int j = 0; j < trigger.operations.Count; j++)
{
GUILayout.BeginVertical ("GroupBox");
trigger.operations[j].type = (CVRInteractableActionOperation.ActionType) EditorGUILayout.EnumPopup("Action Type:", trigger.operations[j].type);
switch (trigger.operations[j].type)
{
case CVRInteractableActionOperation.ActionType.SetGameObjectActive:
if (trigger.operations[j].targets.Count == 0)
{
trigger.operations[j].targets.Add(null);
}
if (trigger.operations[j].floatVal > 2)
{
trigger.operations[j].floatVal = 0;
}
RenderTargets(trigger.operations[j].targets);
trigger.operations[j].floatVal = EditorGUILayout.Popup("State:", (int)trigger.operations[j].floatVal, gameObjectStates);
break;
case CVRInteractableActionOperation.ActionType.TeleportPlayer:
trigger.operations[j].gameObjectVal = (GameObject)EditorGUILayout.ObjectField(
"Target Location:",
trigger.operations[j].gameObjectVal,
typeof(GameObject),
true
);
break;
case CVRInteractableActionOperation.ActionType.SetAnimatorBoolValue:
RenderTargets(trigger.operations[j].targets);
trigger.operations[j].stringVal = EditorGUILayout.TextField("Parameter Name:", trigger.operations[j].stringVal);
trigger.operations[j].boolVal = EditorGUILayout.Toggle("Value", trigger.operations[j].boolVal);
break;
case CVRInteractableActionOperation.ActionType.SetAnimatorFloatValue:
RenderTargets(trigger.operations[j].targets);
trigger.operations[j].stringVal = EditorGUILayout.TextField("Parameter Name:", trigger.operations[j].stringVal);
trigger.operations[j].floatVal = EditorGUILayout.FloatField("Value", trigger.operations[j].floatVal);
break;
case CVRInteractableActionOperation.ActionType.SetAnimatorIntValue:
RenderTargets(trigger.operations[j].targets);
trigger.operations[j].stringVal = EditorGUILayout.TextField("Parameter Name:", trigger.operations[j].stringVal);
trigger.operations[j].floatVal = EditorGUILayout.FloatField("Value", trigger.operations[j].floatVal);
break;
case CVRInteractableActionOperation.ActionType.TriggerAnimatorTrigger:
RenderTargets(trigger.operations[j].targets);
trigger.operations[j].stringVal = EditorGUILayout.TextField("Trigger Name:", trigger.operations[j].stringVal);
break;
case CVRInteractableActionOperation.ActionType.SpawnObject:
RenderTargets(trigger.operations[j].targets, "Object");
trigger.operations[j].gameObjectVal = (GameObject)EditorGUILayout.ObjectField(
"Target Location:",
trigger.operations[j].gameObjectVal,
typeof(GameObject),
true
);
trigger.operations[j].boolVal = EditorGUILayout.Toggle("Auto Pickup", trigger.operations[j].boolVal);
trigger.operations[j].boolVal2 = EditorGUILayout.Toggle("Auto Attach", trigger.operations[j].boolVal2);
break;
case CVRInteractableActionOperation.ActionType.TeleportObject:
RenderTargets(trigger.operations[j].targets, "Object");
trigger.operations[j].gameObjectVal = (GameObject)EditorGUILayout.ObjectField(
"Target Location:",
trigger.operations[j].gameObjectVal,
typeof(GameObject),
true
);
break;
case CVRInteractableActionOperation.ActionType.ToggleAnimatorBoolValue:
RenderTargets(trigger.operations[j].targets);
trigger.operations[j].stringVal = EditorGUILayout.TextField("Parameter Name:", trigger.operations[j].stringVal);
break;
case CVRInteractableActionOperation.ActionType.SetAnimatorFloatRandom:
RenderTargets(trigger.operations[j].targets);
trigger.operations[j].stringVal = EditorGUILayout.TextField("Parameter Name:", trigger.operations[j].stringVal);
trigger.operations[j].floatVal = EditorGUILayout.FloatField("Min:", trigger.operations[j].floatVal);
trigger.operations[j].floatVal2 = EditorGUILayout.FloatField("Max:", trigger.operations[j].floatVal2);
break;
case CVRInteractableActionOperation.ActionType.SetAnimatorIntRandom:
RenderTargets(trigger.operations[j].targets);
trigger.operations[j].stringVal = EditorGUILayout.TextField("Parameter Name:", trigger.operations[j].stringVal);
trigger.operations[j].floatVal = EditorGUILayout.FloatField("Min:", trigger.operations[j].floatVal);
trigger.operations[j].floatVal2 = EditorGUILayout.FloatField("Max:", trigger.operations[j].floatVal2);
break;
case CVRInteractableActionOperation.ActionType.SetAnimatorBoolRandom:
RenderTargets(trigger.operations[j].targets);
trigger.operations[j].stringVal = EditorGUILayout.TextField("Parameter Name:", trigger.operations[j].stringVal);
trigger.operations[j].floatVal = EditorGUILayout.FloatField("Chance (0-1):", trigger.operations[j].floatVal);
break;
case CVRInteractableActionOperation.ActionType.VariableBufferArithmetic:
trigger.operations[j].floatVal = EditorGUILayout.Popup("Type:", (int)trigger.operations[j].floatVal, arithmeticConstellations);
trigger.operations[j].varBufferVal = (CVRVariableBuffer) EditorGUILayout.ObjectField(
"Value 1:",
trigger.operations[j].varBufferVal,
typeof(CVRVariableBuffer),
true
);
trigger.operations[j].floatVal2 = EditorGUILayout.Popup("Operator:", (int)trigger.operations[j].floatVal2, arithmeticOperators);
switch ((int) trigger.operations[j].floatVal)
{
case 0:
trigger.operations[j].floatVal3 = EditorGUILayout.FloatField("Value 2:", trigger.operations[j].floatVal3);
break;
case 1:
trigger.operations[j].varBufferVal2 = (CVRVariableBuffer) EditorGUILayout.ObjectField(
"Value 2:",
trigger.operations[j].varBufferVal2,
typeof(CVRVariableBuffer),
true
);
break;
case 2:
trigger.operations[j].floatVal3 = EditorGUILayout.FloatField("Min:", trigger.operations[j].floatVal3);
trigger.operations[j].floatVal4 = EditorGUILayout.FloatField("Max:", trigger.operations[j].floatVal4);
break;
}
trigger.operations[j].varBufferVal3 = (CVRVariableBuffer) EditorGUILayout.ObjectField(
"Result:",
trigger.operations[j].varBufferVal3,
typeof(CVRVariableBuffer),
true
);
break;
case CVRInteractableActionOperation.ActionType.SetAnimatorFloatByVar:
RenderTargets(trigger.operations[j].targets);
trigger.operations[j].stringVal = EditorGUILayout.TextField("Parameter Name:", trigger.operations[j].stringVal);
trigger.operations[j].varBufferVal = (CVRVariableBuffer) EditorGUILayout.ObjectField(
"Value:",
trigger.operations[j].varBufferVal,
typeof(CVRVariableBuffer),
true
);
break;
case CVRInteractableActionOperation.ActionType.SetAnimatorIntByVar:
RenderTargets(trigger.operations[j].targets);
trigger.operations[j].stringVal = EditorGUILayout.TextField("Parameter Name:", trigger.operations[j].stringVal);
trigger.operations[j].varBufferVal = (CVRVariableBuffer) EditorGUILayout.ObjectField(
"Value:",
trigger.operations[j].varBufferVal,
typeof(CVRVariableBuffer),
true
);
break;
case CVRInteractableActionOperation.ActionType.DisplayWorldDetailPage:
trigger.operations[j].stringVal = EditorGUILayout.TextField("World GUID:", trigger.operations[j].stringVal);
break;
case CVRInteractableActionOperation.ActionType.DisplayInstanceDetailPage:
trigger.operations[j].stringVal = EditorGUILayout.TextField("Instance GUID:", trigger.operations[j].stringVal);
break;
case CVRInteractableActionOperation.ActionType.DisplayAvatarDetailPage:
trigger.operations[j].stringVal = EditorGUILayout.TextField("Avatar GUID:", trigger.operations[j].stringVal);
break;
case CVRInteractableActionOperation.ActionType.DisplaySpawnableDetailPage:
trigger.operations[j].stringVal = EditorGUILayout.TextField("Spawnable GUID:", trigger.operations[j].stringVal);
break;
case CVRInteractableActionOperation.ActionType.SitAtPosition:
trigger.operations[j].gameObjectVal = (GameObject)EditorGUILayout.ObjectField(
"Sitting Location:",
trigger.operations[j].gameObjectVal,
typeof(GameObject),
true
);
trigger.operations[j].targets[0] = (GameObject)EditorGUILayout.ObjectField(
"Exit Location:",
trigger.operations[j].targets[0],
typeof(GameObject),
true
);
trigger.operations[j].animationVal = (AnimationClip)EditorGUILayout.ObjectField(
"Overwrite Animation:",
trigger.operations[j].animationVal,
typeof(AnimationClip),
true
);
serializedObject.Update();
EditorGUILayout.PropertyField(serializedObject.FindProperty("onEnterSeat"), true);
serializedObject.ApplyModifiedProperties();
serializedObject.Update();
EditorGUILayout.PropertyField(serializedObject.FindProperty("onExitSeat"), true);
serializedObject.ApplyModifiedProperties();
trigger.operations[j].boolVal = EditorGUILayout.Toggle("Lock Controls", trigger.operations[j].boolVal);
break;
case CVRInteractableActionOperation.ActionType.MethodCall:
var currentOperation = serializedObject.FindProperty("actions")
.GetArrayElementAtIndex(actionIndex).FindPropertyRelative("operations")
.GetArrayElementAtIndex(j).FindPropertyRelative("customEvent");
serializedObject.Update();
EditorGUILayout.PropertyField(currentOperation, true);
serializedObject.ApplyModifiedProperties();
break;
case CVRInteractableActionOperation.ActionType.SetSpawnableValue:
var spawnable = _interactable.GetComponentInParent<CVRSpawnable>();
var spawnableParameters = new List<string>();
spawnableParameters.Add("-none-");
if (spawnable == null || !spawnable.useAdditionalValues)
{
EditorGUILayout.HelpBox("No Spawnable detected or it does not use additional Values.", MessageType.Error);
}
else
{
foreach (var syncValue in spawnable.syncValues)
{
spawnableParameters.Add(syncValue.name);
}
trigger.operations[j].floatVal2 = EditorGUILayout.Popup("Parameter", (int) trigger.operations[j].floatVal2 + 1, spawnableParameters.ToArray()) - 1;
trigger.operations[j].floatVal = EditorGUILayout.FloatField("Value", trigger.operations[j].floatVal);
trigger.operations[j].floatVal3 = EditorGUILayout.Popup("Update Method", (int) trigger.operations[j].floatVal3, spawnableUpdateTypes);
}
break;
case CVRInteractableActionOperation.ActionType.PlayAudio:
case CVRInteractableActionOperation.ActionType.StopAudio:
var go = (GameObject) EditorGUILayout.ObjectField("Audio Source", trigger.operations[j].gameObjectVal, typeof(GameObject), true);
if (go != null && go.GetComponent<AudioSource>() != null)
{
trigger.operations[j].gameObjectVal = go;
}
break;
case CVRInteractableActionOperation.ActionType.SetAnimatorBoolByAPF:
case CVRInteractableActionOperation.ActionType.SetAnimatorIntByAPF:
case CVRInteractableActionOperation.ActionType.SetAnimatorFloatByAPF:
RenderTargets(trigger.operations[j].targets);
trigger.operations[j].stringVal = EditorGUILayout.TextField("Parameter Name:", trigger.operations[j].stringVal);
break;
case CVRInteractableActionOperation.ActionType.SetVariableBufferByAPF:
trigger.operations[j].varBufferVal = (CVRVariableBuffer) EditorGUILayout.ObjectField(
"Buffer:",
trigger.operations[j].varBufferVal,
typeof(CVRVariableBuffer),
true
);
break;
case CVRInteractableActionOperation.ActionType.UpdateAPFTrigger:
trigger.operations[j].stringVal = EditorGUILayout.TextField("Key", trigger.operations[j].stringVal);
break;
case CVRInteractableActionOperation.ActionType.UpdateAPFBool:
trigger.operations[j].stringVal = EditorGUILayout.TextField("Key", trigger.operations[j].stringVal);
trigger.operations[j].floatVal = EditorGUILayout.Popup("Set via", (int) trigger.operations[j].floatVal, apfSetTypes);
if ((int) trigger.operations[j].floatVal == 0)
{
trigger.operations[j].boolVal = EditorGUILayout.Toggle("Value", trigger.operations[j].boolVal);
}
else
{
trigger.operations[j].varBufferVal = (CVRVariableBuffer) EditorGUILayout.ObjectField(
"Value:",
trigger.operations[j].varBufferVal,
typeof(CVRVariableBuffer),
true
);
}
break;
case CVRInteractableActionOperation.ActionType.UpdateAPFInt:
trigger.operations[j].stringVal = EditorGUILayout.TextField("Key", trigger.operations[j].stringVal);
trigger.operations[j].floatVal = EditorGUILayout.Popup("Set via", (int) trigger.operations[j].floatVal, apfSetTypes);
if ((int) trigger.operations[j].floatVal == 0)
{
trigger.operations[j].floatVal2 = EditorGUILayout.IntField("Value", (int) trigger.operations[j].floatVal2);
}
else
{
trigger.operations[j].varBufferVal = (CVRVariableBuffer) EditorGUILayout.ObjectField(
"Value:",
trigger.operations[j].varBufferVal,
typeof(CVRVariableBuffer),
true
);
}
break;
case CVRInteractableActionOperation.ActionType.UpdateAPFFloat:
trigger.operations[j].stringVal = EditorGUILayout.TextField("Key", trigger.operations[j].stringVal);
trigger.operations[j].floatVal = EditorGUILayout.Popup("Set via", (int) trigger.operations[j].floatVal, apfSetTypes);
if ((int) trigger.operations[j].floatVal == 0)
{
trigger.operations[j].floatVal2 = EditorGUILayout.FloatField("Value", trigger.operations[j].floatVal2);
}
else
{
trigger.operations[j].varBufferVal = (CVRVariableBuffer) EditorGUILayout.ObjectField(
"Value:",
trigger.operations[j].varBufferVal,
typeof(CVRVariableBuffer),
true
);
}
break;
case CVRInteractableActionOperation.ActionType.UpdateAPFString:
trigger.operations[j].stringVal = EditorGUILayout.TextField("Key", trigger.operations[j].stringVal);
trigger.operations[j].floatVal = EditorGUILayout.Popup("Set via", (int) trigger.operations[j].floatVal, apfSetTypesString);
if ((int) trigger.operations[j].floatVal == 0)
{
trigger.operations[j].stringVal2 = EditorGUILayout.TextField("Value", trigger.operations[j].stringVal2);
}
else
{
trigger.operations[j].gameObjectVal = (GameObject) EditorGUILayout.ObjectField(
"Target:",
trigger.operations[j].gameObjectVal,
typeof(GameObject),
true
);
//Get component Type
if (trigger.operations[j].gameObjectVal == null)
{
EditorGUILayout.HelpBox("Select a Target to proceed.", MessageType.Info);
break;
}
var rawComponents = trigger.operations[j].gameObjectVal.GetComponents<Component>();
List<Type> componentListTypes = new List<Type>();
List<string> componentListNames = new List<string>();
List<string> componentListAssemblyNames = new List<string>();
int selectedIndex = 0;
foreach (var rawComponent in rawComponents)
{
if (rawComponent != null && !componentListTypes.Contains(rawComponent.GetType()) && rawComponent.GetType() != typeof(Transform) && rawComponent.GetType() != typeof(CVRInteractable))
{
componentListTypes.Add(rawComponent.GetType());
componentListNames.Add(rawComponent.GetType().Name);
componentListAssemblyNames.Add(rawComponent.GetType().AssemblyQualifiedName);
}
}
selectedIndex = componentListAssemblyNames.FindIndex(match => match == trigger.operations[j].stringVal3);
selectedIndex = EditorGUILayout.Popup("Component", selectedIndex, componentListNames.ToArray());
if (selectedIndex >= 0 && selectedIndex < componentListTypes.Count)
{
trigger.operations[j].stringVal3 = componentListTypes[selectedIndex].AssemblyQualifiedName;
}
else
{
trigger.operations[j].stringVal3 = "";
}
//Get Component Property
if (trigger.operations[j].stringVal3 == "")
{
EditorGUILayout.HelpBox("Select a Component to proceed.", MessageType.Info);
break;
}
BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Default;
FieldInfo[] finfos = componentListTypes[selectedIndex].GetFields(flags);
PropertyInfo[] pinfos = componentListTypes[selectedIndex].GetProperties(flags);
List<string> fieldListNames = new List<string>();
List<bool> isProperty = new List<bool>();
selectedIndex = 0;
foreach (var finfo in finfos)
{
if (finfo.IsPublic)
{
if (finfo.FieldType == typeof(string))
{
fieldListNames.Add(finfo.Name);
isProperty.Add(false);
}
}
}
foreach (var pinfo in pinfos)
{
if (pinfo.CanWrite)
{
if (pinfo.PropertyType == typeof(string))
{
fieldListNames.Add(pinfo.Name);
isProperty.Add(true);
}
}
}
selectedIndex = fieldListNames.FindIndex(match => match == trigger.operations[j].stringVal4);
selectedIndex = EditorGUILayout.Popup("Property", selectedIndex, fieldListNames.ToArray());
if (selectedIndex >= 0 && selectedIndex < fieldListNames.Count)
{
trigger.operations[j].stringVal4 = fieldListNames[selectedIndex];
trigger.operations[j].boolVal = isProperty[selectedIndex];
}
else
{
trigger.operations[j].stringVal4 = "";
}
}
break;
case CVRInteractableActionOperation.ActionType.SetPropertyByApf:
trigger.operations[j].gameObjectVal = (GameObject) EditorGUILayout.ObjectField(
"Target:",
trigger.operations[j].gameObjectVal,
typeof(GameObject),
true
);
//Get component Type
if (trigger.operations[j].gameObjectVal == null)
{
EditorGUILayout.HelpBox("Select a Target to proceed.", MessageType.Info);
break;
}
var rawComponents2 = trigger.operations[j].gameObjectVal.GetComponents<Component>();
List<Type> componentListTypes2 = new List<Type>();
List<string> componentListNames2 = new List<string>();
List<string> componentListAssemblyNames2 = new List<string>();
int selectedIndex2 = 0;
foreach (var rawComponent in rawComponents2)
{
if (rawComponent != null && !componentListTypes2.Contains(rawComponent.GetType()) && rawComponent.GetType() != typeof(Transform) && rawComponent.GetType() != typeof(CVRInteractable))
{
componentListTypes2.Add(rawComponent.GetType());
componentListNames2.Add(rawComponent.GetType().Name);
componentListAssemblyNames2.Add(rawComponent.GetType().AssemblyQualifiedName);
}
}
selectedIndex2 = componentListAssemblyNames2.FindIndex(match => match == trigger.operations[j].stringVal3);
selectedIndex2 = EditorGUILayout.Popup("Component", selectedIndex2, componentListNames2.ToArray());
if (selectedIndex2 >= 0 && selectedIndex2 < componentListTypes2.Count)
{
trigger.operations[j].stringVal3 = componentListTypes2[selectedIndex2].AssemblyQualifiedName;
}
else
{
trigger.operations[j].stringVal3 = "";
}
//Get Component Property
if (trigger.operations[j].stringVal3 == "")
{
EditorGUILayout.HelpBox("Select a Component to proceed.", MessageType.Info);
break;
}
BindingFlags flags2 = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Default;
FieldInfo[] finfos2 = componentListTypes2[selectedIndex2].GetFields(flags2);
PropertyInfo[] pinfos2 = componentListTypes2[selectedIndex2].GetProperties(flags2);
List<string> fieldListNames2 = new List<string>();
List<bool> isProperty2 = new List<bool>();
selectedIndex2 = 0;
foreach (var finfo in finfos2)
{
if (finfo.IsPublic)
{
switch (trigger.actionType)
{
case CVRInteractableAction.ActionRegister.OnAPFBoolChange:
if (finfo.FieldType == typeof(bool))
{
fieldListNames2.Add(finfo.Name);
isProperty2.Add(false);
}
break;
case CVRInteractableAction.ActionRegister.OnAPFFloatChange:
if (finfo.FieldType == typeof(float))
{
fieldListNames2.Add(finfo.Name);
isProperty2.Add(false);
}
break;
case CVRInteractableAction.ActionRegister.OnAPFIntChange:
if (finfo.FieldType == typeof(int))
{
fieldListNames2.Add(finfo.Name);
isProperty2.Add(false);
}
break;
default:
if (finfo.FieldType == typeof(string))
{
fieldListNames2.Add(finfo.Name);
isProperty2.Add(false);
}
break;
}
}
}
foreach (var pinfo in pinfos2)
{
if (pinfo.CanWrite)
{
switch (trigger.actionType)
{
case CVRInteractableAction.ActionRegister.OnAPFBoolChange:
if (pinfo.PropertyType == typeof(bool))
{
fieldListNames2.Add(pinfo.Name);
isProperty2.Add(true);
}
break;
case CVRInteractableAction.ActionRegister.OnAPFFloatChange:
if (pinfo.PropertyType == typeof(float))
{
fieldListNames2.Add(pinfo.Name);
isProperty2.Add(true);
}
break;
case CVRInteractableAction.ActionRegister.OnAPFIntChange:
if (pinfo.PropertyType == typeof(int))
{
fieldListNames2.Add(pinfo.Name);
isProperty2.Add(true);
}
break;
default:
if (pinfo.PropertyType == typeof(string))
{
fieldListNames2.Add(pinfo.Name);
isProperty2.Add(true);
}
break;
}
}
}
selectedIndex2 = fieldListNames2.FindIndex(match => match == trigger.operations[j].stringVal4);
selectedIndex2 = EditorGUILayout.Popup("Property", selectedIndex2, fieldListNames2.ToArray());
if (selectedIndex2 >= 0 && selectedIndex2 < fieldListNames2.Count)
{
trigger.operations[j].stringVal4 = fieldListNames2[selectedIndex2];
trigger.operations[j].boolVal = isProperty2[selectedIndex2];
}
else
{
trigger.operations[j].stringVal4 = "";
}
break;
case CVRInteractableActionOperation.ActionType.SetPropertyByValue:
trigger.operations[j].varBufferVal = (CVRVariableBuffer) EditorGUILayout.ObjectField("Variable Buffer", trigger.operations[j].varBufferVal, typeof(CVRVariableBuffer));
trigger.operations[j].gameObjectVal = (GameObject) EditorGUILayout.ObjectField(
"Target:",
trigger.operations[j].gameObjectVal,
typeof(GameObject),
true
);
//Get component Type
if (trigger.operations[j].gameObjectVal == null)
{
EditorGUILayout.HelpBox("Select a Target to proceed.", MessageType.Info);
break;
}
var rawComponents3 = trigger.operations[j].gameObjectVal.GetComponents<Component>();
List<Type> componentListTypes3 = new List<Type>();
List<string> componentListNames3 = new List<string>();
List<string> componentListAssemblyNames3 = new List<string>();
int selectedIndex3 = 0;
foreach (var rawComponent in rawComponents3)
{
if (rawComponent != null && !componentListTypes3.Contains(rawComponent.GetType()) && rawComponent.GetType() != typeof(Transform) && rawComponent.GetType() != typeof(CVRInteractable))
{
componentListTypes3.Add(rawComponent.GetType());
componentListNames3.Add(rawComponent.GetType().Name);
componentListAssemblyNames3.Add(rawComponent.GetType().AssemblyQualifiedName);
}
}
selectedIndex3 = componentListAssemblyNames3.FindIndex(match => match == trigger.operations[j].stringVal3);
selectedIndex3 = EditorGUILayout.Popup("Component", selectedIndex3, componentListNames3.ToArray());
if (selectedIndex3 >= 0 && selectedIndex3 < componentListTypes3.Count)
{
trigger.operations[j].stringVal3 = componentListTypes3[selectedIndex3].AssemblyQualifiedName;
}
else
{
trigger.operations[j].stringVal3 = "";
}
//Get Component Property
if (trigger.operations[j].stringVal3 == "")
{
EditorGUILayout.HelpBox("Select a Component to proceed.", MessageType.Info);
break;
}
BindingFlags flags3 = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Default;
FieldInfo[] finfos3 = componentListTypes3[selectedIndex3].GetFields(flags3);
PropertyInfo[] pinfos3 = componentListTypes3[selectedIndex3].GetProperties(flags3);
List<string> fieldListNames3 = new List<string>();
List<bool> isProperty3 = new List<bool>();
selectedIndex3 = 0;
foreach (var finfo in finfos3)
{
if (finfo.IsPublic)
{
if (finfo.FieldType == typeof(float))
{
fieldListNames3.Add(finfo.Name);
isProperty3.Add(false);
}
}
}
foreach (var pinfo in pinfos3)
{
if (pinfo.CanWrite)
{
if (pinfo.PropertyType == typeof(float))
{
fieldListNames3.Add(pinfo.Name);
isProperty3.Add(true);
}
}
}
selectedIndex3 = fieldListNames3.FindIndex(match => match == trigger.operations[j].stringVal4);
selectedIndex3 = EditorGUILayout.Popup("Property", selectedIndex3, fieldListNames3.ToArray());
if (selectedIndex3 >= 0 && selectedIndex3 < fieldListNames3.Count)
{
trigger.operations[j].stringVal4 = fieldListNames3[selectedIndex3];
trigger.operations[j].boolVal = isProperty3[selectedIndex3];
}
else
{
trigger.operations[j].stringVal4 = "";
}
break;
case CVRInteractableActionOperation.ActionType.DeleteGameObject:
trigger.operations[j].gameObjectVal = (GameObject) EditorGUILayout.ObjectField("Target",
trigger.operations[j].gameObjectVal, typeof(GameObject));
break;
}
if(trigger.operations[j].varBufferVal != null) trigger.operations[j].varBufferVal.AddInteracteable(_interactable);
if(trigger.operations[j].varBufferVal2 != null) trigger.operations[j].varBufferVal2.AddInteracteable(_interactable);
if(trigger.operations[j].varBufferVal3 != null) trigger.operations[j].varBufferVal3.AddInteracteable(_interactable);
GUILayout.EndVertical ();
}
if (GUILayout.Button("Remove Action"))
{
trigger.operations.RemoveAt(trigger.operations.Count - 1);
}
if (GUILayout.Button("Add Action"))
{
trigger.operations.Add(new CVRInteractableActionOperation());
}
GUILayout.EndVertical ();
GUILayout.EndHorizontal ();
GUILayout.EndVertical ();
actionIndex++;
}
if (GUILayout.Button("Remove Trigger"))
{
_interactable.actions.RemoveAt(_interactable.actions.Count - 1);
}
if (GUILayout.Button("Add Trigger"))
{
_interactable.actions.Add(new CVRInteractableAction());
}
if (GUI.changed)
{
EditorUtility.SetDirty (target);
}
}
private void RenderTargets(List<GameObject> targets)
{
RenderTargets(targets, "Target");
}
private void RenderTargets(List<GameObject> targets, String caption)
{
if (targets != null)
{
for (int k = 0; k < targets.Count; k++)
{
targets[k] = (GameObject) EditorGUILayout.ObjectField(
caption + ":",
targets[k],
typeof(GameObject),
true
);
}
}
if (GUILayout.Button("Remove " + caption))
{
targets.RemoveAt(targets.Count - 1);
}
if (GUILayout.Button("Add " + caption))
{
targets.Add(null);
}
}
}
}