コード例 #1
0
        public static void CheckForErrors(UnityEngine.Object targetObject)
        {
            if (targetObject == null)
            {
                return;
            }
            if (targetObject.GetType() == typeof(StateMachine))
            {
                checkingStateMachine = targetObject as StateMachine;
            }
            else if (targetObject.GetType() == typeof(State))
            {
                checkingState = targetObject as State;
            }
            else if (targetObject.GetType().IsSubclassOf(typeof(ExecutableNode)))
            {
                checkingExecutableNode = targetObject as ExecutableNode;
            }

            FieldInfo[] fields = targetObject.GetType().GetAllFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            for (int i = 0; i < fields.Length; i++)
            {
                FieldInfo field = fields[i];
                if (field.HasAttribute(typeof(ReferenceAttribute)) || !field.IsSerialized())
                {
                    continue;
                }
                object value = field.GetValue(targetObject);
                if (field.FieldType.IsSubclassOf(typeof(FsmVariable)))
                {
                    if (!field.HasAttribute(typeof(NotRequiredAttribute)) && (value == null || CheckForVariableError(value as FsmVariable, field)))
                    {
                        FsmError error = new FsmError(FsmError.ErrorType.RequiredField, checkingStateMachine, checkingState, checkingExecutableNode, value as FsmVariable, field);
                        if (!ContainsError(error))
                        {
                            errorList.Add(error);
                        }
                    }
                }
                else if (field.FieldType.IsSubclassOf(typeof(UnityEngine.Object)))
                {
                    CheckForErrors(value as UnityEngine.Object);
                }
                else if (field.FieldType.IsArray)
                {
                    var  array       = value as Array;
                    Type elementType = field.FieldType.GetElementType();
                    if (elementType.IsSubclassOf(typeof(UnityEngine.Object)))
                    {
                        foreach (UnityEngine.Object element in array)
                        {
                            CheckForErrors(element);
                        }
                    }
                }
            }
            checkForErrors = false;
        }
コード例 #2
0
ファイル: FsmError.cs プロジェクト: AlexGam/TowerIsland
		public FsmError(FsmError.ErrorType type,StateMachine stateMachine,State state,ExecutableNode executableNode,FsmVariable variable ,FieldInfo fieldInfo){
			this.type = type;
			this.variable = variable;
			this.fieldInfo = fieldInfo;
			this.stateMachine = stateMachine;
			this.state = state;
			this.executableNode = executableNode;

		}
コード例 #3
0
 private static bool ContainsError(FsmError error)
 {
     foreach (FsmError mError in errorList)
     {
         if (mError.SameAs(error))
         {
             return(true);
         }
     }
     return(false);
 }
コード例 #4
0
ファイル: FsmError.cs プロジェクト: AlexGam/TowerIsland
		public bool SameAs(FsmError error){

			if (type != error.Type) {
				return false;			
			}

			if (variable != error.Variable) {
				return false;			
			}

			return true;
		}
コード例 #5
0
ファイル: FsmError.cs プロジェクト: georgeroyer/superball2
        public bool SameAs(FsmError error)
        {
            if (type != error.Type)
            {
                return(false);
            }

            if (variable != error.Variable)
            {
                return(false);
            }

            return(true);
        }
コード例 #6
0
ファイル: ErrorChecker.cs プロジェクト: AlexGam/TowerIsland
		public static void CheckForErrors(UnityEngine.Object targetObject){
			if (targetObject == null) {
				return;
			}
			if (targetObject.GetType ()==typeof(StateMachine)) {
				checkingStateMachine = targetObject as StateMachine;			
			}else if(targetObject.GetType()==typeof(State)){
				checkingState=targetObject as State;
			} else if (targetObject.GetType ().IsSubclassOf (typeof(ExecutableNode))) {
				checkingExecutableNode=targetObject as ExecutableNode;			
			}

			FieldInfo[] fields = targetObject.GetType().GetAllFields (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
			for (int i=0; i<fields.Length; i++) {
				FieldInfo field=fields[i];
				if(field.HasAttribute(typeof(ReferenceAttribute)) || !field.IsSerialized()){
					continue;
				}
				object value=field.GetValue(targetObject);
				if(field.FieldType.IsSubclassOf(typeof(FsmVariable))){
					if(!field.HasAttribute(typeof(NotRequiredAttribute)) &&(value == null || CheckForVariableError(value as FsmVariable,field))){
						FsmError error=new FsmError(FsmError.ErrorType.RequiredField,checkingStateMachine,checkingState,checkingExecutableNode,value as FsmVariable,field);
						if(!ContainsError(error)){
							errorList.Add(error);
						}
					}
				}else if(field.FieldType.IsSubclassOf(typeof(UnityEngine.Object))){
					CheckForErrors(value as UnityEngine.Object);
				}else if(field.FieldType.IsArray){
					var array = value as Array;
					Type elementType = field.FieldType.GetElementType ();
					if(elementType.IsSubclassOf(typeof(UnityEngine.Object))){
						foreach(UnityEngine.Object element in array){
							CheckForErrors(element);
						}
					}
				}
			}
			checkForErrors = false;
		}
コード例 #7
0
ファイル: ErrorChecker.cs プロジェクト: AlexGam/TowerIsland
		private static bool ContainsError(FsmError error){
			foreach (FsmError mError in errorList) {
				if(mError.SameAs(error)){
					return true;
				}
			}	
			return false;
		}
コード例 #8
0
        private void OnGUI()
        {
            List <FsmError> errors = ErrorChecker.GetErrors();

            if (selectedFsmErrors)
            {
                if (FsmEditor.instance != null)
                {
                    errors = errors.FindAll(x => x.State.Parent == FsmEditor.Active).ToList();
                }
                else
                {
                    errors.Clear();
                }
            }
            //Toolbar
            GUILayout.BeginHorizontal(EditorStyles.toolbar);
            if (GUILayout.Button("Refresh", EditorStyles.toolbarButton))
            {
                ErrorChecker.CheckForErrors();
            }
            GUILayout.FlexibleSpace();
            if (GUILayout.Button("Selected FSM Only", (selectedFsmErrors?(GUIStyle)"TE toolbarbutton" : EditorStyles.toolbarButton)))
            {
                selectedFsmErrors = !selectedFsmErrors;
                ErrorChecker.CheckForErrors();
                EditorPrefs.SetBool("SelectedFSMOnly", selectedFsmErrors);
            }
            GUILayout.EndHorizontal();

            scroll = EditorGUILayout.BeginScrollView(scroll);
            for (int i = 0; i < errors.Count; i++)
            {
                FsmError error = errors[i];
                GUIStyle style = FsmEditorStyles.elementBackground;
                if (i == index)
                {
                    style = new GUIStyle("MeTransitionSelectHead")
                    {
                        stretchHeight = false,
                    };
                    style.overflow = new RectOffset(-1, -2, -2, 2);
                }
                GUILayout.BeginVertical(style);
                GUILayout.Label(error.Type.ToString());
                GUILayout.Label(error.State.Parent.Name + " : " + error.State.Name + " : " + error.ExecutableNode.name + (error.FieldInfo != null? " : " + error.FieldInfo.Name:""));
                GUILayout.EndVertical();
                Rect  elementRect = new Rect(0, i * 19f * 2f, Screen.width, 19f * 2f);
                Event ev          = Event.current;
                switch (ev.rawType)
                {
                case EventType.MouseDown:
                    if (elementRect.Contains(Event.current.mousePosition))
                    {
                        if (Event.current.button == 0)
                        {
                            index = i;
                            if (FsmEditor.instance == null)
                            {
                                FsmEditor.ShowWindow();
                            }
                            FsmEditor.SelectNode(error.State);
                            Event.current.Use();
                        }
                    }
                    break;
                }
            }
            EditorGUILayout.EndScrollView();
        }
コード例 #9
0
        public override void OnGUI(SerializedProperty property, GUIContent label)
        {
            if (property.objectReferenceValue == null)
            {
                CreateVariable(property);
            }
            if (property.objectReferenceValue == null)
            {
                return;
            }
            SerializedObject serializedObject = new SerializedObject(property.objectReferenceValue);

            serializedObject.Update();
            GUILayout.BeginHorizontal();

            SerializedProperty nameProperty   = serializedObject.FindProperty("name");
            SerializedProperty valueProperty  = serializedObject.FindProperty("value");
            SerializedProperty sharedProperty = serializedObject.FindProperty("isShared");

            if (EditorUtility.IsPersistent(property.objectReferenceValue) && fieldInfo.HasAttribute(typeof(SharedPersistentAttribute)) || fieldInfo.FieldType == typeof(FsmArray))
            {
                sharedProperty.boolValue = true;
            }

            Color    color = GUI.backgroundColor;
            FsmError error = ErrorChecker.GetError(property.objectReferenceValue);

            if (error != null)
            {
                GUI.backgroundColor = Color.red;
            }

            int variableIndex = -1;

            if (sharedProperty.boolValue)
            {
                variableIndex = DrawSharedVariable(label, nameProperty);
            }
            else
            {
                OnPropertyField(valueProperty, label);
            }
            GUI.backgroundColor = color;

            if (DoSharedToggle(property))
            {
                DrawSharedToggle(sharedProperty);
            }
            GUILayout.EndHorizontal();
            if (variableIndex == 0)
            {
                nameProperty.stringValue = "None";
                Color color1 = GUI.backgroundColor;
                GUI.backgroundColor = (EditorGUIUtility.isProSkin?new Color(0f, 0f, 0f, 0.6f):new Color(0f, 0f, 0f, 0.2f));
                GUIStyle style = new GUIStyle("box");
                style.normal.textColor = new Color(0f, 0f, 0f, 0.7f);
                if (GUILayout.Button("Click to create a new variable [" + fieldInfo.FieldType.Name + "]", style, GUILayout.ExpandWidth(true)))
                {
                    CreateVariable(property.objectReferenceValue.GetType(), fieldInfo.Name);
                    nameProperty.stringValue = fieldInfo.Name;
                }
                GUI.backgroundColor = color1;
            }
            serializedObject.ApplyModifiedProperties();
        }