Files
FutureMen2/Assets/_FutureMen2/Scripts/Actions/Actions.cs

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;
}
}