如何引用对象实例?Unity炮塔AI代码报错求助
Unity中TurretAI与Enemy交互的问题修复方案
问题核心
你需要实现TurretAI类向BulletAI类共享Enemy位置,但当前代码存在两处关键问题:
- 直接访问
Enemy.transform.position未做空值判断,易触发空引用异常 - 注释的
FindObjectOfType<BulletAI>().Target(Enemy);调用时机错误,无法正确给新生成的子弹传递目标
修复代码与步骤
1. 避免空引用异常
在Update方法中先判断Enemy是否存在,再执行后续逻辑:
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class TurretAI : MonoBehaviour { public float Range = 5f; public GameObject Enemy; public GameObject Bullet; float countdown = 0; private void Update() { countdown -= Time.deltaTime; // 先判断Enemy是否为空,避免空引用崩溃 if (Enemy == null) return; float DistanceToEnemy = Vector3.Distance(transform.position, Enemy.transform.position); if (DistanceToEnemy < Range) { if (countdown <= 0) { Shoot(); countdown = 2; } } } private void Shoot() { // 实例化子弹后直接获取BulletAI组件并设置目标 GameObject bulletInstance = Instantiate(Bullet, transform.position, Quaternion.identity); BulletAI bulletAI = bulletInstance.GetComponent<BulletAI>(); if (bulletAI != null && Enemy != null) { // 建议传递Transform,更直接获取目标位置 bulletAI.SetTarget(Enemy.transform); } } private void OnDrawGizmosSelected() { Gizmos.color = Color.red; Gizmos.DrawWireSphere(transform.position, Range); } }
2. 配套BulletAI类实现
确保BulletAI类有对应的目标接收方法:
using UnityEngine; public class BulletAI : MonoBehaviour { private Transform target; // 接收Turret传递的目标 public void SetTarget(Transform newTarget) { target = newTarget; } private void Update() { if (target == null) return; // 此处添加子弹追踪目标的逻辑,例如: transform.LookAt(target.position); transform.Translate(Vector3.forward * Time.deltaTime * 10f); } }
3. 动态获取Enemy(可选)
如果Enemy是动态生成的,无需手动在Inspector赋值,可以通过范围检测自动获取:
// 在TurretAI类中添加以下字段 public LayerMask enemyLayer; // 在Inspector中选择Enemy所在图层 // 修改Update方法中的Enemy检测逻辑 private void Update() { countdown -= Time.deltaTime; // 检测范围内的Enemy Collider[] hitColliders = Physics.OverlapSphere(transform.position, Range, enemyLayer); if (hitColliders.Length > 0) { Enemy = hitColliders[0].gameObject; float DistanceToEnemy = Vector3.Distance(transform.position, Enemy.transform.position); if (DistanceToEnemy < Range && countdown <= 0) { Shoot(); countdown = 2; } } else { Enemy = null; } }
内容的提问来源于stack exchange,提问作者watashiwaisadesu
相关产品推荐
相关产品推荐

