如何让敌人抵达目标玩家后禁用指定脚本?(含代码片段)
解决敌人抵达玩家后禁用GameManager的casting脚本问题
看起来你已经搭好了敌人追踪玩家的基础框架,接下来只需要补充抵达检测逻辑,再执行禁用脚本的操作就行。我帮你一步步完善代码:
首先得明确“抵达目标”的判断标准——这里推荐用NavMeshAgent自带的导航属性,更贴合导航系统的逻辑;当然你也可以直接计算敌人与玩家的距离来判断,两种方式我都会提到:
public float lookRadius = 40f; Transform target; UnityEngine.AI.NavMeshAgent agent; Rigidbody theRigidBody; // 添加标志位,避免重复执行禁用操作 private bool hasReachedTarget = false; void Start() { target = PlayerManager.instance.player.transform; agent = GetComponent<UnityEngine.AI.NavMeshAgent>(); theRigidBody = GetComponent<Rigidbody>(); } void Update() { float distance = Vector3.Distance(target.position, transform.position); // 敌人在追踪范围内,且还未抵达目标时持续导航 if (distance <= lookRadius && !hasReachedTarget) { agent.SetDestination(target.position); // 方式1:用导航组件的剩余距离判断是否抵达 if (agent.remainingDistance <= agent.stoppingDistance && !agent.pathPending) { OnEnemyReachTarget(); } // 方式2:直接判断敌人与玩家的距离(比如小于1米就算抵达) // if (distance <= 1f) { // OnEnemyReachTarget(); // } } } // 自定义的抵达触发函数,专门处理抵达后的逻辑 void OnEnemyReachTarget() { // 标记为已抵达,防止Update帧重复触发 hasReachedTarget = true; // 找到GameManager并获取casting脚本 GameManager gameManager = FindObjectOfType<GameManager>(); if (gameManager != null) { // 如果casting是你自定义的脚本类型,直接用泛型GetComponent更安全 casting castingScript = gameManager.GetComponent<casting>(); // 如果你不确定脚本类型,也可以用字符串查找(不推荐,容易出错) // MonoBehaviour castingScript = gameManager.GetComponent<MonoBehaviour>("casting"); if (castingScript != null) { castingScript.enabled = false; Debug.Log("已禁用GameManager下的casting脚本"); } else { Debug.LogWarning("GameManager上没找到名为casting的脚本哦"); } } else { Debug.LogWarning("场景里找不到GameManager对象呀"); } // 额外:让敌人抵达后停止移动,符合逻辑 agent.isStopped = true; }
关键细节说明:
agent.pathPending判断:避免导航路径还在计算时误判,确保路径稳定后再判断剩余距离。hasReachedTarget标志位:防止每一帧都执行禁用操作,确保只触发一次。- 两种抵达判断方式:你可以根据需求选——用导航停止距离更贴合AI导航逻辑,用直接距离判断更灵活。
这样就能精准触发敌人抵达后的禁用操作啦!
内容的提问来源于stack exchange,提问作者user9540087
相关产品推荐
相关产品推荐

