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_DashWithSword); 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); AttackAbility sideKick = new AttackAbility(animator, Anim_SideKick); AttackAbility superKick = new AttackAbility(animator, Anim_SuperKick); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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); ActionSwitchAbility switchToSideKick = new ActionSwitchAbility(m_AbilitySystem, sideKick); ActionSwitchAbility switchToDash = new ActionSwitchAbility(m_AbilitySystem, dash); ActionSwitchAbility switchToSuperKick = new ActionSwitchAbility(m_AbilitySystem, superKick); ActionWipeCmdRecord wipeCmdRecord = new ActionWipeCmdRecord(); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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); ConditionCommand condCrossCmd = new ConditionCommand(GamepadButton.Cross); ConditionTowardLeft condTowardLeft = new ConditionTowardLeft(this.transform); ConditionTowardRight condTowardRight = new ConditionTowardRight(this.transform); ConditionCommandSeq condRight2Cmd = new ConditionCommandSeq(new List{GamepadButton.Right, GamepadButton.Right }, 1f); ConditionCommandSeq condLeft2Cmd = new ConditionCommandSeq(new List { GamepadButton.Left, GamepadButton.Left }, 1f); ConditionCommandSeq condDRC = new ConditionCommandSeq(new List { GamepadButton.Down, GamepadButton.Right, GamepadButton.Circle}, 1f); ConditionCommandSeq condDLC = new ConditionCommandSeq(new List { GamepadButton.Down, GamepadButton.Left, GamepadButton.Circle}, 1f); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // common triggers //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Trigger triggerTurnRight = new Trigger(And(condRightCmd, Not(condTowardRight)), towardRight); Trigger triggerTurnLeft = new Trigger(And(condLeftCmd, Not(condTowardLeft)), towardLeft); Trigger trigger = null; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ability setup //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // idle ability trigger = new Trigger(And(condTowardRight, condDRC), new List { wipeCmdRecord, switchToSuperKick }); idle.AddTrigger(trigger); trigger = new Trigger(And(condTowardLeft, condDLC), new List { wipeCmdRecord, switchToSuperKick }); idle.AddTrigger(trigger); trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List { wipeCmdRecord , switchToDash }); idle.AddTrigger(trigger); trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List { wipeCmdRecord , switchToDash }); idle.AddTrigger(trigger); trigger = new Trigger(And(condRightButtonHold, Not(condRight2Cmd)), new List { switchToMove, towardRight }); idle.AddTrigger(trigger); trigger = new Trigger(And(condLeftButtonHold, Not(condLeft2Cmd)), new List { switchToMove, towardLeft }); idle.AddTrigger(trigger); trigger = new Trigger(condCircleCmd, switchToAttk1); idle.AddTrigger(trigger); trigger = new Trigger(condCrossCmd, switchToSideKick); idle.AddTrigger(trigger); idle.AddTrigger(triggerTurnRight); idle.AddTrigger(triggerTurnLeft); // move ability trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List { wipeCmdRecord, switchToDash, }); move.AddTrigger(trigger); trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List { wipeCmdRecord, switchToDash }); move.AddTrigger(trigger); 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); trigger = new Trigger(condCrossCmd, switchToSideKick); move.AddTrigger(trigger); // dash ability trigger = new Trigger(new ConditionAnimAtEnd(animator, Anim_DashWithSword), switchToIdle); dash.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); ConditionAttkExpireTime condSideKickExpireTime = new ConditionAttkExpireTime(sideKick, expireTime); trigger = new Trigger(condSideKickExpireTime, switchToIdle); sideKick.AddTrigger(trigger); ConditionAttkExpireTime condSuperKickExpireTime = new ConditionAttkExpireTime(superKick, expireTime); trigger = new Trigger(condSuperKickExpireTime, switchToIdle); superKick.AddTrigger(trigger); m_AbilitySystem.ForceStart(idle); } }