예제 #1
0
 public static void UpdateLayerStates(StateMachine machine, StateLayer layer)
 {
     foreach (Type stateType in LayerStateDict[layer.GetType()])
     {
         StateMachineUtility.AddState(machine, layer, stateType);
     }
 }
예제 #2
0
        private IEnumerator StartGame(FightInfo fightInfo)
        {
            StatesUtility.ClearOptionLayer();
            yield return(ApplyFightInfos(fightInfo));

            yield return(m_ui.GotoVersusAnim());

            yield return((object)new WaitForTime(2f));

            StateLayer   defaultLayer = StateManager.GetDefaultLayer();
            StateContext currentState = defaultLayer.GetChildState();

            if (currentState != null)
            {
                defaultLayer.ClearChildState(0);
                while ((int)currentState.get_loadState() == 8)
                {
                    yield return(null);
                }
            }
            FightState fightState = new FightState(fightInfo);

            defaultLayer.SetChildState(fightState, 0);
            VersusState versusState = new VersusState(m_ui, fightState);

            this.SetChildState(versusState, 0);
        }
예제 #3
0
        void ShowAddSubLayer(StateLayer parent, Rect rect)
        {
            layerTypesName[0] = "Add";

            if (Selection.gameObjects.Length <= 1)
            {
                rect.x     = Screen.width - 72 - EditorGUI.indentLevel * 16;
                rect.y    += 1;
                rect.width = 36 + EditorGUI.indentLevel * 16;

                EditorGUI.BeginDisabledGroup(Application.isPlaying);

                GUIStyle style = new GUIStyle("MiniToolbarPopup");
                style.fontStyle = FontStyle.Bold;
                style.alignment = TextAnchor.MiddleCenter;

                int layerTypeIndex = EditorGUI.Popup(rect, layerTypes.IndexOf(selectedLayerType) + 1, layerTypesName.ToArray(), style) - 1;
                selectedLayerType = layerTypeIndex == -1 ? null : layerTypes[Mathf.Clamp(layerTypeIndex, 0, layerTypes.Count - 1)];

                if (selectedLayerType != null)
                {
                    StateMachineUtility.AddLayer(machine, selectedLayerType, parent);
                    selectedLayerType = null;
                }

                EditorGUI.EndDisabledGroup();
            }
        }
예제 #4
0
        void ShowLayers()
        {
            layersProperty = serializedObject.FindProperty("layers");
            CleanUpLayers();

            ShowAddLayer();

            if (layersProperty.arraySize > 0)
            {
                Separator();
            }

            for (int i = 0; i < layersProperty.arraySize; i++)
            {
                currentLayerProperty   = layersProperty.GetArrayElementAtIndex(i);
                currentLayer           = currentLayerProperty.GetValue <StateLayer>();
                currentLayerSerialized = new SerializedObject(currentLayerProperty.objectReferenceValue);
                statesProperty         = currentLayerSerialized.FindProperty("states");
                currentStatesProperty  = currentLayerSerialized.FindProperty("currentStates");

                BeginBox();

                GUIStyle style = new GUIStyle("foldout");
                style.fontStyle = FontStyle.Bold;
                if (DeleteFoldOut(layersProperty, i, currentLayer.GetType().Name.ToGUIContent(), style, OnLayerDeleted))
                {
                    break;
                }

                ShowLayer();

                EndBox();
            }
        }
예제 #5
0
        public static void RemoveLayer(StateMachine machine, StateLayer layer)
        {
#if UNITY_EDITOR
            var layerSerialized = new UnityEditor.SerializedObject(layer);
            var statesProperty  = layerSerialized.FindProperty("stateReferences");
            var states          = statesProperty.GetValues <UnityEngine.Object>();

            for (int i = 0; i < states.Length; i++)
            {
                var state    = states[i];
                var sublayer = state as StateLayer;

                if (sublayer != null)
                {
                    RemoveLayer(machine, sublayer);
                }
                else
                {
                    state.Destroy();
                }
            }

            layer.Destroy();
            UpdateCallbacks(machine);
#endif
        }
예제 #6
0
        public static StateLayer AddLayer(StateMachine machine, StateLayer layer, UnityEngine.Object parent)
        {
#if UNITY_EDITOR
            layer.hideFlags = HideFlags.HideInInspector;

            var parentSerialized = new UnityEditor.SerializedObject(parent);
            var layerSerialized  = new UnityEditor.SerializedObject(layer);
            var layersProperty   = parentSerialized.FindProperty("stateReferences");
            var parentProperty   = layerSerialized.FindProperty("parentReference");

            if (parentProperty.GetValue <UnityEngine.Object>() == null)
            {
                parentProperty.SetValue(parent);
            }

            layerSerialized.FindProperty("machineReference").SetValue(machine);
            layerSerialized.ApplyModifiedProperties();

            if (!layersProperty.Contains(layer))
            {
                layersProperty.Add(layer);
            }

            UpdateLayerStates(machine, layer);
            UpdateCallbacks(machine);
#endif

            return(layer);
        }
        public void RemoveState(string stateName, int layer = 0)
        {
            StateLayer stateLayer = GetStateLayer(layer);

            if (stateLayer != null)
            {
                stateLayer.RemoveState(stateName);
            }
        }
예제 #8
0
        private void SetFocusOnLayer(string layerName)
        {
            StateLayer activeInputLayer = default(StateLayer);

            if (StateManager.TryGetLayer(layerName, ref activeInputLayer))
            {
                StateManager.SetActiveInputLayer(activeInputLayer);
            }
        }
        public void EnableState(string stateName, float fixedTime, int layer = 0)
        {
            StateLayer stateLayer = GetStateLayer(layer);

            if (stateLayer != null)
            {
                stateLayer.EnableState(stateName, fixedTime);
            }
        }
        public void SetInputWeight(string stateName, float weight, int layer = 0)
        {
            StateLayer stateLayer = GetStateLayer(layer);

            if (stateLayer != null)
            {
                stateLayer.SetInputWeight(stateName, weight);
            }
        }
        public void DisableState(string stateName, int layer = 0)
        {
            StateLayer stateLayer = GetStateLayer(layer);

            if (stateLayer != null)
            {
                stateLayer.DisableState(stateName);
            }
        }
예제 #12
0
        public void AddState(string stateName, Playable playable, AnimationClip clip, string groupName = null, int layer = 0)
        {
            StateLayer stateLayer = GetStateLayer(layer);

            if (stateLayer != null)
            {
                stateLayer.AddState(stateName, false, playable, clip, groupName);
            }
        }
예제 #13
0
        public static void UpdateLayerStates(StateMachine machine, StateLayer layer)
        {
            var types = LayerTypeStateTypeDict[layer.GetType()];

            for (int i = 0; i < types.Count; i++)
            {
                AddState(machine, layer, types[i]);
            }
        }
예제 #14
0
        void OnLayerAdded(SerializedProperty arrayProperty)
        {
            AddToArray(arrayProperty);

            StateLayer newLayer = stateMachineObject.AddComponent(selectedLayerType) as StateLayer;
            newLayer.machine = stateMachine;
            newLayer.hideFlags = HideFlags.HideInInspector;
            arrayProperty.GetLastArrayElement().SetValue(newLayer);
        }
        public void Crossfade(string stateName, float fixedTime, bool isNormalnize, int layer = 0)
        {
            StateLayer stateLayer = GetStateLayer(layer);

            if (stateLayer != null)
            {
                stateLayer.Crossfade(stateName, fixedTime, isNormalnize);
            }
        }
예제 #16
0
        public void AddBlendTree(string stateName, Playable playable, BlendTreeConfig[] configs, string blendTreeParam, string groupName = null, int layer = 0)
        {
            StateLayer stateLayer = GetStateLayer(layer);

            if (stateLayer != null)
            {
                stateLayer.AddState(stateName, true, playable, null, groupName, configs, blendTreeParam);
            }
        }
예제 #17
0
        public static State AddState(StateMachine machine, StateLayer layer, Type stateType)
        {
            State state = null;

                        #if UNITY_EDITOR
            state = AddState(machine, layer, machine.GetOrAddComponent(stateType) as State);
                        #endif

            return(state);
        }
예제 #18
0
        public static StateLayer AddLayer(StateMachine machine, Type layerType, UnityEngine.Object parent)
        {
            StateLayer layer = null;

                        #if UNITY_EDITOR
            layer = AddLayer(machine, machine.GetOrAddComponent(layerType) as StateLayer, parent);
                        #endif

            return(layer);
        }
예제 #19
0
        public void ReducePanel()
        {
            m_isOpen = false;
            StateLayer val = default(StateLayer);

            if (StateManager.TryGetLayer("PlayerUI", ref val))
            {
                val.GetChainRoot().ClearChildState(0);
            }
        }
예제 #20
0
        private void OnOptionsClosed()
        {
            StateLayer val = default(StateLayer);

            if (StateManager.TryGetLayer("OptionUI", ref val))
            {
                StateManager.DiscardInputLayer(val);
                UIManager.instance.NotifyLayerIndexChange();
            }
        }
예제 #21
0
        private void OpenProfileUI()
        {
            StateLayer val = default(StateLayer);

            if (StateManager.TryGetLayer("PlayerUI", ref val))
            {
                ProfileState profileState = new ProfileState();
                val.GetChainRoot().GetChildState().SetChildState(profileState, 0);
            }
        }
예제 #22
0
        private void OpenDeckUI()
        {
            StateLayer val = default(StateLayer);

            if (StateManager.TryGetLayer("PlayerUI", ref val))
            {
                DeckMainState deckMainState = new DeckMainState();
                val.GetChainRoot().GetChildState().SetChildState(deckMainState, 0);
            }
        }
        public StateInfo AddState(string stateName, Playable playable, AnimationClip clip, string groupName = null, int layer = 0)
        {
            StateLayer stateLayer = GetStateLayer(layer);

            if (stateLayer != null)
            {
                return(stateLayer.AddState(stateName, false, playable, clip, groupName));
            }
            return(null);
        }
        private StateLayer GetStateLayer(int layer)
        {
            StateLayer stateLayer = null;

            int index = m_StateLayers.FindIndex((l => l != null && l.layerIndex == layer));

            stateLayer = (index == -1) ? stateLayer : m_StateLayers[index];

            return(stateLayer);
        }
        public void SetLayerWeight(int layerIndex, float weight)
        {
            if (!CheckLayerIfExist(layerIndex))
            {
                return;
            }
            StateLayer layer = m_StateLayers[layerIndex];

            layer.weight             = Mathf.Clamp01(weight);
            layer.isLayerWeightDirty = true;
        }
예제 #26
0
        public static bool IsParent(StateLayer layer, UnityEngine.Object parent)
        {
            bool isParent = false;

#if UNITY_EDITOR
            var layerSerialized = new UnityEditor.SerializedObject(layer);
            isParent = layerSerialized.FindProperty("parentReference").GetValue <UnityEngine.Object>() == parent;
#endif

            return(isParent);
        }
예제 #27
0
        public static StateLayer AddLayer(StateMachine machine, State state)
        {
            StateLayer layer = null;

#if UNITY_EDITOR
            layer = AddLayer(machine, GetLayerTypeFromState(state), machine);
            AddState(machine, layer, state);
#endif

            return(layer);
        }
예제 #28
0
        public static void ShowApplicationError(PopupInfo popupInfo)
        {
            StateLayer val = default(StateLayer);

            if (!StateManager.TryGetLayer("application", ref val))
            {
                val = StateManager.AddLayer("application");
            }
            StateManager.SetActiveInputLayer(val);
            popupInfo.style = PopupStyle.Error;
            Show(val, popupInfo);
        }
예제 #29
0
        public override void OnEnable()
        {
            base.OnEnable();

            layer = (StateLayer)target;

            if (layer.Machine == null)
            {
                Type layerType = layer.GetType();
                StateMachine machine = layer.CachedGameObject.GetOrAddComponent<StateMachine>();
                StateMachineUtility.AddLayer(machine, layerType, machine);
            }
        }
예제 #30
0
        protected override IEnumerator Update()
        {
            yield return(m_ui.PlayEnterAnimation(GetWeaponsList()));

            StateLayer val = default(StateLayer);

            if (StateManager.TryGetLayer("PlayerUI", ref val))
            {
                m_subState = new DeckEditState();
                m_subState.OnCloseComplete += BackFromEditionState;
                val.GetChainEnd().SetChildState(m_subState, 0);
            }
        }
예제 #31
0
        public static State AddState(StateMachine machine, StateLayer layer, Type stateType)
        {
            State state = null;

#if UNITY_EDITOR
            state = Array.Find(machine.GetComponents(stateType), component => component.GetType() == stateType) as State;
            state = state == null?machine.gameObject.AddComponent(stateType) as State : state;

            state = AddState(machine, layer, state);
#endif

            return(state);
        }
        public static bool IsParent(StateLayer layer, UnityEngine.Object parent)
        {
            bool isParent = false;

            #if UNITY_EDITOR
            var layerSerialized = new UnityEditor.SerializedObject(layer);
            isParent = layerSerialized.FindProperty("parentReference").GetValue<UnityEngine.Object>() == parent;
            #endif

            return isParent;
        }
        public static StateLayer[] GetSubLayersRecursive(StateLayer layer)
        {
            var subLayers = new List<StateLayer>();

            #if UNITY_EDITOR
            var layerSerialized = new UnityEditor.SerializedObject(layer);
            var subLayersProperty = layerSerialized.FindProperty("stateReferences");

            for (int i = 0; i < subLayersProperty.arraySize; i++)
            {
                var subLayer = subLayersProperty.GetValue(i) as StateLayer;

                if (subLayer != null)
                {
                    subLayers.Add(subLayer);
                    subLayers.AddRange(GetSubLayersRecursive(subLayer));
                }
            }
            #endif

            return subLayers.ToArray();
        }
예제 #34
0
		void ShowLayers() {
			layersProperty = serializedObject.FindProperty("layers");
			CleanUpLayers();
			
			ShowAddLayer();
			
			if (layersProperty.arraySize > 0) {
				Separator();
			}
			
			for (int i = 0; i < layersProperty.arraySize; i++) {
				currentLayerProperty = layersProperty.GetArrayElementAtIndex(i);
				currentLayer = currentLayerProperty.GetValue<StateLayer>();
				currentLayerSerialized = new SerializedObject(currentLayerProperty.objectReferenceValue);
				statesProperty = currentLayerSerialized.FindProperty("states");
				currentStatesProperty = currentLayerSerialized.FindProperty("currentStates");
				
				BeginBox();
				
				GUIStyle style = new GUIStyle("foldout");
				style.fontStyle = FontStyle.Bold;
				if (DeleteFoldOut(layersProperty, i, currentLayer.GetType().Name.ToGUIContent(), style, OnLayerDeleted)) {
					break;
				}
				
				ShowLayer();
				
				EndBox();
			}
		}
예제 #35
0
        public static State AddState(StateMachine machine, StateLayer layer, Type stateType)
        {
            State state = null;

            #if UNITY_EDITOR
            state = AddState(machine, layer, machine.GetOrAddComponent(stateType) as State);
            #endif

            return state;
        }
예제 #36
0
 public static void UpdateLayerStates(StateMachine machine, StateLayer layer)
 {
     foreach (Type stateType in LayerStateDict[layer.GetType()]) {
         StateMachineUtility.AddState(machine, layer, stateType);
     }
 }
        public static void UpdateLayerStates(StateMachine machine, StateLayer layer)
        {
            var types = LayerTypeStateTypeDict[layer.GetType()];

            for (int i = 0; i < types.Count; i++)
                AddState(machine, layer, types[i]);
        }
        public static void AddMissingStates(StateMachine machine, StateLayer layer)
        {
            #if UNITY_EDITOR
            var layerSerialized = new UnityEditor.SerializedObject(layer);
            var statesProperty = layerSerialized.FindProperty("stateReferences");
            var stateTypes = LayerTypeStateTypeDict[layer.GetType()];

            for (int i = 0; i < stateTypes.Count; i++)
            {
                var stateType = stateTypes[i];

                if (statesProperty != null && !Array.Exists(statesProperty.GetValues<UnityEngine.Object>(), state => state.GetType() == stateType))
                    AddState(machine, layer, stateType);
            }
            #endif
        }
        public static StateLayer AddLayer(StateMachine machine, StateLayer layer, UnityEngine.Object parent)
        {
            #if UNITY_EDITOR
            layer.hideFlags = HideFlags.HideInInspector;

            var parentSerialized = new UnityEditor.SerializedObject(parent);
            var layerSerialized = new UnityEditor.SerializedObject(layer);
            var layersProperty = parentSerialized.FindProperty("stateReferences");
            var parentProperty = layerSerialized.FindProperty("parentReference");

            if (parentProperty.GetValue<UnityEngine.Object>() == null)
                parentProperty.SetValue(parent);

            layerSerialized.FindProperty("machineReference").SetValue(machine);
            layerSerialized.ApplyModifiedProperties();

            if (!layersProperty.Contains(layer))
                layersProperty.Add(layer);

            UpdateLayerStates(machine, layer);
            UpdateCallbacks(machine);
            #endif

            return layer;
        }
예제 #40
0
        void ShowStates(SerializedProperty statesProperty, StateLayer layer)
        {
            for (int i = 0; i < statesProperty.arraySize; i++)
            {
                SerializedProperty stateProperty = statesProperty.GetArrayElementAtIndex(i);
                State state = stateProperty.GetValue<UnityEngine.Object>() as State;

                if (state == null)
                {
                    ShowLayer(statesProperty, i);
                    continue;
                }

                BeginBox(GetBoxStyle(state));

                Foldout(stateProperty, StateMachineUtility.FormatState(state.GetType(), layer).ToGUIContent(), GetStateStyle(state));
                Reorderable(statesProperty, i, true);

                ShowState(stateProperty);

                EndBox();
            }
        }
예제 #41
0
        void ShowLayerOptions(StateLayer layer, Rect rect)
        {
            bool isScrolling = (Screen.width - rect.xMax) > 5;

            GUIStyle style = new GUIStyle("MiniToolbarPopup");
            style.fontStyle = FontStyle.Bold;

            rect.x = Screen.width - (isScrolling ? 60 : 45) - EditorGUI.indentLevel * 15;
            rect.y += 1;
            rect.width = 24 + EditorGUI.indentLevel * 15;

            if (!Application.isPlaying && (Event.current.type == EventType.ExecuteCommand || rect.Contains(Event.current.mousePosition)))
            {
                List<UnityEngine.Object> validParents = new List<UnityEngine.Object>();
                List<Type> layerTypes = new List<Type>();
                List<string> options = new List<string> { "..." };
                bool machineIsParent = StateMachineUtility.IsParent(layer, machine);

                foreach (KeyValuePair<Type, List<Type>> pair in StateMachineUtility.LayerTypeStateTypeDict)
                {
                    PropertyInfo layerProperty = pair.Key.GetProperty("Layer", ReflectionExtensions.AllFlags);
                    PropertyInfo machineProperty = pair.Key.GetProperty("Machine", ReflectionExtensions.AllFlags);

                    if ((machineProperty == null || machineProperty.PropertyType.IsInstanceOfType(machine)) && (layerProperty == null || layerProperty.PropertyType.IsInstanceOfType(layer)) && Array.TrueForAll(existingLayers, existingLayer => existingLayer.GetType() != pair.Key))
                    {
                        layerTypes.Add(pair.Key);
                        options.Add("Add/" + StateMachineUtility.LayerTypeFormattedDict[pair.Key]);
                    }
                }

                if (!machineIsParent)
                {
                    validParents.Add(machine);
                    options.Add("Move To/Machine");
                }

                for (int i = 0; i < existingLayers.Length; i++)
                {
                    StateLayer existingLayer = existingLayers[i];

                    if (layer != existingLayer && !StateMachineUtility.IsParent(layer, existingLayer) && !StateMachineUtility.GetSubLayersRecursive(layer).Contains(existingLayer))
                    {
                        validParents.Add(existingLayer);
                        options.Add("Move To/" + StateMachineUtility.FormatLayer(existingLayer.GetType()));
                    }
                }

                options.Add("Copy");

                if (EditorPrefs.GetString("Clipboard Layer Type") == layer.GetType().Name)
                {
                    options.Add("Paste/Layer");
                    options.Add("Paste/Layer and States");
                    options.Add("Paste/Layer and Sublayers");
                    options.Add("Paste/All");
                }

                options.Add("Generate");

                if (Selection.gameObjects.Length <= 1)
                {
                    //					int index = EditorGUI.Popup(rect, layerTypes.IndexOf(selectedLayerType) + 1, options.ToArray(), style) - 1;
                    int index = EditorGUI.Popup(rect, 0, options.ToArray(), style) - 1;
                    string option = index == -1 ? "" : options[index + 1];

                    if (index < layerTypes.Count)
                    {
                        selectedLayerType = index == -1 ? null : layerTypes[Mathf.Clamp(index, 0, options.Count - 1)];

                        if (selectedLayerType != null)
                        {
                            StateMachineUtility.AddLayer(machine, selectedLayerType, layer);
                            selectedLayerType = null;
                        }
                    }
                    else if (option.StartsWith("Move To"))
                    {
                        UnityEngine.Object parent = validParents[index - layerTypes.Count];
                        StateMachineUtility.MoveLayerTo(layer, parent);
                    }
                    else if (option.StartsWith("Copy"))
                    {
                        EditorPrefs.SetString("Clipboard Layer Type", layer.GetType().Name);
                        EditorPrefs.SetInt("Clipboard Layer ID", layer.GetInstanceID());
                    }
                    else if (option.StartsWith("Paste"))
                    {
                        StateLayer layerToCopy = EditorUtility.InstanceIDToObject(EditorPrefs.GetInt("Clipboard Layer ID")) as StateLayer;

                        if (option == "Paste/Layer")
                        {
                            StateMachineUtility.CopyLayer(layer, layerToCopy, false, false);
                        }
                        else if (option == "Paste/Layer and States")
                        {
                            StateMachineUtility.CopyLayer(layer, layerToCopy, true, false);
                        }
                        else if (option == "Paste/Layer and Sublayers")
                        {
                            StateMachineUtility.CopyLayer(layer, layerToCopy, false, true);
                        }
                        else if (option == "Paste/All")
                        {
                            StateMachineUtility.CopyLayer(layer, layerToCopy, true, true);
                        }

                        EditorPrefs.SetString("Clipboard Layer Type", "");
                        EditorPrefs.SetInt("Clipboard Layer ID", 0);
                    }
                    else if (option.StartsWith("Generate"))
                    {
                        StateMachineGeneratorWindow generator = StateMachineGeneratorWindow.Create();

                        string layerTypeName = layer.GetTypeName();
                        string layerScriptPath = AssetDatabaseUtility.GetAssetPath(layerTypeName + ".cs");

                        generator.Path = string.IsNullOrEmpty(layerScriptPath) ? generator.Path : Path.GetDirectoryName(layerScriptPath);
                        generator.Machine = StateMachineUtility.FormatMachine(machine);
                        generator.Layer = layerTypeName;
                        generator.Inherit = StateMachineUtility.FormatLayer(layer.GetType().BaseType);
                        generator.SubLayer = layer.Layer == null ? "" : StateMachineUtility.FormatLayer(layer.Layer.GetType());
                    }
                }
            }
            else
            {
                EditorGUI.BeginDisabledGroup(Application.isPlaying);

                EditorGUI.Popup(rect, 0, new[] { "..." }, style);

                EditorGUI.EndDisabledGroup();
            }
        }
예제 #42
0
        GUIStyle GetLayerStyle(StateLayer layer)
        {
            GUIStyle style = new GUIStyle("foldout");
            style.fontStyle = FontStyle.Bold;

            Color textColor = style.normal.textColor * 1.4F;

            style.normal.textColor = textColor * 0.7F;
            style.onNormal.textColor = textColor * 0.7F;
            style.focused.textColor = textColor * 0.85F;
            style.onFocused.textColor = textColor * 0.85F;
            style.active.textColor = textColor * 0.85F;
            style.onActive.textColor = textColor * 0.85F;

            return style;
        }
예제 #43
0
        GUIContent GetLayerLabel(StateLayer layer)
        {
            string label = layer.GetType().Name;

            if (Application.isPlaying && PrefabUtility.GetPrefabType(machine) != PrefabType.Prefab)
            {
                IState[] activeStates = layer.GetActiveStates();
                string[] activeStateNames = new string[activeStates.Length];

                for (int i = 0; i < activeStateNames.Length; i++)
                    activeStateNames[i] = activeStates[i] is IStateLayer ? activeStates[i].GetTypeName() : StateMachineUtility.FormatState(activeStates[i].GetType(), layer);

                label += " (" + activeStateNames.Concat(", ") + ")";
            }

            return label.ToGUIContent();
        }
        public static void MoveLayerTo(StateLayer layer, UnityEngine.Object parent)
        {
            #if UNITY_EDITOR
            var layerSerialized = new UnityEditor.SerializedObject(layer);
            var newParentSerialized = new UnityEditor.SerializedObject(parent);
            var oldParentProperty = layerSerialized.FindProperty("parentReference");
            var oldParentSerialized = new UnityEditor.SerializedObject(oldParentProperty.GetValue<UnityEngine.Object>());

            oldParentProperty.SetValue(parent);
            oldParentSerialized.FindProperty("stateReferences").Remove(layer);
            newParentSerialized.FindProperty("stateReferences").Add(layer);

            layerSerialized.ApplyModifiedProperties();
            newParentSerialized.ApplyModifiedProperties();
            oldParentSerialized.ApplyModifiedProperties();
            #endif
        }
        public static void RemoveLayer(StateMachine machine, StateLayer layer)
        {
            #if UNITY_EDITOR
            var layerSerialized = new UnityEditor.SerializedObject(layer);
            var statesProperty = layerSerialized.FindProperty("stateReferences");
            var states = statesProperty.GetValues<UnityEngine.Object>();

            for (int i = 0; i < states.Length; i++)
            {
                var state = states[i];
                var sublayer = state as StateLayer;

                if (sublayer != null)
                    RemoveLayer(machine, sublayer);
                else
                    state.Destroy();
            }

            layer.Destroy();
            UpdateCallbacks(machine);
            #endif
        }
        public static State AddState(StateMachine machine, StateLayer layer, Type stateType)
        {
            State state = null;

            #if UNITY_EDITOR
            state = Array.Find(machine.GetComponents(stateType), component => component.GetType() == stateType) as State;
            state = state == null ? machine.gameObject.AddComponent(stateType) as State : state;
            state = AddState(machine, layer, state);
            #endif

            return state;
        }
예제 #47
0
        GUIStyle GetLayerStyle(StateLayer layer)
        {
            GUIStyle style = new GUIStyle("foldout");
            style.fontStyle = FontStyle.Bold;
            Color textColor = style.normal.textColor * 1.4F;

            if (Application.isPlaying && PrefabUtility.GetPrefabType(machine) != PrefabType.Prefab) {
                textColor = layer.IsActive ? new Color(0, 1, 0, 10) : new Color(1, 0, 0, 10);
            }

            style.normal.textColor = textColor * 0.7F;
            style.onNormal.textColor = textColor * 0.7F;
            style.focused.textColor = textColor * 0.85F;
            style.onFocused.textColor = textColor * 0.85F;
            style.active.textColor = textColor * 0.85F;
            style.onActive.textColor = textColor * 0.85F;

            return style;
        }
        public static State AddState(StateMachine machine, StateLayer layer, State state)
        {
            #if UNITY_EDITOR
            state.hideFlags = HideFlags.HideInInspector;

            var layerSerialized = new UnityEditor.SerializedObject(layer);
            var stateSerialized = new UnityEditor.SerializedObject(state);
            var statesProperty = layerSerialized.FindProperty("stateReferences");

            stateSerialized.FindProperty("layerReference").SetValue(layer);
            stateSerialized.FindProperty("machineReference").SetValue(machine);
            stateSerialized.ApplyModifiedProperties();

            if (!statesProperty.Contains(state))
                statesProperty.Add(state);
            #endif

            return state;
        }
예제 #49
0
        public static void RemoveLayer(StateLayer layer)
        {
            #if UNITY_EDITOR
            UnityEditor.SerializedObject layerSerialized = new UnityEditor.SerializedObject(layer);
            UnityEditor.SerializedProperty statesProperty = layerSerialized.FindProperty("stateReferences");

            foreach (UnityEngine.Object state in statesProperty.GetValues<UnityEngine.Object>()) {
                if (state is StateLayer) {
                    RemoveLayer(state as StateLayer);
                }
                else {
                    state.Remove();
                }
            }

            layer.Remove();
            #endif
        }
        public static void CopyLayer(StateLayer layer, StateLayer layerToCopy, bool copyStates, bool copySublayers)
        {
            #if UNITY_EDITOR
            if (layerToCopy == null)
                return;

            var layerSerialized = new UnityEditor.SerializedObject(layer);
            var parentReference = layerSerialized.FindProperty("parentReference").GetValue<UnityEngine.Object>();
            var machineReference = layerSerialized.FindProperty("machineReference").GetValue<UnityEngine.Object>();
            var stateReferences = layerSerialized.FindProperty("stateReferences").GetValues<UnityEngine.Object>();
            var activeStateReferences = layerSerialized.FindProperty("activeStateReferences").GetValues<UnityEngine.Object>();

            UnityEditorInternal.ComponentUtility.CopyComponent(layerToCopy);
            UnityEditorInternal.ComponentUtility.PasteComponentValues(layer);

            layerSerialized = new UnityEditor.SerializedObject(layer);
            layerSerialized.FindProperty("parentReference").SetValue(parentReference);
            layerSerialized.FindProperty("machineReference").SetValue(machineReference);
            layerSerialized.FindProperty("stateReferences").SetValues(stateReferences);
            layerSerialized.FindProperty("activeStateReferences").SetValues(activeStateReferences);

            for (int i = 0; i < stateReferences.Length; i++)
            {
                var stateReference = stateReferences[i];
                var state = stateReference as State;
                var sublayer = stateReference as StateLayer;

                if (copyStates && state != null)
                {
                    var stateToCopy = layerToCopy.GetState(state.GetType()) as State;

                    if (stateToCopy != null)
                        CopyState(state, stateToCopy);
                }

                if (copySublayers && sublayer != null)
                {
                    var sublayerToCopy = layerToCopy.GetState(sublayer.GetType()) as StateLayer;

                    if (sublayerToCopy != null)
                        CopyLayer(sublayer, sublayerToCopy, copyStates, copySublayers);
                }
            }
            #endif
        }
예제 #51
0
        public static void AddMissingStates(StateMachine machine, StateLayer layer)
        {
            #if UNITY_EDITOR
            UnityEditor.SerializedObject layerSerialized = new UnityEditor.SerializedObject(layer);
            UnityEditor.SerializedProperty statesProperty = layerSerialized.FindProperty("stateReferences");

            foreach (Type stateType in LayerStateDict[layer.GetType()]) {
                if (!Array.Exists(statesProperty.GetValues<UnityEngine.Object>(), state => state.GetType() == stateType)) {
                    AddState(machine, layer, stateType);
                }
            }
            #endif
        }
 public static string FormatState(Type stateType, StateLayer layer)
 {
     return FormatState(stateType, GetLayerPrefix(layer));
 }
 public static string GetLayerPrefix(StateLayer layer)
 {
     return GetLayerPrefix(layer.GetType());
 }
예제 #54
0
        void ShowAddSubLayer(StateLayer parent, Rect rect)
        {
            layerTypesName[0] = "Add";

            if (Selection.gameObjects.Length <= 1) {
                rect.x = Screen.width - 72 - EditorGUI.indentLevel * 16;
                rect.y += 1;
                rect.width = 36 + EditorGUI.indentLevel * 16;

                EditorGUI.BeginDisabledGroup(Application.isPlaying);

                GUIStyle style = new GUIStyle("MiniToolbarPopup");
                style.fontStyle = FontStyle.Bold;
                style.alignment = TextAnchor.MiddleCenter;

                int layerTypeIndex = EditorGUI.Popup(rect, layerTypes.IndexOf(selectedLayerType) + 1, layerTypesName.ToArray(), style) - 1;
                selectedLayerType = layerTypeIndex == -1 ? null : layerTypes[Mathf.Clamp(layerTypeIndex, 0, layerTypes.Count - 1)];

                if (selectedLayerType != null) {
                    StateMachineUtility.AddLayer(machine, selectedLayerType, parent);
                    selectedLayerType = null;
                }

                EditorGUI.EndDisabledGroup();
            }
        }