Files
XMen/Assets/Scripts/Actions.cs
2025-07-10 14:49:53 +08:00

845 lines
25 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;
using DragonLi.Core;
using DragonLi.Frame;
using UnityEngine;
using UnityEngine.AI;
namespace MechanicalAge
{
public class Flash2Pos : Action
{
public SharedGameObject targetGameObject;
//[SharedRequired]
// public SharedVector3 destination;
public SharedString pathId;
// cache the navmeshagent component
private NavMeshAgent navMeshAgent;
private GameObject prevGameObject;
protected Vector3[] router;
protected int currentIndex = 0;
protected bool isStay = false;
public override void OnStart()
{
var currentGameObject = GetDefaultGameObject(targetGameObject.Value);
if (currentGameObject != prevGameObject)
{
navMeshAgent = currentGameObject.GetComponent<NavMeshAgent>();
prevGameObject = currentGameObject;
}
if (GetPath())
{
isStay = false;
if (navMeshAgent.isActiveAndEnabled && currentIndex >= 0 && currentIndex < router.Length)
{
navMeshAgent?.SetDestination(router[currentIndex]);
}
}
}
public override TaskStatus OnUpdate()
{
if (router == null || router.Length == 0)
{
return TaskStatus.Failure;
}
if (currentIndex >= router.Length || currentIndex == -1)
{
return TaskStatus.Failure;
}
if (navMeshAgent == null)
{
Debug.LogWarning("NavMeshAgent is null");
return TaskStatus.Failure;
}
if (navMeshAgent.isActiveAndEnabled && !isStay && !navMeshAgent.pathPending && navMeshAgent.remainingDistance < 0.5f)
{
currentIndex++;
isStay = true;
if (currentIndex >= router.Length)
{
return TaskStatus.Success;
}
else
{
MonoSingleton<CoroutineTaskManager>.Instance.WaitSecondTodo(() =>
{
if (navMeshAgent.isActiveAndEnabled)
navMeshAgent.SetDestination(router[currentIndex]);
isStay = false;
}, 0.2f, null);
}
}
return TaskStatus.Running;
}
public override void OnReset()
{
targetGameObject = null;
// destination = Vector3.zero;
}
private bool GetPath()
{
if (string.IsNullOrEmpty(pathId.ToString()))
{
return false;
}
DragonLiAgentPath pathById = DragonLiAgentPathHelper.GetPathById(pathId.ToString());
if (pathById != null)
{
router = pathById.GetPath();
return true;
}
this.LogEditorOnly("Failed to get path.");
return false;
}
}
public class EskyFlash2Pos : Action
{
public SharedGameObject targetGameObject;
//[SharedRequired]
// public SharedVector3 destination;
public SharedString pathId;
// cache the navmeshagent component
private NavMeshAgent navMeshAgent;
private GameObject prevGameObject;
protected Vector3[] router;
protected int currentIndex = 0;
protected bool isStay = false;
public override void OnStart()
{
var currentGameObject = GetDefaultGameObject(targetGameObject.Value);
if (currentGameObject != prevGameObject)
{
navMeshAgent = currentGameObject.GetComponent<NavMeshAgent>();
prevGameObject = currentGameObject;
}
if (GetPath())
{
isStay = false;
if (navMeshAgent.isActiveAndEnabled && currentIndex >= 0 && currentIndex < router.Length)
{
navMeshAgent?.SetDestination(router[currentIndex]);
}
}
}
public override TaskStatus OnUpdate()
{
if (router == null || router.Length == 0)
{
return TaskStatus.Failure;
}
if (currentIndex >= router.Length || currentIndex == -1)
{
return TaskStatus.Failure;
}
if (navMeshAgent == null)
{
Debug.LogWarning("NavMeshAgent is null");
return TaskStatus.Failure;
}
if (navMeshAgent.isActiveAndEnabled && !isStay && !navMeshAgent.pathPending && navMeshAgent.remainingDistance < 0.5f)
{
currentIndex++;
isStay = true;
if (currentIndex >= router.Length)
{
return TaskStatus.Success;
}
else
{
MonoSingleton<CoroutineTaskManager>.Instance.WaitSecondTodo(() =>
{
if (navMeshAgent.isActiveAndEnabled)
navMeshAgent.SetDestination(router[currentIndex]);
isStay = false;
}, 0.1f, null);
}
}
return TaskStatus.Running;
}
public override void OnReset()
{
targetGameObject = null;
// destination = Vector3.zero;
}
private bool GetPath()
{
if (string.IsNullOrEmpty(pathId.ToString()))
{
return false;
}
DragonLiAgentPath pathById = DragonLiAgentPathHelper.GetPathById(pathId.ToString());
if (pathById != null)
{
router = pathById.GetPath();
return true;
}
this.LogEditorOnly("Failed to get path.");
return false;
}
}
public class Flash2PosLoop : Action
{
public SharedGameObject targetGameObject;
//[SharedRequired]
// public SharedVector3 destination;
public SharedString pathId;
// cache the navmeshagent component
private NavMeshAgent navMeshAgent;
private GameObject prevGameObject;
protected Vector3[] router;
protected int currentIndex = 0;
protected bool isStay = false;
protected bool isReverse = false;
public override void OnStart()
{
var currentGameObject = GetDefaultGameObject(targetGameObject.Value);
if (currentGameObject != prevGameObject)
{
navMeshAgent = currentGameObject.GetComponent<NavMeshAgent>();
prevGameObject = currentGameObject;
}
if (GetPath())
{
isStay = false;
if (navMeshAgent.isActiveAndEnabled)
navMeshAgent?.SetDestination(router[currentIndex]);
}
}
public override TaskStatus OnUpdate()
{
if (router == null || router.Length == 0)
{
return TaskStatus.Failure;
}
if (currentIndex >= router.Length - 1 || currentIndex == 0)
{
isReverse = !isReverse;
//return TaskStatus.Failure;
}
if (navMeshAgent == null)
{
Debug.LogWarning("NavMeshAgent is null");
return TaskStatus.Failure;
}
if (navMeshAgent.isActiveAndEnabled && !isStay && !navMeshAgent.pathPending && navMeshAgent.remainingDistance < 0.1f)
{
//currentIndex++;
currentIndex = (isReverse ? (--currentIndex) : (++currentIndex));
//isStay = true;
if (currentIndex >= router.Length || currentIndex == -1)
{
currentIndex = Mathf.Clamp(currentIndex, 0, router.Length - 1);
//return TaskStatus.Failure;
}
isStay = true;
MonoSingleton<CoroutineTaskManager>.Instance.WaitSecondTodo(() =>
{
if (navMeshAgent.isActiveAndEnabled)
navMeshAgent.SetDestination(router[currentIndex]);
isStay = false;
}, 0.1f, null);
}
return TaskStatus.Running;
}
public override void OnReset()
{
targetGameObject = null;
// destination = Vector3.zero;
}
private bool GetPath()
{
if (string.IsNullOrEmpty(pathId.ToString()))
{
return false;
}
DragonLiAgentPath pathById = DragonLiAgentPathHelper.GetPathById(pathId.ToString());
if (pathById != null)
{
router = pathById.GetPath();
return true;
}
this.LogEditorOnly("Failed to get path.");
return false;
}
}
public class Move2Pos : Action
{
public SharedGameObject moveGameObject;
public SharedTransform target;
private NavMeshAgent navMeshAgent;
protected bool isStay = false;
public override void OnStart()
{
var currentGameObject = GetDefaultGameObject(moveGameObject.Value);
navMeshAgent = currentGameObject.GetComponent<NavMeshAgent>();
isStay = false;
if (navMeshAgent.isActiveAndEnabled)
{
navMeshAgent.SetDestination(target.Value.position);
}
}
public override TaskStatus OnUpdate()
{
if (navMeshAgent == null)
{
Debug.LogWarning("NavMeshAgent is null");
return TaskStatus.Failure;
}
// Debug.Log(navMeshAgent.remainingDistance);
if (!navMeshAgent.pathPending && navMeshAgent.isActiveAndEnabled && !isStay && navMeshAgent.remainingDistance < 0.5f)
{
isStay = true;
return TaskStatus.Success;
}
return TaskStatus.Running;
}
}
public class MoveTargetPoints : Action
{
public SharedGameObject moveGameObject;
public SharedTransform target;
private NavMeshAgent navMeshAgent;
protected bool isStay = false;
public override void OnStart()
{
var currentGameObject = GetDefaultGameObject(moveGameObject.Value);
navMeshAgent = currentGameObject.GetComponent<NavMeshAgent>();
isStay = false;
if (navMeshAgent.isActiveAndEnabled)
{
navMeshAgent.SetDestination(target.Value.position);
}
}
public override TaskStatus OnUpdate()
{
if (navMeshAgent == null)
{
Debug.LogWarning("NavMeshAgent is null");
return TaskStatus.Failure;
}
// Debug.Log(navMeshAgent.remainingDistance);
if (navMeshAgent.isActiveAndEnabled && !isStay && navMeshAgent.remainingDistance < 0.5f)
{
isStay = true;
return TaskStatus.Success;
}
return TaskStatus.Running;
}
}
//behaviorTree.SetVariable("ReadEnd", (SharedBool)true);
public class CheckSharedBool : Conditional
{
public SharedGameObject self;
private BehaviorTree behavior;
public string value;
public override void OnStart()
{
base.OnStart();
behavior = self.Value.GetComponent<BehaviorTree>();
//behaviorTree.SetVariable("ReadEnd", (SharedBool)true);
}
public override TaskStatus OnUpdate()
{
Debug.Log((bool)(behavior.GetVariable(value).GetValue()));
if ((bool)(behavior.GetVariable(value).GetValue()))
{
return TaskStatus.Success;
}
else
{
return TaskStatus.Failure;
}
}
}
//检测Boss处于什么阶段
public class CheckEnemyPhase1 : Conditional
{
public SharedGameObject self;
//Boss在第几阶段
public SharedInt Phase;
private int index;
public override TaskStatus OnUpdate()
{
// if (GameManager.Ins.players.Count == 0)
// {
// return TaskStatus.Failure;
// }
float HpUpperLimit = self.Value.GetComponent<Boss>().xHealth;
float CurrentHp = self.Value.GetComponent<Boss>().health;
if (CurrentHp / HpUpperLimit > 0.7)
{
index = 1;
//return TaskStatus.Success;
// Debug.Log("怪物处于第一阶段");
}
else if (CurrentHp / HpUpperLimit <= 0.7 && CurrentHp / HpUpperLimit >= 0.4)
{
// Debug.Log("怪物处于第二阶段");
index = 2;
//return TaskStatus.Success;
}
else if (CurrentHp / HpUpperLimit < 0.4)
{
// Debug.Log("怪物处于第三阶段");
index = 3;
//return TaskStatus.Success;
}
if (Phase.Value == index)
{
// Debug.Log("TRUE");
return TaskStatus.Success;
}
else
{
// Debug.Log("FALSE");
return TaskStatus.Failure;
}
}
}
//检测召唤怪物的剩余的数量
public class CheckSummonAmount : Conditional
{
public override TaskStatus OnUpdate()
{
if (MRNetworkManager.Ins.roomSlots.Count == 0)
{
return TaskStatus.Failure;
}
if (GameManager.Ins.SummonAmount <= 0)
{
return TaskStatus.Success;
}
else
{
return TaskStatus.Failure;
}
}
}
//检测Boss处于什么阶段
public class CheckEnemyPhase2 : Conditional
{
public SharedGameObject self;
//Boss在第几阶段
public SharedInt Phase;
private int index;
public override TaskStatus OnUpdate()
{
if (GameManager.Ins.players.Count == 0)
{
return TaskStatus.Failure;
}
EnemyInfo enemyInfo;
GameManager.Ins.EnemyDescInfos.TryGetValue(7, out enemyInfo);
float HpUpperLimit = enemyInfo.Hp;
float CurrentHp = self.Value.GetComponent<Boss>().health;
if (CurrentHp / HpUpperLimit <= 0.7 && CurrentHp / HpUpperLimit >= 0.4)
{
Debug.Log("怪物处于第一阶段" + HpUpperLimit + "|" + CurrentHp);
index = 2;
}
if (Phase.Value == index)
{
Debug.Log("TRUE");
return TaskStatus.Success;
}
else
{
Debug.Log("FALSE");
return TaskStatus.Failure;
}
}
}
public class IsPlayerNearby : Conditional
{
public SharedGameObject self;
public SharedFloat range;
public SharedBool judge;
private NavMeshAgent navMeshAgent;
public override TaskStatus OnUpdate()
{
if (GameManager.Ins.players.Count == 0)
{
return TaskStatus.Failure;
}
Transform player1 = GameManager.Ins.players[0];
//计算自身到目标点之间XZ的平面距离
float dis = MathExtension.GetDistanceXOZ(self.Value.transform.position, player1.position);
if (judge.Value)
{
//return dis < range.Value ? TaskStatus.Success : TaskStatus.Failure;
if (dis < range.Value)
{
//navMeshAgent = self.Value.GetComponent<NavMeshAgent>();
//navMeshAgent.isStopped = true;
return TaskStatus.Success;
}
else
{
return TaskStatus.Failure;
}
}
else
{
return dis >= range.Value ? TaskStatus.Success : TaskStatus.Failure;
}
}
}
/// <summary>
/// 是否有玩家在护盾内
/// </summary>
public class IsPlayerInShield : Conditional
{
public override TaskStatus OnUpdate()
{
return GameManager.Ins.IsPlayerInShield() ? TaskStatus.Success : TaskStatus.Failure;
}
}
public class IsPlayerNearby2 : Conditional
{
public SharedGameObject self;
public SharedFloat range;
public SharedBool judge;
private NavMeshAgent navMeshAgent;
public override TaskStatus OnUpdate()
{
if (GameManager.Ins.players.Count == 0)
{
return TaskStatus.Failure;
}
Transform player1 = GameManager.Ins.players[0];
//计算自身到目标点之间XZ的平面距离
//float dis = MathExtension.GetDistanceXOZ(self.Value.transform.position, player1.position);
float dis = Vector3.Distance(self.Value.transform.position, player1.transform.position);
Debug.Log("DIS" + dis);
return dis < range.Value ? TaskStatus.Success : TaskStatus.Failure;
//if (dis < range.Value)
//{
// return TaskStatus.Success;
//}
//else
//{
// return TaskStatus.Failure;
//}
}
}
public class IsCanAttackShield : Conditional
{
public SharedBool judge;
public SharedGameObject self;
public SharedFloat attackArea;
public override TaskStatus OnUpdate()
{
return GameManager.Ins.IsCanAttackShield(self.Value.transform, 0, attackArea.Value) == judge.Value ? TaskStatus.Success : TaskStatus.Failure;
}
}
public class IsCanAttackPlayer : Conditional
{
public SharedBool judge;
public SharedGameObject self;
public SharedFloat attackArea;
public override TaskStatus OnUpdate()
{
return GameManager.Ins.IsCanAttackPlayer(self.Value.transform, 0, attackArea.Value) == judge.Value ? TaskStatus.Success : TaskStatus.Failure;
}
}
public class CanSeePlayer : Conditional
{
public SharedFloat angle;
public SharedFloat distance;
public SharedFloat agentHeight;
public override TaskStatus OnUpdate()
{
Transform agentTransform = transform; // <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>Transform
Transform playerTransform = GameManager.Ins.GetPlayer1(); // <20><>ȡ<EFBFBD><C8A1>ҵ<EFBFBD>Transform
if (playerTransform == null)
{
Debug.Log("<22><>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>");
return TaskStatus.Failure; // <20><>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
}
// <20><><EFBFBD><EFBFBD>Ƕ<EFBFBD>
float angleToPlayer = Vector3.Angle(agentTransform.forward, playerTransform.position - agentTransform.position);
// <20><><EFBFBD>Ƕ<EFBFBD>
if (angleToPlayer > angle.Value)
{
Debug.Log("<22>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㣬ʧ<E3A3AC><CAA7>");
return TaskStatus.Failure; // <20>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㣬ʧ<E3A3AC><CAA7>
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float distanceToPlayer = Vector3.Distance(agentTransform.position, playerTransform.position);
if (distanceToPlayer > distance.Value)
{
Debug.Log("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㣬ʧ<E3A3AC><CAA7>");
return TaskStatus.Failure; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㣬ʧ<E3A3AC><CAA7>
}
// <20><><EFBFBD>߼<EFBFBD><DFBC>
Ray ray = new Ray(agentTransform.position + Vector3.up * agentHeight.Value, agentTransform.forward);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, distance.Value, LayerMask.GetMask("Default")))
{
return TaskStatus.Failure; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
}
return TaskStatus.Success; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
}
}
public class MoveToPlayerNearby : Action
{
public SharedGameObject self;
public SharedFloat range;
private NavMeshAgent navMeshAgent;
private Vector3 targetPosition;
public override void OnStart()
{
base.OnStart();
navMeshAgent = self.Value.GetComponent<NavMeshAgent>();
targetPosition = GetTargetPosition(MRNetworkManager.Ins.roomSlots[0].transform);
targetPosition = Utils.GetNearRandomPositionOnNavmesh(targetPosition, 0.1f);
if (navMeshAgent.isActiveAndEnabled)
navMeshAgent.SetDestination(targetPosition);
}
public override TaskStatus OnUpdate()
{
return TaskStatus.Success;
}
private Vector3 GetTargetPosition(Transform player)
{
Vector3 dir = -self.Value.transform.position - player.position;
Vector3 val = Vector3.Cross(dir.ReflectVectorXOZ(), Vector3.up);
val *= (float)((!(Random.Range(-1f, 1f) < 0f)) ? 1 : (-1));
return player.position + (dir.normalized * range.Value + (val.normalized * Random.Range(-range.Value, range.Value)));
}
}
public class MoveToPlayerNearby2 : Action
{
public SharedGameObject self;
public SharedFloat range;
private NavMeshAgent navMeshAgent;
private Vector3 targetPosition;
protected bool isStay = true;
public override void OnStart()
{
base.OnStart();
navMeshAgent = self.Value.GetComponent<NavMeshAgent>();
// Utils.GetNearRandomPositionOnNavmesh();
targetPosition = self.Value.transform.position;
if (GameManager.Ins.players.Count > 0)
{
targetPosition = GetTargetPosition();
}
if (!navMeshAgent.isActiveAndEnabled) return;
navMeshAgent.SetDestination(targetPosition);
isStay = false;
}
public override TaskStatus OnUpdate()
{
if (navMeshAgent.isActiveAndEnabled && !isStay && navMeshAgent.remainingDistance < 0.5f)
{
isStay = true;
return TaskStatus.Success;
}
return TaskStatus.Running;
}
private Vector3 GetTargetPosition()
{
Transform player = GameManager.Ins.players[0];
Vector3 dir = self.Value.transform.position - player.position;
Vector3 val = Vector3.Cross(dir.ReflectVectorXOZ(), Vector3.up);
val *= (float)((!(Random.Range(-1f, 1f) < 0f)) ? 1 : (-1));
return player.position + (dir.normalized * range.Value);
//+ (dir.normalized * range.Value + (val.normalized * Random.Range(-range.Value, range.Value)));
}
}
public class Attack : Action
{
public SharedGameObject targetGameObject;
// cache the navmeshagent component
private NavMeshAgent navMeshAgent;
private GameObject prevGameObject;
private Animator animator;
public override void OnStart()
{
var currentGameObject = GetDefaultGameObject(targetGameObject.Value);
if (currentGameObject != prevGameObject)
{
navMeshAgent = currentGameObject.GetComponent<NavMeshAgent>();
prevGameObject = currentGameObject;
}
animator = currentGameObject.GetComponent<Animator>();
}
public override TaskStatus OnUpdate()
{
if (navMeshAgent == null)
{
Debug.LogWarning("NavMeshAgent is null");
return TaskStatus.Failure;
}
animator.SetBool("", true);
return TaskStatus.Success;
}
public override void OnReset()
{
targetGameObject = null;
// destination = Vector3.zero;
}
}
public class InHpRange : Conditional
{
public SharedInt minHpPrecent;
public SharedInt maxHpPrecent;
public SharedBool judge;
public SharedGameObject self;
public override TaskStatus OnUpdate()
{
TaskStatus status = TaskStatus.Failure;
Agent agent = self.Value.GetComponent<Agent>();
if (agent)
{
if (agent.Health >= minHpPrecent.Value / 100f * agent.OriginHealth && agent.Health <= maxHpPrecent.Value / 100f * agent.OriginHealth)
{
status = TaskStatus.Success;
}
}
if (!judge.Value)
{
status = status == TaskStatus.Success ? TaskStatus.Failure : TaskStatus.Success;
}
return status;
}
}
}