public void ChangeState(Type stateType) { if (stateDic.ContainsKey(stateType)) { BaseFSM <T> fsm = stateDic[stateType]; if (fsm != null) { currentStateType = stateType; previousState = currentState; currentState = fsm; currentState.Begin(); } } }
protected override bool Evaluate(BaseFSM fsm) { if (fsm.targetPlayer == null) { return(false); } //玩家离开攻击范围 if (Vector3.Distance(fsm.transform.position, fsm.targetPlayer.transform.position) > fsm.sightDistance) { return(true); } return(false); }
/// <summary> /// 检查子条件 /// </summary> /// <param name="fsm"></param> /// <returns></returns> protected bool CheckSubTriggers(BaseFSM fsm) { if (subTriggers.Count == 0) { return(true); } for (int i = 0; i < subTriggers.Count; i++) { if (subTriggers[i].Evaluate(fsm)) { return(true); } } return(false); }
private Quaternion Look(BaseFSM FSM) { //Ray ray = new Ray(GameTool.FindTheChild(FSM.gameObject, "RigLArmPalmGizmo").position, new Vector3(Screen.width / 2, Screen.height / 2, 0)); Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0)); RaycastHit hitInfo; Vector3 targetPoint; if (Physics.Raycast(ray, out hitInfo)) { targetPoint = hitInfo.point; } else { targetPoint = Camera.main.transform.forward * 100; } return Quaternion.LookRotation(targetPoint - GameTool.FindTheChild(FSM.gameObject, "RigLArmPalmGizmo").position); }
public void Pause(bool isPaused) { if (isPaused) { if (currentState.GetType() != typeof(DeactivationState)) { previousState = currentState; ChangeState(typeof(DeactivationState)); } } else { if (currentState.GetType() == typeof(DeactivationState)) { ChangeState(previousState.GetType()); } } }
public override void Reason(BaseFSM FSM) { CharacterMessageDispatcher.Instance.DispatchMesssage (FSMTransitionType.IsIdle, FSM, FSM.animationManager.baseStateInfo.IsName("Idle") && FSM.animationManager.attackStateInfo.normalizedTime > 1.15f ); if (Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.DoubleHands) { FSM.Attacked = true; FSM.PerformTransition(FSMTransitionType.AttackWithDoubleHands); } CharacterMessageDispatcher.Instance.DispatchMesssage (FSMTransitionType.CanBeMove, FSM, (Mathf.Abs(Input.GetAxis("Horizontal")) > 0.5 || Mathf.Abs(Input.GetAxis("Vertical")) > 0.5) && FSM.controller.CC.isGrounded ); }
public override void Act(BaseFSM FSM) { if (FSM.controller.GetCurSelectedWeaponInfo() != null) { attackDistance = FSM.controller.GetCurSelectedWeaponInfo().weaponProperties.weaponLength; } if (FSM.Attacked) { foreach (KeyValuePair <string, NetworkPlayer> enemy in FSM.controller.ScenePlayers) { if (FSM.controller.CheckCanAttack(FSM.gameObject, enemy.Value.gameObject, attackDistance, 45)) { NetworkManager.SendPlayerHitSomeone(enemy.Value.name, FSM.characterStatus.Attack_Physics * (1 - enemy.Value.status.Defend_Physics / 100)); AudioManager.PlaySound2D("Spear").Play(); } } FSM.animationManager.PlayAnimation("Spear Melee Attack 02"); FSM.Attacked = false; } }
public override void Reason(BaseFSM FSM) { if (!FSM.animationManager.baseStateInfo.IsName("Idle") && FSM.animationManager.attackStateInfo.normalizedTime > 1f) { FSM.animationManager.combo = 0; FSM.animationManager.PlayAnimation("AttackID", 0); FSM.PerformTransition(FSMTransitionType.IsIdle); } if (Input.GetButtonDown("Fire1")) { FSM.Attacked = true; } CharacterMessageDispatcher.Instance.DispatchMesssage (FSMTransitionType.CanBeMove, FSM, (Mathf.Abs(Input.GetAxis("Horizontal")) > 0.5 || Mathf.Abs(Input.GetAxis("Vertical")) > 0.5) && FSM.controller.CC.isGrounded ); }
/// <summary>Remove FSM from list</summary> protected static void RemoveFSM(BaseFSM fsm) { if (first == fsm) { first = fsm.nextFsm; // remove first } else { // not head of list if (fsm.nextFsm != null) { fsm.prevFsm.nextFsm = fsm.nextFsm; fsm.nextFsm.prevFsm = fsm.prevFsm; } else if (fsm.prevFsm != null) { fsm.prevFsm.nextFsm = null; } } fsm.prevFsm = null; fsm.nextFsm = null; }
public virtual BaseFSM Clone() { BaseFSM cfsm = new BaseFSM(); cfsm.name = m_name; foreach (BaseState snode in m_stateNodes) { BaseState cnode = snode.Clone(); cnode.curFSM = cfsm; cfsm.states.Add(snode); } BaseState defaultNode = cfsm.FindChildState(m_defaultNode.name); if (defaultNode != null) { //设置当前默认状态 cfsm.currentState = defaultNode; cfsm.defaultNode = defaultNode; } return(cfsm); }
public override void EnterState(BaseFSM fsm) { //播放死亡动画 fsm.PlayeAnimation(fsm.animParams.Dead); }
/// <summary> /// 目标是否在攻击范围内 /// </summary> protected override bool Evaluate(BaseFSM fsm) { return(Vector3.Distance(fsm.transform.position, fsm.targetPlayer.position) <= fsm.chStatus.attackDistance); }
public override void Action(BaseFSM fsm) { //播待机动画 fsm.PlayeAnimation(fsm.animParams.Idle); }
public override void EnterState(BaseFSM fsm) { }
public override void Act(BaseFSM FSM) { FSM.PlayAnimation("Jump"); FSM.controller.Jump(FSM.characterStatus.jumpSpeed); }
void LateUpdate() { BaseFSM.StartAllNextStates(); }
public void SetFSM(string fsmName, BaseFSM fsm) { m_fsmDict[fsmName] = fsm; }
public CharacterMessage(FSMTransitionType msg, BaseFSM rid, bool con) { Msg = msg; Receiver = rid; condition = con; }
public override void ExitState(BaseFSM fsm) { }
public override void Action(BaseFSM fsm) { }
public void LoadFSMTemplate(XmlNode fsmNode) { Assembly assembly = Assembly.GetExecutingAssembly(); if (fsmNode == null || fsmNode.Name != "FSM") { return; } object fsmObj = assembly.CreateInstance(fsmNode.Attributes.GetNamedItem("type").Value); if (fsmObj != null) { BaseFSM bfsm = fsmObj as BaseFSM; bfsm.name = fsmNode.Attributes.GetNamedItem("name").Value; switch (bfsm.type) { case EFSM_TYPE.EFSM_DEFAULT_FSM: { } break; case EFSM_TYPE.EFSM_ENTITY_FSM: { } break; } //先将所有节点生成一遍,再设置连接关系 XmlNodeList stateNodes = fsmNode.ChildNodes; for (int i = 0; i < stateNodes.Count; i++) { XmlNode stateNode = stateNodes[i]; if (stateNode.Name != null && stateNode.Name == "StateNode") { //string t = typeof(EntityAnimationState).ToString(); //object stateObj = assembly.CreateInstance(t); object stateObj = assembly.CreateInstance(stateNode.Attributes.GetNamedItem("type").Value); if (stateObj != null) { BaseState state = stateObj as BaseState; state.name = stateNode.Attributes.GetNamedItem("name").Value; state.curFSM = bfsm; int duration = 0; int.TryParse(stateNode.Attributes.GetNamedItem("duration").Value, out duration); state.durationTick = duration; switch (state.type) { case EStateType.EStateType_LoginEntiy: { } break; case EStateType.EStateType_EntityAnimation: { EntityAnimationState animState = state as EntityAnimationState; animState.animantioName = stateNode.Attributes.GetNamedItem("AnimationType").Value; float speed = 0; float.TryParse(stateNode.Attributes.GetNamedItem("AnimationSpeed").Value, out speed); animState.animationSpeed = speed; int loopCount = 0; int.TryParse(stateNode.Attributes.GetNamedItem("loopCount").Value, out loopCount); animState.loopCount = loopCount; } break; } for (int j = 0; j < stateNode.ChildNodes.Count; j++) { XmlNode linkNode = stateNode.ChildNodes[j]; object linkObj = assembly.CreateInstance("StateLink"); if (linkObj != null) { StateLink link = linkObj as StateLink; object linkKey = Enum.Parse(typeof(EActionType), linkNode.Attributes.GetNamedItem("actionId").Value); if (linkKey != null) { link.linkID = (int)linkKey; link.linkStateName = linkNode.Attributes.GetNamedItem("linkStateName").Value; state.links.Add((int)linkKey, link); } } bfsm.AddStateNode(state); } } } } object defaultNode = bfsm.FindChildState(fsmNode.Attributes.GetNamedItem("defaultNode").Value); if (defaultNode != null) { bfsm.defaultNode = defaultNode as BaseState; } //设置连接关系 //foreach (XmlNode stateNode in fsmNode.ChildNodes) for (int i = 0; i < stateNodes.Count; i++) { XmlNode stateNode = stateNodes[i]; BaseState state = bfsm.FindChildState(stateNode.Attributes.GetNamedItem("name").Value); object outstate = bfsm.FindChildState(stateNode.Attributes.GetNamedItem("outState").Value); if (outstate != null) { state.timeOutState = outstate as BaseState; } } //添加到FSM表 m_fsmTemplates[bfsm.name] = bfsm; } }
public override void Act(BaseFSM FSM) { FSM.PlayAnimation("Run"); FSM.controller.Move(FSM.characterStatus.moveSpeed, FSM.characterStatus.jumpSpeed); }
public override void Reason(BaseFSM FSM) { if ((Mathf.Abs(Input.GetAxis("Horizontal")) > 0.5 || Mathf.Abs(Input.GetAxis("Vertical")) > 0.5)) { FSM.PerformTransition(FSMTransitionType.CanBeMove); } if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonUp("PickUp") && FSM.isFound) { FSM.picked = true; FSM.PerformTransition(FSMTransitionType.CanPickUp); } if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && (FSM.characterStatus.weaponType == WeaponType.Sword || FSM.characterStatus.weaponType == WeaponType.Club)) { FSM.Attacked = true; FSM.PerformTransition(FSMTransitionType.AttackWithSingleWield); } if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.DoubleHands) { FSM.Attacked = true; FSM.PerformTransition(FSMTransitionType.AttackWithDoubleHands); } if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.NULL && FSM.characterStatus.magicType == MagicType.Ripple) { FSM.PerformTransition(FSMTransitionType.UsingRipple); } if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.NULL && FSM.characterStatus.magicType == MagicType.HeartAttack) { FSM.PerformTransition(FSMTransitionType.UsingHeartAttack); } if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.NULL && FSM.characterStatus.magicType == MagicType.StygianDesolator) { FSM.PerformTransition(FSMTransitionType.UsingStygianDesolator); } if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.NULL && FSM.characterStatus.magicType == MagicType.IceArrow) { FSM.PerformTransition(FSMTransitionType.UsingIceArrow); } if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.NULL && FSM.characterStatus.magicType == MagicType.ChoshimArrow) { FSM.PerformTransition(FSMTransitionType.UsingChoshimArrow); } if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.NULL && FSM.characterStatus.magicType == MagicType.Thunderbolt) { FSM.PerformTransition(FSMTransitionType.UsingThunderBolt); } if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.Spear) { FSM.Attacked = true; FSM.PerformTransition(FSMTransitionType.AttackWithSpear); } if (FSM.transform.position.y > 10) { FSM.PerformTransition(FSMTransitionType.Falling); } }
public override bool HandleTrigger(BaseFSM fsm) { return(fsm.playerTF.GetComponent <CharacterStatus>().HP <= 0); }
public override bool HandleTrigger(BaseFSM fsm) { return(fsm.IsPatrolComplete); }
/// <summary> /// 进入状态时 /// </summary> /// <param name="fsm"></param> public abstract void EnterState(BaseFSM fsm);
public override void Act(BaseFSM FSM) { MessageCenter.AddListener(EMessageType.UseItem, (object obj) => { itemID = (int)obj; }); FSM.GetComponent <PlayerBag>().UseItem(itemID); }
/// <summary> /// 离开状态时 /// </summary> /// <param name="fsm"></param> public abstract void ExitState(BaseFSM fsm);
public override void ExitState(BaseFSM fsm) { //停止移动 fsm.StopMove(); }
/// <summary> /// 持续状态时,执行的主要行为 /// </summary> /// <param name="fsm"></param> public abstract void Action(BaseFSM fsm);