private void SetupDynamicArgument(EventTriggerBehaviour behaviour, int index, Type argumentType) { behaviour.argsGameObjectTarget = EditorGUILayout.ObjectField("Game Object", behaviour.argsGameObjectTarget, typeof(GameObject), true) as GameObject; if (behaviour.argsGameObjectTarget == null) { return; } List <string> propertiesNames = new List <string>(); List <string> componentNames = new List <string>(); List <Component> componentsList = new List <Component>(); foreach (Component loopComponent in behaviour.argsGameObjectTarget.GetComponents(typeof(Component))) { componentsList.Add(loopComponent); componentNames.Add(loopComponent.GetType().ToString()); } behaviour.argsComponentIndexes[index] = EditorGUILayout.Popup("Component", behaviour.argsComponentIndexes[index], componentNames.ToArray()); if (behaviour.argsComponentIndexes[index] != -1 && componentsList.Count > behaviour.argsComponentIndexes[index]) { behaviour.argsComponents[index] = componentsList.ElementAt(behaviour.argsComponentIndexes[index]); foreach (PropertyInfo propertyInfo in behaviour.argsComponents[index].GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)) { if (propertyInfo.PropertyType == argumentType) { propertiesNames.Add(propertyInfo.Name); } } behaviour.argsTargetsPropertiesIndexes[index] = EditorGUILayout.Popup("Property", behaviour.argsTargetsPropertiesIndexes[index], propertiesNames.ToArray()); if (behaviour.argsTargetsPropertiesIndexes[index] != -1 && propertiesNames.Count > behaviour.argsTargetsPropertiesIndexes[index]) { behaviour.argsTargetsProperties[index] = propertiesNames.ElementAt(behaviour.argsTargetsPropertiesIndexes[index]); } } }
private void CreateArgumentsLists(EventTriggerBehaviour behaviour) { if (behaviour.targetDelegate == null) { return; } int length = behaviour.targetDelegate.Method.GetParameters().Length; if (behaviour.argumentTypes == null) { behaviour.argumentTypes = new EventTriggerArgumentType[length]; } if (behaviour.argumentTypes.Length != length) { behaviour.argumentTypes = new EventTriggerArgumentType[length]; } if (behaviour.argsChoiceIndexList == null) { behaviour.argsChoiceIndexList = new int[length]; } if (behaviour.argsChoiceIndexList.Length != length) { behaviour.argsChoiceIndexList = new int[length]; } if (behaviour.argsComponents == null) { behaviour.argsComponents = new Component[length]; } if (behaviour.argsComponents.Length != length) { behaviour.argsComponents = new Component[length]; } if (behaviour.argsTargetsProperties == null) { behaviour.argsTargetsProperties = new string[length]; } if (behaviour.argsTargetsProperties.Length != length) { behaviour.argsTargetsProperties = new string[length]; } if (behaviour.argsComponentIndexes == null) { behaviour.argsComponentIndexes = new int[length]; } if (behaviour.argsComponentIndexes.Length != length) { behaviour.argsComponentIndexes = new int[length]; } if (behaviour.argsTargetsPropertiesIndexes == null) { behaviour.argsTargetsPropertiesIndexes = new int[length]; } if (behaviour.argsTargetsPropertiesIndexes.Length != length) { behaviour.argsTargetsPropertiesIndexes = new int[length]; } /**TYPE OF ARGUMENTS*/ if (behaviour.stringArgs == null) { behaviour.stringArgs = new string[length]; } if (behaviour.stringArgs.Length != length) { behaviour.stringArgs = new string[length]; } if (behaviour.intArgs == null) { behaviour.intArgs = new int[length]; } if (behaviour.intArgs.Length != length) { behaviour.intArgs = new int[length]; } if (behaviour.floatArgs == null) { behaviour.floatArgs = new float[length]; } if (behaviour.floatArgs.Length != length) { behaviour.floatArgs = new float[length]; } if (behaviour.doubleArgs == null) { behaviour.doubleArgs = new double[length]; } if (behaviour.doubleArgs.Length != length) { behaviour.doubleArgs = new double[length]; } if (behaviour.vector2Args == null) { behaviour.vector2Args = new Vector2[length]; } if (behaviour.vector2Args.Length != length) { behaviour.vector2Args = new Vector2[length]; } if (behaviour.vector3Args == null) { behaviour.vector3Args = new Vector3[length]; } if (behaviour.vector3Args.Length != length) { behaviour.vector3Args = new Vector3[length]; } if (behaviour.vector4Args == null) { behaviour.vector4Args = new Vector4[length]; } if (behaviour.vector4Args.Length != length) { behaviour.vector4Args = new Vector4[length]; } if (behaviour.gameObjectArgs == null) { behaviour.gameObjectArgs = new GameObject[length]; } if (behaviour.gameObjectArgs.Length != length) { behaviour.gameObjectArgs = new GameObject[length]; } if (behaviour.componentArgs == null) { behaviour.componentArgs = new Component[length]; } if (behaviour.componentArgs.Length != length) { behaviour.componentArgs = new Component[length]; } if (behaviour.colorArgs == null) { behaviour.colorArgs = new Color[length]; } if (behaviour.colorArgs.Length != length) { behaviour.colorArgs = new Color[length]; } }
public override void OnInspectorGUI() { if (Application.isPlaying) { return; } Debug.Log("ON INSPECTOR GUI"); Undo.RecordObject(target, "EventTriggerBehaviour"); EventTriggerBehaviour behaviour = target as EventTriggerBehaviour; DrawDefaultInspector(); EditorGUILayout.Space(); //Setup Target GameObject if (behaviour.targetObject == null) { behaviour.targetObject = behaviour.gameObject; } behaviour.eventTypeIndex = EditorGUILayout.Popup("Event Type", behaviour.eventTypeIndex, new [] { "From Target Object", "From EventTriggerType" }); bool eventsFound = true; if (behaviour.eventTypeIndex == 0) { behaviour.ClearEventTrigger(); List <string> componentNames = new List <string>(); List <Component> componentsList = new List <Component>(); List <string> propertiesNames = new List <string>(); foreach (Component loopComponent in behaviour.targetObject.GetComponents(typeof(Component))) { componentsList.Add(loopComponent); componentNames.Add(loopComponent.GetType().ToString()); } behaviour.eventComponentIndex = EditorGUILayout.Popup("Component", behaviour.eventComponentIndex, componentNames.ToArray()); if (behaviour.eventComponentIndex != -1 && behaviour.eventComponentIndex < componentsList.Count) { behaviour.eventComponent = componentsList.ElementAt(behaviour.eventComponentIndex); foreach (PropertyInfo propertyInfo in behaviour.eventComponent.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)) { if (propertyInfo.PropertyType.BaseType == typeof(UnityEvent)) { propertiesNames.Add(propertyInfo.Name); } } if (propertiesNames.Count == 0) { eventsFound = false; EditorGUILayout.LabelField("No Events found"); } else { behaviour.eventPropertyIndex = EditorGUILayout.Popup("Property", behaviour.eventPropertyIndex, propertiesNames.ToArray()); if (behaviour.eventPropertyIndex != -1 && propertiesNames.Count > behaviour.eventPropertyIndex) { behaviour.eventProperty = propertiesNames.ElementAt(behaviour.eventPropertyIndex); behaviour.selectedUnityEventBase = behaviour.eventComponent.GetType().GetProperty(behaviour.eventProperty).GetValue(behaviour.eventComponent, null) as UnityEventBase; behaviour.RefreshUnityEventBase(); } } } EditorGUILayout.Space(); } else if (behaviour.eventTypeIndex == 1) { behaviour.eventTriggerType = (EventTriggerType)behaviour.eventIndex; if (!Application.isPlaying) { behaviour.RefreshEventTriggerList(); } EditorGUILayout.Space(); behaviour.eventIndex = EditorGUILayout.Popup("Event", behaviour.eventIndex, Enum.GetNames(typeof(EventTriggerType))); } if (!eventsFound) { if (!Application.isPlaying) { EditorSceneManager.MarkSceneDirty(SceneManager.GetActiveScene()); } return; } // Get actions list FieldInfo[] fieldsCollection = typeof(TriggersCollection).GetFields(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); foreach (FieldInfo fieldInfo in fieldsCollection) { actionsList.Add(fieldInfo.GetValue(null) as Delegate); actionsNamesList.Add(fieldInfo.Name); } behaviour.actionIndex = EditorGUILayout.Popup("Action", behaviour.actionIndex, actionsNamesList.ToArray()); behaviour.targetDelegate = actionsList[behaviour.actionIndex]; CreateArgumentsLists(behaviour); if (behaviour.targetDelegate != null) { if (behaviour.targetDelegate.Method.GetParameters().Length > 0) { EditorGUILayout.Space(); EditorGUILayout.LabelField("Arguments"); EditorGUILayout.Space(); } for (int index = 0; index < behaviour.targetDelegate.Method.GetParameters().Length; index++) { ParameterInfo parameterInfo = behaviour.targetDelegate.Method.GetParameters()[index]; // Debug.Log ("Parameter for Delegate: " + parameterInfo.ParameterType + "|" + parameterInfo.Name); string textFieldName = parameterInfo.Name; if (textFieldName == "") { textFieldName = "Argument " + (index + 1); } EditorGUILayout.LabelField(textFieldName + ": " + parameterInfo.ParameterType); behaviour.argsChoiceIndexList[index] = EditorGUILayout.Popup("Argument type", behaviour.argsChoiceIndexList[index], Enum.GetNames(typeof(EventTriggerArgumentKind))); /**STRING TYPE ARGUMENTS*/ //STRING if (parameterInfo.ParameterType == typeof(string)) { if (behaviour.argsChoiceIndexList[index] == 0) { behaviour.stringArgs[index] = EditorGUILayout.TextField("Value", behaviour.stringArgs[index]); } else { SetupDynamicArgument(behaviour, index, typeof(string)); } behaviour.argumentTypes[index] = EventTriggerArgumentType.String; } /**NUMBER TYPE ARGUMENTS*/ //INT else if (parameterInfo.ParameterType == typeof(int)) { if (behaviour.argsChoiceIndexList[index] == 0) { behaviour.intArgs[index] = EditorGUILayout.IntField("Value", behaviour.intArgs[index]); } else { SetupDynamicArgument(behaviour, index, typeof(int)); } behaviour.argumentTypes[index] = EventTriggerArgumentType.Int; } //FLOAT else if (parameterInfo.ParameterType == typeof(float)) { if (behaviour.argsChoiceIndexList[index] == 0) { behaviour.floatArgs[index] = EditorGUILayout.FloatField("Value", behaviour.floatArgs[index]); } else { SetupDynamicArgument(behaviour, index, typeof(float)); } behaviour.argumentTypes[index] = EventTriggerArgumentType.Float; } //DOUBLE else if (parameterInfo.ParameterType == typeof(double)) { if (behaviour.argsChoiceIndexList[index] == 0) { behaviour.doubleArgs[index] = EditorGUILayout.DoubleField("Value", behaviour.doubleArgs[index]); } else { SetupDynamicArgument(behaviour, index, typeof(double)); } behaviour.argumentTypes[index] = EventTriggerArgumentType.Double; } /**VECTOR TYPE ARGUMENTS*/ //VECTOR 2 else if (parameterInfo.ParameterType == typeof(Vector2)) { if (behaviour.argsChoiceIndexList[index] == 0) { behaviour.vector2Args[index] = EditorGUILayout.Vector2Field("Value", behaviour.vector2Args[index]); } else { SetupDynamicArgument(behaviour, index, typeof(Vector2)); } behaviour.argumentTypes[index] = EventTriggerArgumentType.Vector2; } //VECTOR 3 else if (parameterInfo.ParameterType == typeof(Vector3)) { if (behaviour.argsChoiceIndexList[index] == 0) { behaviour.vector3Args[index] = EditorGUILayout.Vector3Field("Value", behaviour.vector3Args[index]); } else { SetupDynamicArgument(behaviour, index, typeof(Vector3)); } behaviour.argumentTypes[index] = EventTriggerArgumentType.Vector3; } //VECTOR 4 else if (parameterInfo.ParameterType == typeof(Vector4)) { if (behaviour.argsChoiceIndexList[index] == 0) { behaviour.vector4Args[index] = EditorGUILayout.Vector4Field("Value", behaviour.vector4Args[index]); } else { SetupDynamicArgument(behaviour, index, typeof(Vector4)); } behaviour.argumentTypes[index] = EventTriggerArgumentType.Vector4; } /**GAME OBJECT TYPE ARGUMENTS*/ //GAME OBJECT else if (parameterInfo.ParameterType == typeof(GameObject)) { if (behaviour.argsChoiceIndexList[index] == 0) { behaviour.gameObjectArgs[index] = EditorGUILayout.ObjectField("Value", behaviour.gameObjectArgs[index], typeof(GameObject), true) as GameObject; } else { SetupDynamicArgument(behaviour, index, typeof(GameObject)); } behaviour.argumentTypes[index] = EventTriggerArgumentType.GameObject; } //COMPONENT else if (parameterInfo.ParameterType == typeof(Component)) { if (behaviour.argsChoiceIndexList[index] == 0) { behaviour.componentArgs[index] = EditorGUILayout.ObjectField("Value", behaviour.componentArgs[index], typeof(Component), true) as Component; } else { SetupDynamicArgument(behaviour, index, typeof(Component)); } behaviour.argumentTypes[index] = EventTriggerArgumentType.Component; } /**OTHER TYPE ARGUMENTS*/ //COLOR else if (parameterInfo.ParameterType == typeof(Color)) { if (behaviour.argsChoiceIndexList[index] == 0) { behaviour.colorArgs[index] = EditorGUILayout.ColorField("Value", behaviour.colorArgs[index]); } else { SetupDynamicArgument(behaviour, index, typeof(Color)); } behaviour.argumentTypes[index] = EventTriggerArgumentType.Color; } EditorGUILayout.Space(); } } if (!Application.isPlaying) { EditorSceneManager.MarkSceneDirty(SceneManager.GetActiveScene()); } }