首页 > 解决方案 > Unity - 当脚本附加到场景中的游戏对象时,为什么脚本的getcomponent返回null

问题描述

我创建了一个 TileMap。我的敌人是一个简单的圆柱体,附加了“EnemyMover.cs”脚本,并且在按下播放之前位于场景(层次结构)中。(在运行时未实例化)

在一个单独的对象上,我有一个“TargetLocator”脚本,它在运行时通过单击地图上的图块实例化时尝试利用 GetComponent 来查找圆柱体脚本组件。

    public class TargetLocator : MonoBehaviour
{
    [SerializeField] private Transform weapon;
    private Transform target;
    
    void Start()
    {
        target = GetComponent<EnemyMover>().transform;
    }
    
    void Update()
    {
        AimWeapon();
    }

    void AimWeapon()
    {
        weapon.LookAt(target);
    }
}

错误:

NullReferenceException:对象引用未设置为对象 TargetLocator.Start () 的实例(位于 Assets/Towers/TargetLocator.cs:12)

使用 EnemyMover 脚本的敌人对象

我应该提到我试图:

  1. 重置团结
  2. 删除转换并仅验证对象
  3. 为敌人(圆柱体)添加刚体
  4. 添加对撞机

除了刚体之外,所有都仍然返回 null ,但这会导致项目从地板上掉下来并且仍然不以敌人为目标。


    public class EnemyMover : MonoBehaviour
    {
        [SerializeField] private List<Waypoint> path = new List<Waypoint>();
        [SerializeField] [Range(0f, 5f)] private float speed = 1f;
    
        void Start()
        {
            StartCoroutine(FollowPath());
        }
    
        IEnumerator FollowPath()
        {
            foreach (Waypoint waypoint in path)
            {
                Vector3 startPos = transform.position;
                Vector3 endPos = waypoint.transform.position;
                float travelPercent = 0f;
                
                // todo reintroduce when object can face
                // transform.LookAt(endPos);
    
                while (travelPercent < 1f)
                {
                    travelPercent += Time.deltaTime * speed;
                    transform.position = Vector3.Lerp(startPos, endPos, travelPercent);
                    yield return new WaitForEndOfFrame();
                }
            }
        }
    }

标签: c#unity3d

解决方案


transform尝试调用该脚本中的方法,而不是对象的真实位置。EG EnemyMover

 public class EnemyMover: MonoBehaviour
{
    private Transform target;
    
    public Transform CalculateTarget()
    {
        target = GetComponent<Player>().transform;
        return target;
    }
}

然后TargetLocator 你会打电话:

target = GetComponent<EnemyMover>().CalculateTarget();

推荐阅读