Files
XMen/Assets/Scripts/Actions.cs

845 lines
25 KiB
C#

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; //获取当前代理的Transform
Transform playerTransform = GameManager.Ins.GetPlayer1(); // 获取玩家的Transform
if (playerTransform == null)
{
Debug.Log("玩家不存在,返回失败");
return TaskStatus.Failure; // 玩家不存在,返回失败
}
// 计算角度
float angleToPlayer = Vector3.Angle(agentTransform.forward, playerTransform.position - agentTransform.position);
// 检查角度
if (angleToPlayer > angle.Value)
{
Debug.Log("角度条件不满足,失败");
return TaskStatus.Failure; // 角度条件不满足,失败
}
// 计算距离
float distanceToPlayer = Vector3.Distance(agentTransform.position, playerTransform.position);
if (distanceToPlayer > distance.Value)
{
Debug.Log("距离条件不满足,失败");
return TaskStatus.Failure; // 距离条件不满足,失败
}
//射线检查
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; // 射线被阻挡,返回失败
}
return TaskStatus.Success; // 所有条件都满足,成功
}
}
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;
}
}
}