static void Main(string[] args) { CombatLogger combatLogger = new CombatLogger(); EventLogger eventLogger = new EventLogger(); TargetLogger targetLogger = new TargetLogger(); combatLogger.SetSuccessor(eventLogger); eventLogger.SetSuccessor(targetLogger); IAttacker pesho = new Warrior("Pesho", 10, combatLogger); IAttacker stamat = new Warrior("Stamat", 20, combatLogger); IAttackGroup attackGroup = new AttackGroup(); attackGroup.AddMember(pesho); attackGroup.AddMember(stamat); ITarget target = new Dragon("Drago", 30, 200, combatLogger); ((ISubject)target).Register((IObserver)pesho); ((ISubject)target).Register((IObserver)stamat); IExecutor executor = new CommandExecutor(); ICommand groupTargetCommand = new GroupTargetCommand(attackGroup, target); ICommand groupAttackCommand = new GroupAttackCommand(attackGroup); executor.ExecuteCommand(groupAttackCommand); executor.ExecuteCommand(groupTargetCommand); executor.ExecuteCommand(groupAttackCommand); executor.ExecuteCommand(groupAttackCommand); }
// 站立 public void StandBy() { // 清理攻击数据 _lastAttackActionIndex = -1; _lastAttackGroup = AttackGroup.EMPTY; SetAction(AnimationAction.IDLE); }
public static void FloorSpikeTargetPlayer(Boss b, AttackGroup a, FloorSpike.Data d, RuntimeAnimatorController animator) { if (b.player != null) { FloorSpike(b, d, animator, b.player.transform.position.x); } a.StartCooldown(); }
// Summon multiple floor spikes. public static void FloorSpikes(Boss b, AttackGroup a, FloorSpike.Data d, RuntimeAnimatorController animator, float count) { Room room = b.room; int trueCount = Mathf.FloorToInt(count); for (int i = 0; i < trueCount; ++i) { FloorSpike(b, d, animator, room.GetRandomFloorXPosition()); } a.StartCooldown(); }
// 设置攻击序号,这些序号跟controller中的配置相关 private void SetAttackList(AttackGroup group, List <int> list) { list.Clear(); switch (group) { case AttackGroup.EMPTY: list.AddRange(new[] { 1, 2, 3, 4, 5 }); break; case AttackGroup.LSLASH: list.AddRange(new[] { 11, 12, 13, 14 }); break; case AttackGroup.RSLASH: list.AddRange(new[] { 21, 22, 23, 24 }); break; case AttackGroup.LWAND: list.Add(31); break; case AttackGroup.RWAND: list.Add(41); break; case AttackGroup.POLEARM: list.AddRange(new[] { 51, 52, 53 }); break; case AttackGroup.RIFLE: list.Add(61); break; case AttackGroup.BOW: list.AddRange(new[] { 71, 72 }); break; case AttackGroup.CROSSBOW: list.Add(81); break; case AttackGroup.LPISTOL: list.Add(91); break; case AttackGroup.RPISTOL: list.Add(101); break; } }
// All attacking logic is handled here protected void HandleAttack() { isAttacking = animator.GetCurrentAnimatorStateInfo(0).IsTag("attack"); // Punching timer to reset attack combination punchTimer.Update(Time.deltaTime); if (punchTimer.IsExpired()) { punchTimer.Reset(); } // Start next attack only when previous attack is finished if (!isAttacking) { currentAttack = Attack.None; currentAttackGroup = AttackGroup.None; if (Input.GetKeyDown(KeyCode.J)) { // Sword attaks currentAttackGroup = AttackGroup.KingdudeSword; currentAttack = swordCombo.Next(); } else if (Input.GetKeyDown(KeyCode.K)) { // Punch attacks currentAttackGroup = AttackGroup.KingdudePunch; if (!punchTimer.IsClickSequential) { punchCombo.Reset(); } currentAttack = punchCombo.Next(); punchTimer.RegisterSequencialClick(); } else if (Input.GetKeyDown(KeyCode.L)) { // Sword dash currentAttackGroup = AttackGroup.KingdudeDash; currentAttack = Attack.KingdudeSwordDash; } if (currentAttack != Attack.None) { this.animator.SetInteger("attackGroup", (int)currentAttackGroup); this.animator.SetTrigger("attack"); this.animator.SetInteger("attackType", (int)currentAttack); } } }
public static void SpawnOrb(Boss b, AttackGroup a, BossOrb.Data d, string positionName, RuntimeAnimatorController animator) { Transform spawnLocation, center, bottom; b.transforms.TryGetValue(positionName, out spawnLocation); b.transforms.TryGetValue("CenterTop", out center); b.transforms.TryGetValue("CenterBottom", out bottom); GameObject obj = Instantiate(b.prefabOrb, spawnLocation); obj.transform.localPosition = Vector3.zero; BossOrb orb = obj.GetComponent <BossOrb>(); orb.SetData(d); orb.SetCenterAndBottom(center.position, bottom.position); orb.SetAnimatorController(animator); orb.IdleFinished += a.StartCooldown; orb.SetTarget(b.player ? b.player.transform : b.transform); }
// 攻击 public void Attack() { // 只有站立和跑步的时候可以切换到攻击 AnimatorStateInfo animatorState = _animator.GetCurrentAnimatorStateInfo(0); if (animatorState.IsName(IDLE_NAME) || animatorState.IsName(RUN_NAME)) { int index = 0; if (_leftHandAttackGroup != AttackGroup.EMPTY) { // 如果有左手动画,则左右手轮流播放 if (_lastAttackGroup == _rightHandAttackGroup) { // 如果上次播放的是右手动画,则此次播放左手动画 index = GetRandomAction(_leftHandAttackList, _lastAttackActionIndex); _lastAttackGroup = _leftHandAttackGroup; } else { // 其余情况播放右手动画 index = GetRandomAction(_rightHandAttackList, _lastAttackActionIndex); _lastAttackGroup = _rightHandAttackGroup; } } else { index = GetRandomAction(_rightHandAttackList, _lastAttackActionIndex); } SetAction(AnimationAction.ATTACK, index); // 延迟几帧清理设置的动画参数 _actor.AddFrameEvent(() => { // 仅需要处理参数 SetAction(AnimationAction.IDLE); }); } }
// 设置左手的攻击动画组别 public void SetLeftHandAttackGroup(AttackGroup attackGroup) { _leftHandAttackGroup = attackGroup; SetAttackList(_leftHandAttackGroup, _leftHandAttackList); }
// 设置右手攻击动画组别 public void SetRightHandAttackGroup(AttackGroup attackGroup) { _rightHandAttackGroup = attackGroup; SetAttackList(_rightHandAttackGroup, _rightHandAttackList); }