private void FindTransitionPoint()
    {
        if (!string.IsNullOrEmpty(transitionPoint) && !SceneManager.GetActiveScene().name.Contains("Dungeon"))
        {
            TransitionTrigger transitionTrigger = GameObject.Find(transitionPoint).GetComponent <TransitionTrigger>();

            if (transitionTrigger.exit != null)
            {
                transform.position = transitionTrigger.exit.transform.position;
            }
            else
            {
                transform.position = transitionTrigger.transform.position;
            }
        }

        transitionPoint = null;
    }
Esempio n. 2
0
        /** @brief Add a transition between two states.
         *
         * @param originStateName The name of the State to transitate from.
         * @param targetStateName The name of the State to transitate to.
         * @param trigget Trigger that determinates when to transitate.
         * @param layerId The layer in which the states has to be found.
         * @param priotity The prority to be actived.
         * @return A reference to the transition created.
         */
        public bool AddTransition(string originStateName, string targetStateName, TransitionTrigger trigger, int layerId = 0, int priority = 0)
        {
            Layer layerAux = FindLayer(layerId);

            if (layerAux == null)
            {
                Debug.LogWarningFormat("The transition {0}-{1} has not been added, no exists state {2} in layer {3}.",
                                       originStateName, targetStateName, originStateName, layerId);
                return(false);
            }
            Transition newTransition = layerAux.AddTransition(originStateName, targetStateName, trigger, priority);

            if (newTransition == null)
            {
                Debug.LogWarningFormat("The transition {0}-{1} has not been added to the state {2} in layer {3}.",
                                       originStateName, targetStateName, originStateName, layerId);
            }
            return(true);
        }
Esempio n. 3
0
        public void TransitionEvents()
        {
            StateMachine stateMachine = new StateMachine();
            SimpleState  s0 = new SimpleState(), s1 = new SimpleState();

            stateMachine.AddState(s0);
            stateMachine.AddState(s1);
            stateMachine.AddEntryTransition(0, null);
            stateMachine.AddExitTransition(1, null);
            TransitionTrigger trigger = new TransitionTrigger();

            stateMachine.AddTransition(0, 1, trigger);
            List <string> result = new List <string>();

            s0.StateLeave            += () => result.Add("leave: 0");
            s1.StateEnter            += () => result.Add("enter: 1");
            trigger.BeforeTransition += () =>
            {
                result.Add("before transition");
                Assert.AreEqual("0.-1", stateMachine.GenerateActiveStateDescriptor());
            };
            trigger.AfterTransition += () =>
            {
                result.Add("after transition");
                Assert.AreEqual("-1", stateMachine.GenerateActiveStateDescriptor());
            };
            stateMachine.Run();
            trigger.Fire();
            Assert.AreEqual(4, result.Count);
            Assert.AreEqual("before transition", result[0]);
            Assert.AreEqual("leave: 0", result[1]);
            Assert.AreEqual("enter: 1", result[2]);
            Assert.AreEqual("after transition", result[3]);

            trigger.BeforeTransition += () => trigger.StopTransition();
            result.Clear();
            stateMachine.Reset();
            stateMachine.Run();
            trigger.Fire();
            Assert.AreEqual(1, result.Count);
            Assert.AreEqual("before transition", result[0]);
        }
Esempio n. 4
0
        public void MultiEdges()
        {
            StateMachine stateMachine = new StateMachine();
            SimpleState  s0 = new SimpleState(), s1 = new SimpleState();

            stateMachine.AddState(s0);
            stateMachine.AddState(s1);
            stateMachine.AddEntryTransition(0, null);
            stateMachine.AddExitTransition(1, null);
            TransitionTrigger trigger0 = new TransitionTrigger();
            TransitionTrigger trigger1 = new TransitionTrigger();

            stateMachine.AddTransition(0, 1, trigger0);
            stateMachine.AddTransition(0, 1, trigger1);

            stateMachine.Run();
            trigger0.Fire();
            Assert.AreEqual("-1", stateMachine.GenerateActiveStateDescriptor());
            stateMachine.Reset();
            stateMachine.Run();
            trigger1.Fire();
            Assert.AreEqual("-1", stateMachine.GenerateActiveStateDescriptor());
        }
Esempio n. 5
0
        /** @brief Add a transition to the state.
         *
         * @param targetState The State to transitate to.
         * @param trigget Trigger that determinates when to transitate.
         * @param priotity The prority to be actived.
         * @return A reference to the transition created.
         */
        public Transition AddTransition(State targetState, TransitionTrigger trigger, int priority = 0)
        {
            // Check if the target state belong to the same layer than this.
            if (!targetState.Layer.Equals(this.Layer))
            {
                Debug.LogWarningFormat("The state {0} does not belong to the layer {1}.", targetState.Name, this.Layer.Id);
                return(null);
            }

            Transition newTransition = new Transition(targetState, trigger, priority);

            // Check if this transition alreary exists.
            if (_transitions.Contains(newTransition))
            {
                Debug.LogWarningFormat("This transition {0}-{1} does already exist.", this.Name, newTransition.TargetState.Name);
                return(null);
            }
            // Adding the transtion.
            _transitions.Add(newTransition);
            // Sorting transtions by prority.
            _transitions.Sort();
            return(newTransition);
        }
 protected bool AddTransition(string originStateName, string targetStateName, TransitionTrigger trigger, int layerId = 0, int priority = 0)
 {
     return(_agent.AddTransition(originStateName, targetStateName, trigger, layerId, priority));
 }
Esempio n. 7
0
 // Start is called before the first frame update
 void Start()
 {
     myText = GetComponent <Text>();
     sc_TT  = GameObject.Find("TransitionTrigger").GetComponent <TransitionTrigger>();
 }
Esempio n. 8
0
        /** @brief Add a transition between two states.
         *
         * @param originStateName The name of the State to transitate from.
         * @param targetStateName The name of the State to transitate to.
         * @param trigget Trigger that determinates when to transitate.
         * @param priotity The prority to be actived.
         * @return A reference to the transition created.
         */
        public Transition AddTransition(string originStateName, string targetStateName, TransitionTrigger trigger, int priority = 0)
        {
            // Check if the states exist.
            State originState = FindState(originStateName);

            if (originState == null)
            {
                Debug.LogWarningFormat("The state {0} does not exist in layer {1}.", originStateName, _id);
                return(null);
            }

            State targetState = FindState(targetStateName);

            if (targetState == null)
            {
                Debug.LogWarningFormat("The state {0} does not exist in layer {1}.", targetStateName, _id);
                return(null);
            }

            return(originState.AddTransition(targetState, trigger, priority));
        }
Esempio n. 9
0
 public TransitionItem(TransitionTrigger awaitTrigger, TransitionResult getResult)
 {
     _awaitTrigger = awaitTrigger; _getResult = getResult;
 }
Esempio n. 10
0
 /** \brief Creates a Trasition object.
  *
  * @param targetState The state which this transition transitates to.
  * @param trigger Trigger that determinates when to transitate.
  * @param priotity The prority to be actived.
  */
 public Transition(State targetState, TransitionTrigger trigger, int priority = 0)
 {
     _targetState = targetState;
     _trigger     = trigger;
     _priority    = priority;
 }
        public void AddStateMachine(StateMachineModel model)
        {
            var addedTriggers = new List <string>();
            var addedStates   = new List <string>();

            var stateMachineDefinition = new SMDefinition
            {
                Name       = model.Name,
                Agenda     = model.Agenda,
                Version    = model.Version,
                Definition = model.Definition.ToString(Formatting.None),
            };

            _context.SMDefinition.Add(stateMachineDefinition);
            _context.SaveChanges();

            var initialStateName = (string)model.Definition["initial"];
            var allObjects       = model.Definition.DescendantsAndSelf().OfType <JObject>();

            var stateTokens      = allObjects.Where(x => x.ContainsKey("kind"));
            var transitionTokens = allObjects.Where(x => x.ContainsKey("target"));
            var stateTypeId      = _context.ElementType.FirstOrDefault(x => x.Name.Equals("state")).Id;
            var transitionTypeId = _context.ElementType.FirstOrDefault(x => x.Name.Equals("transition")).Id;

            foreach (var transition in transitionTokens)
            {
                if (!addedTriggers.Contains((string)transition["event"]))
                {
                    var newTrigger = new TransitionTrigger
                    {
                        Name = (string)transition["event"]
                    };

                    addedTriggers.Add(newTrigger.Name);

                    _context.TransitionTrigger.Add(newTrigger);
                }
            }

            foreach (var state in stateTokens)
            {
                if (!addedStates.Contains((string)state["id"]))
                {
                    var newState = new Element
                    {
                        SMDefinitionId = stateMachineDefinition.Id,
                        ElementTypeId  = stateTypeId,
                        Name           = (string)state["id"]
                    };

                    addedStates.Add(newState.Name);

                    _context.Element.Add(newState);
                }
            }

            _context.SaveChanges();

            foreach (var state in stateTokens)
            {
                var childTransitionTokens = state["states"] == null
                    ? state.DescendantsAndSelf().OfType <JObject>().Where(x => x.ContainsKey("target"))
                    : state.SelectToken("transitions").Children().OfType <JObject>().Where(x => x.ContainsKey("target"));

                foreach (var childTransition in childTransitionTokens)
                {
                    var newTransition = new Element
                    {
                        ElementTypeId       = transitionTypeId,
                        SMDefinitionId      = stateMachineDefinition.Id,
                        OldStateId          = _context.Element.FirstOrDefault(x => x.ElementTypeId == stateTypeId && x.Name.Equals((string)state["id"])).Id,
                        NewStateId          = _context.Element.FirstOrDefault(x => x.ElementTypeId == stateTypeId && x.Name.Equals((string)childTransition["target"])).Id,
                        TransitionTriggerId = _context.TransitionTrigger.FirstOrDefault(x => x.Name.Equals((string)childTransition["event"])).Id
                    };

                    _context.Element.Add(newTransition);
                }
            }

            stateMachineDefinition.InitialStateId = _context.Element.FirstOrDefault(x => x.ElementTypeId == stateTypeId && x.Name.Equals(initialStateName)).Id;

            _context.SaveChanges();
        }