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); } } }
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(); } }