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
相关产品推荐
相关产品推荐

