using System.Collections.Generic; using BehaviorDesigner.Runtime; using BehaviorDesigner.Runtime.Tasks; using DarkTonic.MasterAudio; using UnityEngine; public class CheckEnemyState : Conditional { public SharedInt CurEnemyState; public override TaskStatus OnUpdate() { if (transform.GetComponent().enemyState == (EnemyState)CurEnemyState.Value) { return TaskStatus.Success; } return TaskStatus.Failure; } } public class SetEnemyState : Action { public SharedInt CurEnemyState; public override TaskStatus OnUpdate() { var enemy = transform.GetComponent(); if (enemy != null) { enemy.enemyState = (EnemyState)CurEnemyState.Value; return TaskStatus.Success; } return base.OnUpdate(); } } public class PlayEnemyAudio : Action { public SharedBool IsStop; public SharedString AudioName; public SharedBool IsBack; private Enemy _enemy; public override void OnStart() { base.OnStart(); if(IsStop.Value) MasterAudio.StopAllSoundsOfTransform(transform); MasterAudio.PlaySound3DAtTransform(AudioName.Value, transform); } public override TaskStatus OnUpdate() { base.OnUpdate(); TaskStatus status = TaskStatus.Running; MasterAudioGroup audioGroup = MasterAudio.GrabGroup(AudioName.Value); if (audioGroup == null) { status = TaskStatus.Failure; } else if (audioGroup.ActiveVoices <= 0|| IsBack.Value) { status = TaskStatus.Success; } return status; } } public class PlayAiAudio : Action { public SharedString AudioName; public SharedBool IsBack; public override void OnStart() { base.OnStart(); MasterAudio.PlaySound(AudioName.Value); } public override TaskStatus OnUpdate() { base.OnUpdate(); TaskStatus status = TaskStatus.Running; MasterAudioGroup audioGroup = MasterAudio.GrabGroup(AudioName.Value); if (audioGroup == null) { status = TaskStatus.Failure; } else if (audioGroup.ActiveVoices <= 0|| IsBack.Value) { status = TaskStatus.Success; } return status; } } public class CheckEnemyHp : Conditional { public SharedFloat HpIndex; public override TaskStatus OnUpdate() { var curHpIndex = transform.GetComponent().health / transform.GetComponent().maxHealth; if (curHpIndex <= HpIndex.Value/100f) { return TaskStatus.Success; } return TaskStatus.Failure; } } public class ReleaseSkill : Action { public SharedFloat cooldownTimer; public SharedBool skillReady; public float skillCooldown = 15f; public override void OnStart() { base.OnStart(); // 进入冷却 cooldownTimer.Value = skillCooldown; skillReady.Value = false; } } public class BossShow : Action { private Enemy _enemy; public override void OnStart() { base.OnStart(); _enemy = GetComponent(); _enemy.Show(); } public override TaskStatus OnUpdate() { if(_enemy==null) return TaskStatus.Failure; if(_enemy.isShowEnd) return TaskStatus.Success; return TaskStatus.Running; } } public class BossEndShow : Action { private Enemy _enemy; public override void OnStart() { base.OnStart(); _enemy = GetComponent(); _enemy.EndShow(); } public override TaskStatus OnUpdate() { if(_enemy==null) return TaskStatus.Failure; return TaskStatus.Success; } } public class CheckCooldown : Conditional { public enum CooldownType { Skill1, Skill2, Teleport } public CooldownType type; private Enemy boss; public override void OnStart() { boss = GetComponent(); } public override TaskStatus OnUpdate() { switch (type) { case CooldownType.Skill1: return boss.skill1Timer >= boss.skill1Cooldown ? TaskStatus.Success : TaskStatus.Failure; case CooldownType.Skill2: return boss.skill2Timer >= boss.skill2Cooldown ? TaskStatus.Success : TaskStatus.Failure; case CooldownType.Teleport: return boss.teleportTimer >= boss.teleportCooldown ? TaskStatus.Success : TaskStatus.Failure; } return TaskStatus.Failure; } } public class CheckHpTrigger : Conditional { private Enemy boss; public override void OnStart() { boss = GetComponent(); } public override TaskStatus OnUpdate() { if (boss.isDead) return TaskStatus.Failure; float hpPercent = boss.health / boss.maxHealth; int index = Mathf.FloorToInt(hpPercent / 0.2f); if (index < boss.spikeTriggerIndex) { boss.spikeTriggerIndex = index; return TaskStatus.Success; } return TaskStatus.Failure; } }