using System.Collections; using System.Collections.Generic; using UnityEngine; public partial class SaionjiScript : Avatar { ConditionBase Not(ConditionBase cond) { return new ConditionNot(cond); } ConditionBase And(ConditionBase c1, ConditionBase c2) { return new ConditionAnd(c1, c2); } ConditionBase Ands(params ConditionBase[] cond) { List conditions = new List(); for(int i = 0;i < cond.Length; ++i) { conditions.Add(cond[i]); } ConditionMultiAnd and = new ConditionMultiAnd(conditions); return and; } 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); JumpAbilityConfig jumpConfig = new JumpAbilityConfig { animator = animator, collider = m_BodyCollider, body = m_Body, neutralJumpSpeedY = 13f, fowardJumpSpeedX = 5f, backwardJumpSpeedX = -5f, animJump = Anim_JumpStart, animJumpEnd = Anim_JumpEnd, animNU = Anim_JumpUp, animND = Anim_JumpDown, animFU = Anim_JumpUp, animFD = Anim_JumpDown, animBU = Anim_JumpUp, animBD = Anim_JumpDown, skipStart = true, }; JumpAbility jump = new JumpAbility(jumpConfig); AttackAbilityConfig config; //招式会绑定一个motion HitDefination hitDef = new HitDefination { }; AttackAbility attk1 = new AttackAbility(animator, Anim_LightAttack1, m_Body); attk1.AddHitDefination(hitDef); AttackAbility attk2 = new AttackAbility(animator, Anim_LightAttack2, m_Body); attk2.AddHitDefination(hitDef); AttackAbility attk3 = new AttackAbility(animator, Anim_LightAttack3, m_Body); attk3.AddHitDefination(hitDef); AttackAbility attk4 = new AttackAbility(animator, Anim_LightAttack4, m_Body); attk4.AddHitDefination(hitDef); AttackAbility attk5 = new AttackAbility(animator, Anim_LightAttack5, m_Body); attk5.AddHitDefination(hitDef); AttackAbility attkRush = new AttackAbility(animator, Anim_LightAttackRush, m_Body); config = new AttackAbilityConfig() { animator = this.animator, body = this.m_Body, motion = Anim_SideKick, velocity = new Vector3(20, 1.5f, 0) }; AttackAbility sideKick = new AttackAbility(config); AttackAbility sideKickRush = new AttackAbility(animator, Anim_SideKickRush, m_Body); AttackAbility superKick = new AttackAbility(animator, Anim_SuperKick, m_Body); AttackAbility gun1 = new AttackAbility(animator, Anim_Gun1, m_Body); AttackAbility gun2 = new AttackAbility(animator, Anim_Gun2, m_Body); AttackAbility gun3 = new AttackAbility(animator, Anim_Gun3, m_Body); AttackAbility gun4 = new AttackAbility(animator, Anim_Gun4, m_Body); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // actions //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ActionTurn180 turn180 = new ActionTurn180(this.transform); ActionTowardLeft towardLeft = new ActionTowardLeft(this.transform); ActionTowardRight towardRight = new ActionTowardRight(this.transform); ActionJump toJump = new ActionJump(m_AbilitySystem, jump); ActionJumpForward toJumpForward = new ActionJumpForward(m_AbilitySystem, jump); 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 switchToAttkRush = new ActionSwitchAbility(m_AbilitySystem, attkRush); ActionSwitchAbility switchToSideKick = new ActionSwitchAbility(m_AbilitySystem, sideKick); ActionSwitchAbility switchToSideKickRush = new ActionSwitchAbility(m_AbilitySystem, sideKickRush); ActionSwitchAbility switchToDash = new ActionSwitchAbility(m_AbilitySystem, dash); ActionSwitchAbility switchToSuperKick = new ActionSwitchAbility(m_AbilitySystem, superKick); ActionSwitchAbility switchToGun1 = new ActionSwitchAbility(m_AbilitySystem, gun1); ActionSwitchAbility switchToGun2 = new ActionSwitchAbility(m_AbilitySystem, gun2); ActionSwitchAbility switchToGun3 = new ActionSwitchAbility(m_AbilitySystem, gun3); ActionSwitchAbility switchToGun4 = new ActionSwitchAbility(m_AbilitySystem, gun4); ActionWipeCmdRecord wipeCmdRecord = new ActionWipeCmdRecord(); ActionEffectGhost enableGhost = new ActionEffectGhost(Effects[0] as CharacterGhostEffect); ActionDisableGhost disableGhost = new ActionDisableGhost(Effects[0] as CharacterGhostEffect); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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 condUpCmd = new ConditionCommand(GamepadButton.Up); ConditionCommand condTriangleCmd = new ConditionCommand(GamepadButton.Triangle); ConditionCommand condCircleCmd = new ConditionCommand(GamepadButton.Circle); ConditionCommand condCrossCmd = new ConditionCommand(GamepadButton.Cross); ConditionCommand condSquareCmd = new ConditionCommand(GamepadButton.Square); ConditionTowardLeft condTowardLeft = new ConditionTowardLeft(this.transform); ConditionTowardRight condTowardRight = new ConditionTowardRight(this.transform); ConditionCommandSeq condRight2Cmd = new ConditionCommandSeq(new List{GamepadButton.Right, GamepadButton.Right }, 0.8f); ConditionCommandSeq condLeft2Cmd = new ConditionCommandSeq(new List { GamepadButton.Left, GamepadButton.Left }, 0.8f); 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); ConditionHit condIsHit = new ConditionHit(this); ConditionJumpDone condJumpDone = new ConditionJumpDone(jump); ConditionJumpOnGround condJumpOnGround = new ConditionJumpOnGround(jump); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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(condTriangleCmd, toJump) ; idle.AddTrigger(trigger); 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(condRightButtonHold, new List { switchToMove, towardRight }); idle.AddTrigger(trigger); trigger = new Trigger(condLeftButtonHold, new List { switchToMove, towardLeft }); idle.AddTrigger(trigger); trigger = new Trigger(condCircleCmd, switchToAttk1); idle.AddTrigger(trigger); trigger = new Trigger(condCrossCmd, switchToSideKick); idle.AddTrigger(trigger); trigger = new Trigger(condSquareCmd, switchToGun1); idle.AddTrigger(trigger); idle.AddTrigger(triggerTurnRight); idle.AddTrigger(triggerTurnLeft); // move ability //trigger = new Trigger(Or(Ands(condRightButtonHold, condTowardRight, condTriangleCmd), Ands(condLeftButtonHold, condTowardLeft, condTriangleCmd)), toJumpForward); //move.AddTrigger(trigger); trigger = new Trigger(condTriangleCmd, toJump); move.AddTrigger(trigger); 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(condRightButtonHold, condCircleCmd), new List { towardRight, switchToAttkRush }); move.AddTrigger(trigger); trigger = new Trigger(And(condLeftButtonHold, condCircleCmd), new List { towardLeft, switchToAttkRush }); move.AddTrigger(trigger); trigger = new Trigger(And(condRightButtonHold, condCrossCmd), new List { towardRight, switchToSideKickRush }); move.AddTrigger(trigger); trigger = new Trigger(And(condLeftButtonHold, condCrossCmd), new List { towardLeft, switchToSideKickRush }); 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); // jump ability ConditionCheckJumpState condCheckJump = new ConditionCheckJumpState(jump, JumpAbility.State.None, JumpAbility.Direction.Neutral); trigger = new Trigger(And(condRightButtonHold, condCheckJump), new List { towardRight, new ActionSetVelocityX(m_Body, 4)}, TriggerOnlyOnce.Off, TriggerSwallow.Off); jump.AddTrigger(trigger); trigger = new Trigger(And(condLeftButtonHold, condCheckJump), new List { towardLeft, new ActionSetVelocityX(m_Body,-4) }, TriggerOnlyOnce.Off, TriggerSwallow.Off); jump.AddTrigger(trigger); //trigger = new Trigger(Ands(condCheckJump, Not(condRightButtonHold), Not(condLeftButtonHold)), new ActionSetVelocityX(m_Body, 0), TriggerOnlyOnce.Off, TriggerSwallow.Off); //jump.AddTrigger(trigger); trigger = new Trigger(condJumpOnGround, new ActionSetVelocity(m_Body, Vector3.zero), TriggerOnlyOnce.On, TriggerSwallow.Off); jump.AddTrigger(trigger); trigger = new Trigger(Ands(new ConditionJumpDone(jump, 0.4f), condJumpOnGround, Or(condRightButtonHold, condLeftButtonHold)), switchToMove); jump.AddTrigger(trigger); trigger = new Trigger(condJumpDone, switchToIdle); jump.AddTrigger(trigger); // dash ability trigger = new Trigger(And(new ConditionMotionRange(animator, 0.5f, 1.0f), condCircleCmd), switchToAttk1); dash.AddTrigger(trigger); trigger = new Trigger(new ConditionMotionAtEnd(animator, Anim_DashWithSword), switchToIdle); dash.AddTrigger(trigger); // attack abilities float expireTime = 0.3f; // sword normal attack ConditionMotionAtEnd condAttk1AtEnd = new ConditionMotionAtEnd(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); //trigger = new Trigger(condIsHit, new ActionLog("hit!!!")); //attk1.AddLateTrigger(trigger); //ConditionMotionRange condAttkRushGhostRange = new ConditionMotionRange(animator, 0f, 0.8f); //trigger = new Trigger(condAttkRushGhostRange, enableGhost, false); //attkRush.AddTrigger(trigger); //ConditionMotionRange condAttkRushGhostDisableRange = new ConditionMotionRange(animator, 0.8f, 10f); //trigger = new Trigger(condAttkRushGhostDisableRange, disableGhost, false); //attkRush.AddTrigger(trigger); ConditionMotionRange condAttkRushAtRange = new ConditionMotionRange(animator, 0.5f, 1f); trigger = new Trigger(And(condAttkRushAtRange, condCircleCmd), switchToAttk2); attkRush.AddTrigger(trigger); //trigger = new Trigger(And(And(condAttkRushAtRange, condTowardRight), condRightCmd), switchToAttkRush); //attkRush.AddTrigger(trigger); //trigger = new Trigger(And(And(condAttkRushAtRange, condTowardLeft), condLeftCmd), switchToAttkRush); //attkRush.AddTrigger(trigger); ConditionAttkExpireTime condAttkRushExpireTime = new ConditionAttkExpireTime(attkRush, expireTime); trigger = new Trigger(condAttkRushExpireTime, switchToIdle); attkRush.AddTrigger(trigger); //attkRush.AddTrigger(triggerTurnRight); //attkRush.AddTrigger(triggerTurnLeft); ConditionMotionAtEnd condAttk2AtEnd = new ConditionMotionAtEnd(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); ConditionMotionAtEnd condAttk3AtEnd = new ConditionMotionAtEnd(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); ConditionMotionAtEnd condAttk4AtEnd = new ConditionMotionAtEnd(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); ConditionMotionAtEnd condAttk5AtEnd = new ConditionMotionAtEnd(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); // side kick normal ConditionMotionAtEnd condKickMotionEnd = new ConditionMotionAtEnd(animator, Anim_SideKick); trigger = new Trigger(condKickMotionEnd, new ActionSetVelocity(m_Body, Vector3.zero), TriggerOnlyOnce.On, TriggerSwallow.Off); sideKick.AddTrigger(trigger); ConditionAttkExpireTime condSideKickExpireTime = new ConditionAttkExpireTime(sideKick, expireTime); trigger = new Trigger(condSideKickExpireTime, switchToIdle); sideKick.AddTrigger(trigger); // side kick rush ConditionAttkExpireTime condSideKickRushExpireTime = new ConditionAttkExpireTime(sideKickRush, expireTime); trigger = new Trigger(condSideKickRushExpireTime, switchToIdle); sideKickRush.AddTrigger(trigger); ConditionMotionRange condSideKickRushMotionRange = new ConditionMotionRange(animator, 0.5f, 10f); trigger = new Trigger(And(condSideKickRushMotionRange, And(condRightButtonHold, condCircleCmd)), new List { towardRight, switchToAttkRush }); sideKickRush.AddTrigger(trigger); trigger = new Trigger(And(condSideKickRushMotionRange, And(condLeftButtonHold, condCircleCmd)), new List { towardLeft, switchToAttkRush }); sideKickRush.AddTrigger(trigger); // super kick combo ConditionAttkExpireTime condSuperKickExpireTime = new ConditionAttkExpireTime(superKick, expireTime); trigger = new Trigger(condSuperKickExpireTime, switchToIdle); superKick.AddTrigger(trigger); // gun normal ConditionMotionAtEnd condGun1AtEnd = new ConditionMotionAtEnd(animator, Anim_Gun1); trigger = new Trigger(And(condGun1AtEnd, condSquareCmd), switchToGun2); gun1.AddTrigger(trigger); ConditionAttkExpireTime condGun1ExpireTime = new ConditionAttkExpireTime(gun1, expireTime); trigger = new Trigger(condGun1ExpireTime, switchToIdle); gun1.AddTrigger(trigger); ConditionMotionAtEnd condGun2AtEnd = new ConditionMotionAtEnd(animator, Anim_Gun2); trigger = new Trigger(And(condGun2AtEnd, condSquareCmd), switchToGun3); gun2.AddTrigger(trigger); ConditionAttkExpireTime condGun2ExpireTime = new ConditionAttkExpireTime(gun2, expireTime); trigger = new Trigger(condGun2ExpireTime, switchToIdle); gun2.AddTrigger(trigger); ConditionMotionAtEnd condGun3AtEnd = new ConditionMotionAtEnd(animator, Anim_Gun3); trigger = new Trigger(And(condGun3AtEnd, condSquareCmd), switchToGun4); gun3.AddTrigger(trigger); ConditionAttkExpireTime condGun3ExpireTime = new ConditionAttkExpireTime(gun3, expireTime); trigger = new Trigger(condGun3ExpireTime, switchToIdle); gun3.AddTrigger(trigger); ConditionAttkExpireTime condGun4ExpireTime = new ConditionAttkExpireTime(gun4, expireTime); trigger = new Trigger(condGun4ExpireTime, switchToIdle); gun4.AddTrigger(trigger); ConditionMotionRange condGun4MotionRange = new ConditionMotionRange(animator, 0.6f, 1f); trigger = new Trigger(And(condGun4MotionRange, condRight2Cmd), new List { switchToDash, towardRight }); gun4.AddTrigger(trigger); trigger = new Trigger(And(condGun4MotionRange, condLeft2Cmd), new List { switchToDash, towardLeft }); gun4.AddTrigger(trigger); m_AbilitySystem.ForceStart(idle); } }