/// <summary> /// Gets the nodes and represents them. /// </summary> public override void SetGraphNodes() { foreach (FSMState state in this.Configuration.ArrayOfFSMState) { CustomVertex vertex = new CustomVertex(state.Name, Colors.Wheat, true); this.MyGraph.AddVertex(vertex); } FSMTrigger t = new FSMTrigger(); try { foreach (FSMState state in this.Configuration.ArrayOfFSMState) { foreach (AllowedTrigger trigger in state.ArrayOfAllowedTrigger) { t = this.Configuration.FoundTriggerInList(trigger); if (string.IsNullOrEmpty(trigger.TriggerName)) { this.MyGraph.AddNewEdge(trigger.StateAndTriggerName, this.MyGraph.GetVertexByName(state.Name), this.MyGraph.GetVertexByName(trigger.StateAndTriggerName)); } else { this.MyGraph.AddNewEdge(trigger.TriggerName, this.MyGraph.GetVertexByName(state.Name), this.MyGraph.GetVertexByName(trigger.StateName)); } } } } catch (Exception ex) { Console.WriteLine(ex.Message); } }
protected virtual void Awake() { _trigger = gameObject.AddComponent <FSMTrigger>(); _trigger.OnTriggerEnter.AddListener((ent) => { if (!EntityEnabled) { return; } Fire("OnStartTouch"); OnStartTouch(ent); }); _trigger.OnTriggerExit.AddListener((ent) => { if (!EntityEnabled) { return; } Fire("OnEndTouch"); OnEndTouch(ent); }); _trigger.OnTriggerStay.AddListener((ent) => { if (!EntityEnabled) { return; } OnTouch(ent); }); }
//状态机调用 public void AddMap(FSMTriggerID triggerID, FSMStateID stateID) { map.Add(triggerID, stateID); Type type = Type.GetType(triggerID + "Trigger"); FSMTrigger trigger = Activator.CreateInstance(type) as FSMTrigger; Triggers.Add(trigger); }
private void CreateTriggerObject(string triggerName) { //例如:没有血量条件 //策划配置:NoHealth //程序类名:NoHealthTrigger //命名空间.类名 string className = "Voice." + triggerName + "Trigger"; Type type = Type.GetType(className); FSMTrigger <T> obj = Activator.CreateInstance(type) as FSMTrigger <T>; //为条件对象提供状态机引用 obj.Init(fsm); triggers.Add(obj); }
/* * public string[] AllStates * { * get * { * List<string> _ret = new List<string>(); * _ret.AddRange(states); * foreach (int _key in start.Keys) * { * _ret.Add(start[_key]); * } * foreach (int _key in end.Keys) * { * _ret.AddRange(end[_key]); * } * return _ret.ToArray(); * } * } */ public FSMSimpleSyntax(string FSMDefinition) { numberOfMachines = 1; Ignores = new List <FSMIgnore>(); Transitions = new List <FSMTransition>(); Operators = new Dictionary <string, FSMOperator>(); string[] _lines = FSMDefinition.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); Errors = new List <string>(); foreach (string _line in _lines) { var _parsedLine = ParseSimpleSyntaxLine(_line); if (_parsedLine != null) { #region START-STATE if (_parsedLine.Command.RemoveWhitespace().ToLower().StartsWith("start", StringComparison.OrdinalIgnoreCase)) { List <string> _startStates = _parsedLine.GetStateList1; int _machineIndex = _parsedLine.Index; if (_machineIndex > numberOfMachines) { numberOfMachines = _machineIndex; } if (!start.ContainsKey(_machineIndex - 1)) { start.Add(_machineIndex - 1, ""); } if (!states.ContainsKey(_machineIndex - 1)) { states.Add(_machineIndex - 1, new List <string>()); } if (_startStates.Count == 1 && start[_machineIndex - 1] == "") { start[_machineIndex - 1] = _startStates[0]; if (!states[_machineIndex - 1].Contains(_startStates[0])) { states[_machineIndex - 1].Add(_startStates[0]); } } else { Errors.Add("More than one start state defined."); } } #endregion #region END-STATES if (_parsedLine.Command.RemoveWhitespace().ToLower().StartsWith("end", StringComparison.OrdinalIgnoreCase)) { List <string> _endStates = _parsedLine.GetStateList1; int _machineIndex = _parsedLine.Index; if (_machineIndex > numberOfMachines) { numberOfMachines = _machineIndex; } if (!end.ContainsKey(_machineIndex)) { end.Add(_machineIndex, new string[] { }); } end[_machineIndex] = _endStates.ToArray(); if (!states.ContainsKey(_machineIndex - 1)) { states.Add(_machineIndex - 1, new List <string>()); } foreach (string s in _endStates) { if (!states[_machineIndex - 1].Contains(s)) { states[_machineIndex - 1].Add(s); } } } #endregion #region TRANSITIONS if (_parsedLine.Command.RemoveWhitespace().ToLower().StartsWith("transition", StringComparison.OrdinalIgnoreCase)) { int _machineIndex = _parsedLine.Index; if (_machineIndex > numberOfMachines) { numberOfMachines = _machineIndex; } List <string> _listOfFromStates = _parsedLine.GetStateList1; List <string> _lisOfToStates = _parsedLine.GetStateList2; if (_parsedLine.Trigger == "") { _parsedLine.Trigger = "EventName="; } List <string> _listOfTriggerStrings = _parsedLine.Trigger.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList <string>(); List <string> _guards = _parsedLine.Guard.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList <string>(); List <string> _operators = _parsedLine.Operator.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList <string>(); if (!states.ContainsKey(_machineIndex - 1)) { states.Add(_machineIndex - 1, new List <string>()); } foreach (string _trigger in _listOfTriggerStrings) { FSMTrigger _fsmtrigger = new FSMTrigger(_trigger.Trim(), _parsedLine.Guard, _parsedLine.Operator, _machineIndex - 1, ""); if (!triggers.ContainsKey(_fsmtrigger.GetTriggerName)) { triggers.Add(_fsmtrigger.GetTriggerName, _fsmtrigger); } else { _fsmtrigger = triggers[_fsmtrigger.GetTriggerName]; } foreach (string _from in _listOfFromStates) { if (!_fsmtrigger.States.Contains(_from + "_logfsm_id_" + (_machineIndex - 1))) { _fsmtrigger.States.Add(_from + "_logfsm_id_" + (_machineIndex - 1)); } FSMOperator _fsmoperator = new FSMOperator() { OperatorString = _parsedLine.Operator, State = _from, TriggerName = _fsmtrigger.GetTriggerName, MachineIndex = _machineIndex - 1 }; string _key = _fsmoperator.GetKey.RemoveWhitespace() + CreateValidIdentifier(_parsedLine.Guard); if (!Operators.ContainsKey(_key)) { Operators.Add(_key, _fsmoperator); } else { Errors.Add("Operator already defined (state: " + _from + ", trigger: " + _parsedLine.Trigger.Trim() + ", machine: " + _machineIndex + ")"); } foreach (string _to in _lisOfToStates) { if (_from.Trim() != _to.Trim()) { FSMTransition _t = new FSMTransition() { MachineIndex = _machineIndex - 1, From = _from.Trim(), To = _to.Trim() }; if (!states[_machineIndex - 1].Contains(_from.Trim())) { states[_machineIndex - 1].Add(_from.Trim()); } if (!states[_machineIndex - 1].Contains(_to.Trim())) { states[_machineIndex - 1].Add(_to.Trim()); } _t.Triggers.Add(_fsmtrigger); Transitions.Add(_t); } else { FSMIgnore _i = new FSMIgnore() { MachineIndex = _machineIndex - 1, State = _from.Trim(), }; if (!states[_machineIndex - 1].Contains(_from.Trim())) { states[_machineIndex - 1].Add(_from.Trim()); } _i.Triggers.Add(_fsmtrigger); Ignores.Add(_i); } } } } } #endregion #region IGNORE if (_parsedLine.Command.RemoveWhitespace().ToLower().StartsWith("ignore", StringComparison.OrdinalIgnoreCase)) { int _machineIndex = _parsedLine.Index; if (_machineIndex > numberOfMachines) { numberOfMachines = _machineIndex; } List <string> _listOfIgnoredStates = _parsedLine.GetStateList1; List <string> _listOfTriggerStrings = _parsedLine.Trigger.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList <string>(); List <string> _guards = _parsedLine.Guard.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList <string>(); List <string> _operators = _parsedLine.Operator.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList <string>(); if (!states.ContainsKey(_machineIndex - 1)) { states.Add(_machineIndex - 1, new List <string>()); } foreach (string _trigger in _listOfTriggerStrings) { FSMTrigger _fsmtrigger = new FSMTrigger(_trigger.Trim(), _parsedLine.Guard, _parsedLine.Operator, _machineIndex - 1, ""); if (!triggers.ContainsKey(_fsmtrigger.GetTriggerName)) { triggers.Add(_fsmtrigger.GetTriggerName, _fsmtrigger); } else { _fsmtrigger = triggers[_fsmtrigger.GetTriggerName]; } foreach (string _state in _listOfIgnoredStates) { if (!_fsmtrigger.States.Contains(_state + "_logfsm_id_" + (_machineIndex - 1))) { _fsmtrigger.States.Add(_state + "_logfsm_id_" + (_machineIndex - 1)); } FSMOperator _fsmoperator = new FSMOperator() { OperatorString = _parsedLine.Operator, State = _state, TriggerName = _fsmtrigger.GetTriggerName, MachineIndex = _machineIndex - 1 }; string _key = _fsmoperator.GetKey; if (!Operators.ContainsKey(_key)) { Operators.Add(_key, _fsmoperator); } else { Errors.Add("Operator already defined (state: " + _state + ", trigger: " + _parsedLine.Trigger.Trim() + ", machine: " + _machineIndex + ")"); } FSMIgnore _i = new FSMIgnore() { MachineIndex = _machineIndex - 1, State = _state.Trim(), }; if (!states[_machineIndex - 1].Contains(_state.Trim())) { states[_machineIndex - 1].Add(_state.Trim()); } _i.Triggers.Add(_fsmtrigger); Ignores.Add(_i); } } } #endregion } else { Errors.Add("Error parsing line:" + _line); } } }
public FSMSequence AddNewStep(FSMSequence sequence, string steppTrigger) { FSMStep step = new FSMStep(); FSMTrigger triig = new FSMTrigger(); triig = this.Configuration.FoundStringTriggerList(steppTrigger); if (string.IsNullOrEmpty(triig.SequenceID)) { step.Name = triig.CommonID; } else { step.Name = triig.SequenceID; } step.Weight = "2"; step.TimeoutInSeconds = " 2"; if (!string.IsNullOrEmpty(step.Name)) { sequence.ArrayOfStep.Add(step); } return sequence; }
/// <summary> /// Adds a new edge, a new allowed trigger to source vertex, a new trigger if it doesn't exist. /// </summary> /// <param name="vertexFrom">The vertex from.</param> /// <param name="trigger">The trigger.</param> /// <param name="vertexTo">The vertex to.</param> public override void AddNewEdge(CustomVertex vertexFrom, string trigger, CustomVertex vertexTo) { FSMState state = new FSMState(); FSMControl.DomainModel.FirstVersion.AllowedTrigger aw = new FSMControl.DomainModel.FirstVersion.AllowedTrigger(); FSMTrigger trig = new FSMTrigger(); state.Name = vertexFrom.Text; if (string.IsNullOrEmpty(trigger)) { this.MyGraph.AddNewEdge(vertexTo.Text, vertexFrom, vertexTo); aw.StateAndTriggerName = trig.CommonID = vertexTo.Text; } else { this.MyGraph.AddNewEdge(vertexTo.Text, vertexFrom, vertexTo); aw.StateName = vertexTo.Text; aw.TriggerName = trigger; trig.Name = vertexTo.Text; trig.SequenceID = trigger; } foreach (var item in this.Configuration.ArrayOfFSMState) { if (item.Name == state.Name) { if (item.ArrayOfAllowedTrigger == null) { item.ArrayOfAllowedTrigger = new Collection<FSMControl.DomainModel.FirstVersion.AllowedTrigger>(); } item.ArrayOfAllowedTrigger.Add(aw); break; } } this.Configuration.AddNewTrigger(trig); }