204 lines
4.8 KiB
C#
204 lines
4.8 KiB
C#
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<Enemy>().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<Enemy>();
|
|
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<Enemy>().health / transform.GetComponent<Enemy>().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>();
|
|
_enemy.Show();
|
|
}
|
|
|
|
public override TaskStatus OnUpdate()
|
|
{
|
|
if(_enemy==null)
|
|
return TaskStatus.Failure;
|
|
if(_enemy.isShowEnd)
|
|
return TaskStatus.Success;
|
|
return TaskStatus.Running;
|
|
}
|
|
}
|
|
|
|
public class CheckCooldown : Conditional
|
|
{
|
|
public enum CooldownType { Skill1, Skill2, Teleport }
|
|
public CooldownType type;
|
|
|
|
private Enemy boss;
|
|
|
|
public override void OnStart()
|
|
{
|
|
boss = GetComponent<Enemy>();
|
|
}
|
|
|
|
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<Enemy>();
|
|
}
|
|
|
|
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;
|
|
}
|
|
} |