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

Unity触发碰撞获取对象变量时遇NullReferenceException错误求助

解决Unity触发碰撞时的NullReferenceException错误

问题场景

使用Unity 2022.1.19f1与C#开发游戏,需求为:当玩家碰撞场景中的多个对象时,改变玩家的X轴位置。编写了两个脚本,但触发碰撞时出现如下错误:

NullReferenceException: Object reference not set to an instance of an object
PlayerPositionCorrection.OnTriggerEnter (UnityEngine.Collider other) (at Assets/Scripts/PlayerPositionCorrection.cs:23)

玩家身上的原脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerPositionCorrection : MonoBehaviour
{
    Transform _playerTransform;
    public float _xAxys;
    public float _newXAxys;

    public GameObject _changerPlayerPosition;

    private void Start()
    {
        _playerTransform = GetComponent<Transform>();
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.tag == "ChangePlayerPosition")
        {
            float _newXAxys = this.GetComponent<ChangePositionOn>()._newPostion;
            
        }
    }

    private void LateUpdate()
    {
        if (transform.position.z != 0)
        {
            transform.position = new Vector3(_xAxys, _playerTransform.position.y, _playerTransform.position.z);
        }
    }
}

触发对象身上的原脚本

public class ChangePositionOn : MonoBehaviour
{
    public float _newPostion = 5;

    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

错误原因

错误出在PlayerPositionCorrection.OnTriggerEnter方法中:你用this.GetComponent<ChangePositionOn>()尝试获取组件,但ChangePositionOn脚本是挂载在触发对象上的,而非玩家自身,因此获取结果为null,访问_newPostion时触发空引用异常。此外,即使获取到值,你也没有将其赋值给_xAxys,导致位置修正逻辑无法生效。

修复方案

修改PlayerPositionCorrection的OnTriggerEnter方法,从碰撞到的对象上获取ChangePositionOn组件,并将获取到的位置值赋值给_xAxys:

修正后的玩家脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerPositionCorrection : MonoBehaviour
{
    Transform _playerTransform;
    public float _xAxys;
    public float _newXAxys;

    public GameObject _changerPlayerPosition;

    private void Start()
    {
        _playerTransform = GetComponent<Transform>();
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("ChangePlayerPosition")) // 推荐用CompareTag替代直接比较字符串,性能更好且避免拼写错误
        {
            ChangePositionOn positionChanger = other.GetComponent<ChangePositionOn>();
            if (positionChanger != null) // 增加空判断,避免意外报错
            {
                _xAxys = positionChanger._newPostion;
            }
        }
    }

    private void LateUpdate()
    {
        if (transform.position.z != 0)
        {
            transform.position = new Vector3(_xAxys, _playerTransform.position.y, _playerTransform.position.z);
        }
    }
}

额外注意事项

  • 确保玩家对象和触发对象都添加了Collider组件,并且至少其中一个对象添加了Rigidbody组件(否则触发事件不会触发)。
  • 触发对象的Collider需勾选Is Trigger选项。
  • 确认触发对象的标签确实设置为ChangePlayerPosition,注意大小写和拼写一致。

内容的提问来源于stack exchange,提问作者Michał Marciniak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:05:24