public void UpdatePlayerSkillState(PlayerSkillState enableSkill) { if (enablePlayerSkillState != null) { enablePlayerSkillState(enableSkill); } }
private void InitStateMachine() { blackboard = new StateBlackboard(); blackboard.Add(BlackboardKey.AttackingFlag, false); blackboard.Add(BlackboardKey.NextAttackFlag, false); blackboard.Add(BlackboardKey.SkillFlag, false); blackboard.Add(BlackboardKey.DamageFlag, false); blackboard.Add(BlackboardKey.RepeatDamageFlag, false); blackboard.Add(BlackboardKey.AnimTrigger, string.Empty); blackboard.Add <Transform>(BlackboardKey.Target, null); blackboard.Add <Vector3>(BlackboardKey.MoveDirection, Vector3.zero); SetAnimTriggerAction setIdleTriggerAction = new SetAnimTriggerAction(blackboard, animator, "Idle"); LookAtTargetAction lookAtAction = new LookAtTargetAction(blackboard, transform); PlayerIdleState idleState = new PlayerIdleState(blackboard, setIdleTriggerAction, lookAtAction); StateNode idleNode = new StateNode(idleState, new Condition(() => { return(true); })); SetAnimTriggerAction setRunTriggerAction = new SetAnimTriggerAction(blackboard, animator, "Move"); SetMoveDirectionAction setMoveDirAction = new SetMoveDirectionAction(blackboard, transform, Camera.main.transform); MoveControllerAction moveControllerAction = new MoveControllerAction(blackboard, GetComponent <CharacterController>(), runSpeed); PlayerMoveState moveState = new PlayerMoveState(blackboard, setRunTriggerAction, setMoveDirAction, moveControllerAction, 100); StateNode moveNode = new StateNode(moveState, new Condition(() => { float horizontal = inputController.GetRuntimeInputConfig().GetBinding(InputBindingName.GAMEPLAY_HORIZONTAL).Value; float vertical = inputController.GetRuntimeInputConfig().GetBinding(InputBindingName.GAMEPLAY_VERTICAL).Value; return(Mathf.Abs(horizontal) > InputConstants.INPUT_DEAD_ZONE || Mathf.Abs(vertical) > InputConstants.INPUT_DEAD_ZONE); })); SetAnimTriggerAction setAttackTrigger = new SetAnimTriggerAction(blackboard, animator, "Attack", true); SetAnimTriggerAction setNextAttackTrigger = new SetAnimTriggerAction(blackboard, animator, "NextAttack", true); PlayerAttackState attackState = new PlayerAttackState(blackboard, setAttackTrigger, setNextAttackTrigger, lookAtAction, 500); StateNode attackNode = new StateNode(attackState, new Condition(() => { return(blackboard.Get <bool>(BlackboardKey.AttackingFlag) == true); })); SetAnimTriggerAction setSkillTrigger = new SetAnimTriggerAction(blackboard, animator, BlackboardKey.AnimTrigger, true); PlayerSkillState skillState = new PlayerSkillState(blackboard, setSkillTrigger, 400); StateNode skillNode = new StateNode(skillState, new Condition(() => { return(blackboard.Get <bool>(BlackboardKey.SkillFlag) == true); })); SetAnimTriggerAction damageAction = new SetAnimTriggerAction(blackboard, animator, "Damage", true); DamageState damageState = new DamageState(blackboard, damageAction, 600); Condition damageCondition = new Condition(() => { return(blackboard.Get <bool>(BlackboardKey.DamageFlag)); }); StateNode damageNode = new StateNode(damageState, damageCondition); DeathState deathState = DeathState.Create(blackboard, animator, "Die", int.MaxValue); StateNode deathNode = new StateNode(deathState, new Condition(() => { return(!self.IsAlive); })); List <StateNode> nodes = new List <StateNode>(); nodes.Add(idleNode); nodes.Add(moveNode); nodes.Add(attackNode); nodes.Add(skillNode); nodes.Add(damageNode); nodes.Add(deathNode); stateMachine = new StateMachine(blackboard, nodes, idleState); }
public void EnableAttackMode(PlayerSkillState skill) { if (canChangeAttackMode) { attackMode = skill; GameEvents.current.UpdateBattleLog("Player mode is: " + attackMode.ToString()); } else { GameEvents.current.UpdateBattleLog(" Can't change player skill mode"); } }
public void ToggleAttackMode() { //Jos vaihdellaan kahden moden välillä //attackMode = attackMode == AttackMode.WeaponThrow ? AttackMode.SummonFamiliar : AttackMode.WeaponThrow; if ((int)attackMode < System.Enum.GetValues(typeof(PlayerSkillState)).Length - 1) { attackMode++; } else { attackMode = 0; } GameEvents.current.UpdateBattleLog("Player mode is: " + attackMode.ToString()); }
/// <summary> /// 初始化状态机 /// 状态和转换条件在这统一初始化添加 /// 默认 除了skill和fight状态 其余状态要切换到其他状态的时候 要先切换到idle状态 /// </summary> protected override void InitStateMachine() { stateDic = new Dictionary <StateID, FSMState>(); m_FSM = new FSMSystem(); idleState = new PlayerIdleState(); moveState = new PlayerMoveState(); fightState = new PlayerFightState(); skillState = new PlayerSkillState(); //attr = player.GetComponent<AttrController>(); m_FSM.attr = attr; m_FSM.AddState(idleState, this); stateDic.Add(idleState.ID, idleState); idleState.AddTransition(Transition.IsIdle, StateID.Idle); idleState.AddTransition(Transition.IsMove, StateID.Move); idleState.AddTransition(Transition.IsDeath, StateID.Death); idleState.AddTransition(Transition.IsFight, StateID.Fight); idleState.AddTransition(Transition.IsCast_Skill, StateID.Cast_Skill); idleState.AddTransition(Transition.IsRiding, StateID.Riding); idleState.AddTransition(Transition.IsVigilance, StateID.Vigilance); idleState.AddTransition(Transition.IsChatStart, StateID.ChatStart); idleState.AddTransition(Transition.IsChatEnd, StateID.ChatEnd); m_FSM.AddState(moveState, this); stateDic.Add(moveState.ID, moveState); moveState.AddTransition(Transition.IsIdle, StateID.Idle); m_FSM.AddState(fightState, this); stateDic.Add(fightState.ID, fightState); fightState.AddTransition(Transition.IsIdle, StateID.Idle); fightState.AddTransition(Transition.IsCast_Skill, StateID.Cast_Skill); fightState.AddTransition(Transition.IsMove, StateID.Move); m_FSM.AddState(skillState, this); stateDic.Add(skillState.ID, skillState); skillState.AddTransition(Transition.IsIdle, StateID.Idle); skillState.AddTransition(Transition.IsFight, StateID.Fight); //初始状态分主城(Idle)和地下城(Fight) //设置初始状态(idle状态) if (AttrController.Instance.Fight()) { m_FSM.SetCurrentState(fightState); m_FSM.CurrentState.m_MyJoystick = ETCInput.GetControlJoystick("MyJoystick"); //m_FSM.attr.StartCoroutine(fightState.DoLogic()); } else { m_FSM.SetCurrentState(idleState); m_FSM.CurrentState.m_MyJoystick = ETCInput.GetControlJoystick("MyJoystick"); } //m_FSM.attr.StartCoroutine(idleState.DoLogic()); //idleState.RunLogic(); //测试战斗状态 //m_FSM.SetCurrentState(fightState); //m_FSM.CurrentState.m_MyJoystick = ETCInput.GetControlJoystick("MyJoystick"); //m_FSM.attr.StartCoroutine(fightState.DoLogic()); }
//NPC有两个状态分别是在路径中巡逻和追逐玩家 //如果他在第一个状态并且SawPlayer 过度状态被出发了,它就转变到ChasePlayer状态 //如果他在ChasePlayer状态并且LostPlayer状态被触发了,它就转变到FollowPath状态 private void MakeFSM()//建造状态机 { PlayerIdleState idle = new PlayerIdleState(); idle.AddTransition(Transition.FreeWalk, StateID.Walk); idle.AddTransition(Transition.Dead, StateID.Dead); idle.AddTransition(Transition.Acct, StateID.Acct); idle.AddTransition(Transition.Skill, StateID.Skill); idle.AddTransition(Transition.CrashPlayer, StateID.CrashPlayer); PlayerWalkState walk = new PlayerWalkState(); walk.AddTransition(Transition.FreeWalk, StateID.Walk); walk.AddTransition(Transition.Acct, StateID.Acct); walk.AddTransition(Transition.Skill, StateID.Skill); walk.AddTransition(Transition.Dead, StateID.Dead); walk.AddTransition(Transition.Idle, StateID.Idle); walk.AddTransition(Transition.CrashPlayer, StateID.CrashPlayer); PlayerDeadState dead = new PlayerDeadState(); dead.AddTransition(Transition.Dead, StateID.Dead); dead.AddTransition(Transition.Idle, StateID.Idle); dead.AddTransition(Transition.FreeWalk, StateID.Walk); PlayerAcceState acce = new PlayerAcceState(); acce.AddTransition(Transition.Acct, StateID.Acct); acce.AddTransition(Transition.Skill, StateID.Skill); acce.AddTransition(Transition.FreeWalk, StateID.Walk); acce.AddTransition(Transition.Dead, StateID.Dead); acce.AddTransition(Transition.Idle, StateID.Idle); acce.AddTransition(Transition.CrashPlayer, StateID.CrashPlayer); PlayerSkillState skill = new PlayerSkillState(); skill.AddTransition(Transition.Skill, StateID.Skill); skill.AddTransition(Transition.Acct, StateID.Acct); skill.AddTransition(Transition.FreeWalk, StateID.Walk); skill.AddTransition(Transition.Dead, StateID.Dead); skill.AddTransition(Transition.Idle, StateID.Idle); skill.AddTransition(Transition.CrashPlayer, StateID.CrashPlayer); //PlayerSwitchState sw = new PlayerSwitchState(); //sw.AddTransition(Transition.Skill, StateID.Skill); //sw.AddTransition(Transition.Acct, StateID.Acct); //sw.AddTransition(Transition.FreeWalk, StateID.Walk); //sw.AddTransition(Transition.Dead, StateID.Dead); //sw.AddTransition(Transition.Idle, StateID.Idle); //sw.AddTransition(Transition.CrashPlayer, StateID.CrashPlayer); PlayerCrashState crash = new PlayerCrashState(); crash.AddTransition(Transition.Skill, StateID.Skill); crash.AddTransition(Transition.Acct, StateID.Acct); crash.AddTransition(Transition.FreeWalk, StateID.Walk); crash.AddTransition(Transition.Dead, StateID.Dead); crash.AddTransition(Transition.Idle, StateID.Idle); Fsm = new FSMSystem(); Fsm.AddState(idle); Fsm.AddState(walk); Fsm.AddState(acce); Fsm.AddState(skill); Fsm.AddState(dead); //Fsm.AddState(sw); Fsm.AddState(crash); }