Unity 2D生存游戏开发:为何出现对象引用未设置实例错误?
空引用错误排查与修复方案
问题根源
你代码最后一行触发的Object reference not set to an instance of an object错误,本质是hit.transform.GetComponent<TreeScript>()返回了null——哪怕hit.collider不为空,也不代表这个物体上挂载了TreeScript脚本,直接访问treeHealth自然会报错。
具体修复步骤
- 先确认树木的脚本挂载
选中射线命中的树木物体,检查Inspector面板,确保它确实挂载了TreeScript,且treeHealth变量是公开的(public)或者加了[SerializeField]标签能在面板编辑。 - 给组件访问加空值判断
修改代码,先判断组件是否存在再操作,避免直接访问空引用:if (Input.GetMouseButtonDown(0)) { Debug.DrawRay(transform.position, mousePosition * 0.1f, Color.red); RaycastHit2D hit = Physics2D.Raycast(playerRb.transform.position, mousePosition, 0.1f); if (hit.collider != null) { TreeScript treeScript = hit.transform.GetComponent<TreeScript>(); if (treeScript != null) { treeScript.treeHealth -= 1; } else { Debug.LogWarning("命中的物体没挂TreeScript脚本!"); } } } - 修正射线方向逻辑
你直接用mousePosition(屏幕坐标)当射线方向是错的,得把鼠标位置转成世界空间的方向:
另外注意射线长度,原代码0.1f太短,大概率射不到树木,建议调大到合理数值(比如5f),同时确保树木有2D碰撞体(比如BoxCollider2D),且没勾选"Is Trigger"(除非你特意用触发检测)。if (Input.GetMouseButtonDown(0)) { // 把屏幕鼠标坐标转成世界坐标 Vector2 worldMousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); // 计算从玩家到鼠标的射线方向 Vector2 rayDir = worldMousePos - (Vector2)playerRb.transform.position; // 射线长度调大一点,0.1f太短可能碰不到树 RaycastHit2D hit = Physics2D.Raycast(playerRb.transform.position, rayDir.normalized, 5f); Debug.DrawRay(playerRb.transform.position, rayDir.normalized * 5f, Color.red); if (hit.collider != null) { TreeScript treeScript = hit.transform.GetComponent<TreeScript>(); if (treeScript != null) { treeScript.treeHealth -= 1; } else { Debug.LogWarning("命中的物体没挂TreeScript脚本!"); } } } - 检查playerRb是否赋值
确认playerRb变量已经在Inspector面板中拖入了玩家的Rigidbody2D组件,避免playerRb.transform.position触发空引用。
内容的提问来源于stack exchange,提问作者Business Cactus
相关产品推荐
相关产品推荐

