public static bool RenderEventHeader(VRCSDK2.VRC_EventHandler myTarget, VRCSDK2.VRC_EventHandler.VrcEvent evt) { EditorGUILayout.BeginHorizontal(); evt.EventType = VRC_EditorTools.FilteredEnumPopup("New Event Type", evt.EventType, (v) => v != VRC_EventHandler.VrcEventType.SpawnObject && v != VRC_EventHandler.VrcEventType.SendMessage); bool delete = GUILayout.Button("Remove"); EditorGUILayout.EndHorizontal(); return(delete); }
public static VRCSDK2.VRC_EventHandler.VrcEvent RenderAddEvent(VRCSDK2.VRC_EventHandler myTarget) { VRCSDK2.VRC_EventHandler.VrcEvent newEvent = null; EditorGUILayout.BeginHorizontal(); lastAddedEventType = VRC_EditorTools.FilteredEnumPopup("New Event Type", lastAddedEventType, (v) => v != VRC_EventHandler.VrcEventType.SpawnObject && v != VRC_EventHandler.VrcEventType.SendMessage); if (GUILayout.Button("Add")) { newEvent = new VRCSDK2.VRC_EventHandler.VrcEvent { EventType = lastAddedEventType, ParameterObject = myTarget.gameObject }; myTarget.Events.Add(newEvent); EditorUtility.SetDirty(myTarget); } EditorGUILayout.EndHorizontal(); return(newEvent); }
public static Dictionary <string, List <MethodInfo> > GetSharedAccessibleMethodsOnGameObjects(SerializedProperty objectsProperty) { Dictionary <string, List <MethodInfo> > methods = new Dictionary <string, List <MethodInfo> >(); int idx = 0; for (; idx < objectsProperty.arraySize; ++idx) { SerializedProperty prop = objectsProperty.GetArrayElementAtIndex(idx); GameObject obj = prop.objectReferenceValue != null ? prop.objectReferenceValue as GameObject : null; if (obj != null) { methods = VRC_EditorTools.GetAccessibleMethodsOnGameObject(obj); break; } } List <string> toRemove = new List <string>(); for (; idx < objectsProperty.arraySize; ++idx) { SerializedProperty prop = objectsProperty.GetArrayElementAtIndex(idx); GameObject obj = prop.objectReferenceValue != null ? prop.objectReferenceValue as GameObject : null; if (obj != null) { Dictionary <string, List <MethodInfo> > thisObjMethods = VRC_EditorTools.GetAccessibleMethodsOnGameObject(obj); foreach (string className in methods.Keys.Where(s => thisObjMethods.Keys.Contains(s) == false)) { toRemove.Add(className); } } } foreach (string className in toRemove) { methods.Remove(className); } return(methods); }
public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label) { if (property == null) { return; } SerializedProperty nameProperty = property.FindPropertyRelative("name"); SerializedProperty mirrorProperty = property.FindPropertyRelative("mirror"); SerializedProperty typeProperty = property.FindPropertyRelative("type"); SerializedProperty valueProperty = null; switch (typeProperty.enumValueIndex) { case (int)VRC_DataStorage.VrcDataType.Bool: valueProperty = property.FindPropertyRelative("valueBool"); break; case (int)VRC_DataStorage.VrcDataType.Float: valueProperty = property.FindPropertyRelative("valueFloat"); break; case (int)VRC_DataStorage.VrcDataType.Int: valueProperty = property.FindPropertyRelative("valueInt"); break; case (int)VRC_DataStorage.VrcDataType.String: valueProperty = property.FindPropertyRelative("valueString"); break; case (int)VRC_DataStorage.VrcDataType.SerializeObject: valueProperty = property.FindPropertyRelative("serializeComponent"); break; case (int)VRC_DataStorage.VrcDataType.None: case (int)VRC_DataStorage.VrcDataType.SerializeBytes: break; } EditorGUI.BeginProperty(rect, label, property); int baseWidth = (int)(rect.width / 4); Rect nameRect = new Rect(rect.x, rect.y, baseWidth, rect.height); Rect mirrorRect = new Rect(rect.x + baseWidth, rect.y, baseWidth, rect.height); Rect typeRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth, rect.height); Rect valueRect = new Rect(rect.x + baseWidth * 3, rect.y, baseWidth, rect.height); Rect typeValueRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth * 2, rect.height); EditorGUI.PropertyField(nameRect, nameProperty, GUIContent.none); EditorGUI.PropertyField(mirrorRect, mirrorProperty, GUIContent.none); switch (mirrorProperty.enumValueIndex) { case (int)VRC_DataStorage.VrcDataMirror.None: if (valueProperty == null) { VRC_EditorTools.FilteredEnumPopup <VRC_DataStorage.VrcDataType>(typeValueRect, typeProperty, t => true); } else { VRC_EditorTools.FilteredEnumPopup <VRC_DataStorage.VrcDataType>(typeRect, typeProperty, t => true); EditorGUI.PropertyField(valueRect, valueProperty, GUIContent.none); } break; case (int)VRC_DataStorage.VrcDataMirror.SerializeComponent: typeProperty.enumValueIndex = (int)VRC_DataStorage.VrcDataType.SerializeObject; EditorGUI.PropertyField(typeValueRect, valueProperty, GUIContent.none); break; default: VRC_EditorTools.FilteredEnumPopup <VRC_DataStorage.VrcDataType>(typeValueRect, typeProperty, t => true); break; } EditorGUI.EndProperty(); }
private void RenderOldEditor(VRCSDK2.VRC_EventHandler myTarget) { EditorGUILayout.HelpBox("Please use a VRC_Trigger in the future.", MessageType.Error); if (GUILayout.Button("Add Event Handler")) { myTarget.Events.Add(new VRCSDK2.VRC_EventHandler.VrcEvent()); } bool first = true; int deleteEventIndex = -1; if (sendMessageMethodIndicies == null || sendMessageMethodIndicies.Length != myTarget.Events.Count) { sendMessageMethodIndicies = new int[myTarget.Events.Count + 1]; } for (int i = 0; i < myTarget.Events.Count; ++i) { if (!first) { EditorGUILayout.Separator(); } first = false; EditorGUILayout.LabelField("Event " + (i + 1).ToString()); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Event Name"); myTarget.Events[i].Name = EditorGUILayout.TextField(myTarget.Events[i].Name); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Event Type"); myTarget.Events[i].EventType = (VRCSDK2.VRC_EventHandler.VrcEventType)EditorGUILayout.EnumPopup(myTarget.Events[i].EventType); EditorGUILayout.EndHorizontal(); switch (myTarget.Events[i].EventType) { case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationBool: EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Variable"); myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Operation"); myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp); EditorGUILayout.EndHorizontal(); break; case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationFloat: EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Variable"); myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Value"); myTarget.Events[i].ParameterFloat = EditorGUILayout.FloatField(myTarget.Events[i].ParameterFloat); EditorGUILayout.EndHorizontal(); break; case VRCSDK2.VRC_EventHandler.VrcEventType.AnimationTrigger: EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Trigger"); myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); EditorGUILayout.EndHorizontal(); break; case VRCSDK2.VRC_EventHandler.VrcEventType.AudioTrigger: EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("AudioSource"); myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); EditorGUILayout.EndHorizontal(); break; case VRCSDK2.VRC_EventHandler.VrcEventType.MeshVisibility: EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Mesh"); myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Operation"); myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp); EditorGUILayout.EndHorizontal(); break; case VRCSDK2.VRC_EventHandler.VrcEventType.PlayAnimation: EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Target"); myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Animation"); myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); EditorGUILayout.EndHorizontal(); break; case VRCSDK2.VRC_EventHandler.VrcEventType.RunConsoleCommand: EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Command"); myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); EditorGUILayout.EndHorizontal(); break; case VRCSDK2.VRC_EventHandler.VrcEventType.SendMessage: EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Receiver"); myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Message"); // sorry for this shit show. Below allows us to show a list of public methods, but also allow custom messages var methods = VRC_EditorTools.GetPublicMethodsOnGameObject(myTarget.Events[i].ParameterObject); List <string> methodList = methods.Values.Aggregate(new List <string>(), (acc, lst) => { acc.AddRange(lst.Select(mi => mi.Name)); return(acc); }); methodList.Add("Custom Message"); string[] _choices = methodList.ToArray(); int currentIndex = methodList.Count - 1; if (methodList.Contains(myTarget.Events[i].ParameterString)) { currentIndex = methodList.IndexOf(myTarget.Events[i].ParameterString); } sendMessageMethodIndicies[i] = EditorGUILayout.Popup(currentIndex, _choices); if (sendMessageMethodIndicies[i] != methodList.Count - 1) { myTarget.Events[i].ParameterString = _choices[sendMessageMethodIndicies[i]]; } else { if (methodList.Contains(myTarget.Events[i].ParameterString)) { myTarget.Events[i].ParameterString = ""; } myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); } EditorGUILayout.EndHorizontal(); break; case VRCSDK2.VRC_EventHandler.VrcEventType.SetGameObjectActive: EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("GameObject"); myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Operation"); myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp); EditorGUILayout.EndHorizontal(); break; case VRCSDK2.VRC_EventHandler.VrcEventType.SetParticlePlaying: EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Target"); myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Operation"); myTarget.Events[i].ParameterBoolOp = (VRCSDK2.VRC_EventHandler.VrcBooleanOp)EditorGUILayout.EnumPopup(myTarget.Events[i].ParameterBoolOp); EditorGUILayout.EndHorizontal(); break; case VRCSDK2.VRC_EventHandler.VrcEventType.TeleportPlayer: EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Location"); myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); EditorGUILayout.EndHorizontal(); break; case VRCSDK2.VRC_EventHandler.VrcEventType.SetWebPanelURI: EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("URI"); myTarget.Events[i].ParameterString = EditorGUILayout.TextField(myTarget.Events[i].ParameterString); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Panel"); myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); EditorGUILayout.EndHorizontal(); break; case VRCSDK2.VRC_EventHandler.VrcEventType.SetWebPanelVolume: EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Volume"); myTarget.Events[i].ParameterFloat = EditorGUILayout.FloatField(myTarget.Events[i].ParameterFloat); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Panel"); myTarget.Events[i].ParameterObject = (GameObject)EditorGUILayout.ObjectField(myTarget.Events[i].ParameterObject, typeof(GameObject), true); EditorGUILayout.EndHorizontal(); break; default: EditorGUILayout.BeginHorizontal(); GUIStyle redText = new GUIStyle(); redText.normal.textColor = Color.red; EditorGUILayout.LabelField("Unsupported event type", redText); EditorGUILayout.EndHorizontal(); break; } EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Delete " + myTarget.Events[i].Name + "?"); if (GUILayout.Button("delete")) { deleteEventIndex = i; } EditorGUILayout.EndHorizontal(); if (myTarget.Events[i].ParameterObject == null) { myTarget.Events[i].ParameterObject = myTarget.gameObject; } } if (deleteEventIndex != -1) { myTarget.Events.RemoveAt(deleteEventIndex); } }
public static void DrawTriggerActionCallback(string actionLabel, VRC.SDKBase.VRC_Trigger trigger, VRC.SDKBase.VRC_EventHandler.VrcEvent e) { VRC.SDKBase.VRC_Trigger.TriggerEvent triggerEvent = VRC_EditorTools.CustomTriggerPopup(actionLabel, trigger, e.ParameterString); e.ParameterString = triggerEvent == null ? null : triggerEvent.Name; }