Exemplo n.º 1
0
        protected void DrawButtons()
        {
            for (int i = 0; i < _buttonMethods.Count; i++)
            {
                if (GUILayout.Button(_buttonMethods[i].Name))
                {
                    object[] parameters = null;

                    if (_buttonMethods[i].GetParameters().Length > 0)
                    {
                        var param = _container.GetParameters(_objectID, _sceneGuid, _buttonMethods[i].Name, _buttonMethods[i].GetParameters().Length);

                        if (param != null)
                        {
                            parameters = new object[param.Parameters.Length];

                            for (int t = 0; t < parameters.Length; t++)
                            {
                                Type parameterType = Type.GetType(param.Parameters[t].Type);

                                if (parameterType.IsSubclassOf(typeof(EditorField)))
                                {
                                    var editorField = JsonUtility.FromJson(param.Parameters[t].JsonData, parameterType);
                                    var fieldValue  = editorField.GetType().BaseType.GetField("_fieldValue", BindingFlags.Instance | BindingFlags.NonPublic);
                                    parameters[t] = fieldValue.GetValue(editorField);
                                }
                                else if (parameterType == typeof(UnityEngine.Object) || parameterType.IsSubclassOf(typeof(UnityEngine.Object)))
                                {
                                    StringCollectionField stringCollectionField = JsonUtility.FromJson <StringCollectionField>(param.Parameters[t].JsonData);

                                    string sceneGuid = stringCollectionField.FieldValue[0];
                                    int    objectID  = int.Parse(stringCollectionField.FieldValue[1]);

                                    parameters[t] = UnityEditorObjectExtensions.GetObjectByInstanceID(objectID, sceneGuid);
                                }
                                else if (parameterType.GetElementType() != null && (parameterType.GetElementType() == typeof(UnityEngine.Object) ||
                                                                                    parameterType.GetElementType().IsSubclassOf(typeof(UnityEngine.Object))))
                                {
                                    StringCollectionField stringCollectionField = JsonUtility.FromJson <StringCollectionField>(param.Parameters[t].JsonData);

                                    List <int>    objectIDs  = new List <int>();
                                    List <string> sceneGuids = new List <string>();
                                    IList         objects    = (IList)Activator.CreateInstance(typeof(List <>).MakeGenericType(parameterType.GetElementType()));

                                    for (int c = 0; c < stringCollectionField.FieldValue.Length; c++)
                                    {
                                        if (c % 2 == 0)
                                        {
                                            sceneGuids.Add(stringCollectionField.FieldValue[c]);
                                        }
                                        else
                                        {
                                            objectIDs.Add(int.Parse(stringCollectionField.FieldValue[c]));
                                        }
                                    }

                                    for (int o = 0; o < sceneGuids.Count; o++)
                                    {
                                        objects.Add(UnityEditorObjectExtensions.GetObjectByInstanceID(objectIDs[o], sceneGuids[o]));
                                    }

                                    var castMethod = typeof(Enumerable).GetMethod("Cast", BindingFlags.Public | BindingFlags.Static).
                                                     MakeGenericMethod(parameterType.GetElementType());

                                    var toArrayMethod = typeof(Enumerable).GetMethod("ToArray", BindingFlags.Public | BindingFlags.Static).
                                                        MakeGenericMethod(parameterType.GetElementType());

                                    parameters[t] = toArrayMethod.Invoke(null, new object[] { castMethod.Invoke(null, new object[] { objects }) });
                                }
                                else
                                {
                                    parameters[t] = JsonUtility.FromJson(param.Parameters[t].JsonData, parameterType);
                                }
                            }
                        }
                        else
                        {
                            MakeParametersWindow.ShowWindow(_container, _objectID, _sceneGuid, _buttonMethods[i].Name, _buttonMethods[i].GetParameters(), target);
                            return;
                        }
                    }

                    _buttonMethods[i].Invoke(target, parameters);
                }
            }
        }
Exemplo n.º 2
0
        private void OnGUI()
        {
            for (int i = 0; i < _parameterInfos.Length; i++)
            {
                if (_parameterInfos[i].ParameterType.IsSubclassOf(typeof(UnityEngine.Object)))
                {
                    if (_fieldValues[i] == null)
                    {
                        _fieldValues[i] = typeof(StringCollectionField).BaseType.GetField("_fieldValue", BindingFlags.Instance | BindingFlags.NonPublic);
                    }

                    _parameterValues[i] = EditorGUILayout.ObjectField(new GUIContent(_parameterInfos[i].Name), (UnityEngine.Object)_parameterValues[i],
                                                                      _parameterInfos[i].ParameterType, !_target.IsAsset());
                }
                else if (_parameterInfos[i].ParameterType.GetElementType() != null && _parameterInfos[i].ParameterType.GetElementType().IsSubclassOf(typeof(UnityEngine.Object)))
                {
                    if (_fieldValues[i] == null)
                    {
                        _fieldValues[i]     = typeof(StringCollectionField).BaseType.GetField("_fieldValue", BindingFlags.Instance | BindingFlags.NonPublic);
                        _parameterValues[i] = new UnityEngine.Object[0];
                    }

                    var objArray = (UnityEngine.Object[])_parameterValues[i];

                    int size = EditorGUILayout.IntField($"{_parameterInfos[i].Name}Size", objArray.Length);

                    if (size != objArray.Length)
                    {
                        Array.Resize(ref objArray, size);
                        _parameterValues[i] = objArray;
                    }

                    EditorGUI.indentLevel += 1;

                    for (int t = 0; t < objArray.Length; t++)
                    {
                        objArray[t] = EditorGUILayout.ObjectField(new GUIContent($"Element {t}"), objArray[t], _parameterInfos[i].ParameterType.GetElementType(),
                                                                  !_target.IsAsset());
                    }

                    EditorGUI.indentLevel -= 1;
                }
                else if (_parameterInfos[i].ParameterType == typeof(int))
                {
                    if (_parameterValues[i] == null)
                    {
                        _parameterValues[i] = new IntField();
                        _fieldValues[i]     = typeof(IntField).BaseType.GetField("_fieldValue", BindingFlags.Instance | BindingFlags.NonPublic);
                    }

                    _fieldValues[i].SetValue(_parameterValues[i], EditorGUILayout.IntField(_parameterInfos[i].Name, (int)_fieldValues[i].GetValue(_parameterValues[i])));
                }
            }

            if (GUILayout.Button("Create"))
            {
                MethodParameter[] parameters = new MethodParameter[_parameterValues.Length];

                for (int i = 0; i < _parameterValues.Length; i++)
                {
                    if (_parameterValues[i].GetType() == typeof(UnityEngine.Object) || _parameterValues[i].GetType().IsSubclassOf(typeof(UnityEngine.Object)))
                    {
                        (_parameterValues[i] as UnityEngine.Object).GetSceneGuidAndObjectID(out string sceneGuid, out int objectID);
                        _parameterValues[i] = new StringCollectionField();

                        string[] fieldValue = new string[] { sceneGuid, objectID.ToString() };

                        _fieldValues[i].SetValue(_parameterValues[i], fieldValue);

                        parameters[i] = new MethodParameter($"{_parameterInfos[i].ParameterType.AssemblyQualifiedName}",
                                                            JsonUtility.ToJson(_parameterValues[i]));
                    }
                    else if (_parameterValues[i].GetType().GetElementType() != null && (_parameterValues[i].GetType().GetElementType() == typeof(UnityEngine.Object) ||
                                                                                        _parameterValues[i].GetType().GetElementType().IsSubclassOf(typeof(UnityEngine.Object))))
                    {
                        var      objArray   = (UnityEngine.Object[])_parameterValues[i];
                        string[] sceneGuids = new string[objArray.Length];
                        int[]    objectIDs  = new int[objArray.Length];

                        for (int t = 0; t < objArray.Length; t++)
                        {
                            objArray[t].GetSceneGuidAndObjectID(out sceneGuids[t], out objectIDs[t]);
                        }

                        _parameterValues[i] = new StringCollectionField();
                        string[] fieldValue = new string[objArray.Length * 2];

                        for (int t = 0; t < sceneGuids.Length; t++)
                        {
                            fieldValue[t * 2]     = sceneGuids[t];
                            fieldValue[t * 2 + 1] = objectIDs[t].ToString();
                        }

                        _fieldValues[i].SetValue(_parameterValues[i], fieldValue);

                        parameters[i] = new MethodParameter($"{_parameterInfos[i].ParameterType.AssemblyQualifiedName}",
                                                            JsonUtility.ToJson(_parameterValues[i]));
                    }
                    else
                    {
                        parameters[i] = new MethodParameter($"{_parameterValues[i].GetType().AssemblyQualifiedName}",
                                                            JsonUtility.ToJson(_parameterValues[i]));
                    }
                }

                _container.AddMethodParameters(new MethodParameters(_objectID, _sceneGuid, _methodName, parameters));

                Close();
            }
        }