using System.Collections; using System.Collections.Generic; using UnityEngine; public partial class SaionjiScript : MonoBehaviour { /// /// ability system /// AbilitySystem m_AbilitySystem = new AbilitySystem(); ConditionBase Not(ConditionBase cond) { return new ConditionNot(cond); } ConditionBase And(ConditionBase c1, ConditionBase c2) { return new ConditionAnd(c1, c2); } ConditionBase Or(ConditionBase c1, ConditionBase c2) { return new ConditionOr(c1,c2); } /// /// 设置abilities /// void SetupAbilities() { // abilities IdleAbility idle = new IdleAbility(animator, Anim_Idle); MoveAbility move = new MoveAbility(animator, Anim_Run); MoveAbility dash = new MoveAbility(animator, Anim_Run); AttackAbility attk1 = new AttackAbility(animator, Anim_LightAttack1); AttackAbility attk2 = new AttackAbility(animator, Anim_LightAttack2); AttackAbility attk3 = new AttackAbility(animator, Anim_LightAttack3); AttackAbility attk4 = new AttackAbility(animator, Anim_LightAttack4); AttackAbility attk5 = new AttackAbility(animator, Anim_LightAttack5); // actions ActionTurn180 turn180 = new ActionTurn180(this.transform); ActionTowardLeft towardLeft = new ActionTowardLeft(this.transform); ActionTowardRight towardRight = new ActionTowardRight(this.transform); ActionSwitchAbility switchToMove = new ActionSwitchAbility(m_AbilitySystem, move); ActionSwitchAbility switchToIdle = new ActionSwitchAbility(m_AbilitySystem, idle); ActionSwitchAbility switchToAttk1 = new ActionSwitchAbility(m_AbilitySystem, attk1); ActionSwitchAbility switchToAttk2 = new ActionSwitchAbility(m_AbilitySystem, attk2); ActionSwitchAbility switchToAttk3 = new ActionSwitchAbility(m_AbilitySystem, attk3); ActionSwitchAbility switchToAttk4 = new ActionSwitchAbility(m_AbilitySystem, attk4); ActionSwitchAbility switchToAttk5 = new ActionSwitchAbility(m_AbilitySystem, attk5); // conditions ConditionCommand condLeftCmd = new ConditionCommand(GamepadButton.Left); ConditionCommand condRightCmd = new ConditionCommand(GamepadButton.Right); ConditionNoMoveButtonHold condNoMoveButtonHold = new ConditionNoMoveButtonHold(); ConditionButtonHold condRightButtonHold = new ConditionButtonHold(GamepadButton.Right); ConditionButtonHold condLeftButtonHold = new ConditionButtonHold(GamepadButton.Left); ConditionCommand condCircleCmd = new ConditionCommand(GamepadButton.Circle); ConditionTowardLeft condTowardLeft = new ConditionTowardLeft(this.transform); ConditionTowardRight condTowardRight = new ConditionTowardRight(this.transform); // common triggers Trigger triggerTurnRight = new Trigger(condRightCmd, towardRight); Trigger triggerTurnLeft = new Trigger(condLeftCmd, towardLeft); Trigger trigger = null; // idle ability trigger = new Trigger(condRightCmd, new List { switchToMove, towardRight}); idle.AddTrigger(trigger); trigger = new Trigger(condLeftCmd, new List { switchToMove, towardLeft}); idle.AddTrigger(trigger); trigger = new Trigger(condCircleCmd, switchToAttk1); idle.AddTrigger(trigger); trigger = new Trigger(condLeftCmd, turn180); idle.AddTrigger(trigger); // move ability trigger = new Trigger(And(condTowardRight, Not(condRightButtonHold)), switchToIdle); move.AddTrigger(trigger); trigger = new Trigger(And(condTowardLeft, Not(condLeftButtonHold)), switchToIdle); move.AddTrigger(trigger); trigger = new Trigger(condCircleCmd, switchToAttk1); move.AddTrigger(trigger); // attack abilities float expireTime = 0.3f; ConditionAnimAtEnd condAttk1AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack1); trigger = new Trigger(And(condAttk1AtEnd, condCircleCmd), switchToAttk2); attk1.AddTrigger(trigger); ConditionAttkExpireTime condAttk1ExpireTime = new ConditionAttkExpireTime(attk1, expireTime); trigger = new Trigger(condAttk1ExpireTime, switchToIdle); attk1.AddTrigger(trigger); attk1.AddTrigger(triggerTurnRight); attk1.AddTrigger(triggerTurnLeft); ConditionAnimAtEnd condAttk2AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack2); trigger = new Trigger(And(condAttk2AtEnd, condCircleCmd), switchToAttk3); attk2.AddTrigger(trigger); ConditionAttkExpireTime condAttk2ExpireTime = new ConditionAttkExpireTime(attk2, expireTime); trigger = new Trigger(condAttk2ExpireTime, switchToIdle); attk2.AddTrigger(trigger); attk2.AddTrigger(triggerTurnRight); attk2.AddTrigger(triggerTurnLeft); ConditionAnimAtEnd condAttk3AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack3); trigger = new Trigger(And(condAttk3AtEnd, condCircleCmd), switchToAttk4); attk3.AddTrigger(trigger); ConditionAttkExpireTime condAttk3ExpireTime = new ConditionAttkExpireTime(attk3, expireTime); trigger = new Trigger(condAttk3ExpireTime, switchToIdle); attk3.AddTrigger(trigger); attk3.AddTrigger(triggerTurnRight); attk3.AddTrigger(triggerTurnLeft); ConditionAnimAtEnd condAttk4AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack4); trigger = new Trigger(And(condAttk4AtEnd, condCircleCmd), switchToAttk5); attk4.AddTrigger(trigger); ConditionAttkExpireTime condAttk4ExpireTime = new ConditionAttkExpireTime(attk4, expireTime); trigger = new Trigger(condAttk4ExpireTime, switchToIdle); attk4.AddTrigger(trigger); attk4.AddTrigger(triggerTurnRight); attk4.AddTrigger(triggerTurnLeft); ConditionAnimAtEnd condAttk5AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack5); trigger = new Trigger(condAttk5AtEnd, switchToIdle); attk5.AddTrigger(trigger); ConditionAttkExpireTime condAttk5ExpireTime = new ConditionAttkExpireTime(attk5, expireTime); trigger = new Trigger(condAttk5ExpireTime, switchToIdle); attk5.AddTrigger(trigger); attk5.AddTrigger(triggerTurnRight); attk5.AddTrigger(triggerTurnLeft); m_AbilitySystem.ForceStart(idle); } }