You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何引用对象实例?Unity炮塔AI代码报错求助

Unity中TurretAI与Enemy交互的问题修复方案

问题核心

你需要实现TurretAI类向BulletAI类共享Enemy位置,但当前代码存在两处关键问题:

  1. 直接访问Enemy.transform.position未做空值判断,易触发空引用异常
  2. 注释的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:06:28