public static Dictionary <string, List <MethodInfo> > GetSharedPublicMethodsOnGameObjects(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.GetPublicMethodsOnGameObject(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.GetPublicMethodsOnGameObject(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); }
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); } }