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);
        }
예제 #3
0
        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);
            }
        }
예제 #6
0
 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;
 }