C# 我在unity中使用Raycast,我想在单击对象时获取该对象的位置,但我不工作,我不';我不知道我做错了什么

C# 我在unity中使用Raycast,我想在单击对象时获取该对象的位置,但我不工作,我不';我不知道我做错了什么,c#,unity3d,raycasting,C#,Unity3d,Raycasting,所以当我点击游戏中的物体时,我会得到这个错误 NullReferenceExceptionm:对象引用未设置为对象的实例 JumpDestination.Update()(位于Assets/Scripts/JumpDestination.cs.:12) 我不知道我做错了什么,我怎样才能纠正它? 我想知道被击中物体的位置 using System.Collections; using System.Collections.Generic; using UnityEngine; public cl

所以当我点击游戏中的物体时,我会得到这个错误

NullReferenceExceptionm:对象引用未设置为对象的实例 JumpDestination.Update()(位于Assets/Scripts/JumpDestination.cs.:12)

我不知道我做错了什么,我怎样才能纠正它? 我想知道被击中物体的位置

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

public class JumpDestination : MonoBehaviour {

    private RaycastHit hit;
    public float jumpMaxDistance;

    void Update(){
        Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out hit, jumpMaxDistance);
        if (hit.collider.gameObject.tag == "RichPoint") {
            print (hit.collider.transform.position);
        }
    }
}
我不知道我做错了什么,我怎样才能纠正它?我想得到那份工作 命中对象的位置

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

public class JumpDestination : MonoBehaviour {

    private RaycastHit hit;
    public float jumpMaxDistance;

    void Update(){
        Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out hit, jumpMaxDistance);
        if (hit.collider.gameObject.tag == "RichPoint") {
            print (hit.collider.transform.position);
        }
    }
}
你做错了3件事:

1。在光线投射之前,您没有检查是否按下鼠标

2。在打印对象位置之前,您没有检查
物理.Raycast
是否命中任何对象

3。您在函数外部定义了
hit
变量。这不是一个好主意,因为它仍然会存储鼠标击中的旧对象。在update函数中声明

修复

void Update()
{
    //Check if mouse is clicked
    if (Input.GetMouseButtonDown(0))
    {
        RaycastHit hit;

        //Get ray from mouse postion
        Ray rayCast = Camera.main.ScreenPointToRay(Input.mousePosition);

        //Raycast and check if any object is hit
        if (Physics.Raycast(rayCast, out hit, jumpMaxDistance))
        {
            //Check which tag is hit
            if (hit.collider.CompareTag("RichPoint"))
            {
                print(hit.collider.transform.position);
            }
        }
    }
}

不管怎样,这个答案是为了告诉你你做错了什么。你应该不要使用这个。为此,请使用Unity新的
EventSystems
。检查答案中的3D对象(网格渲染器/任何3D碰撞器)的5,了解检测单击对象的正确方法。

哪行代码导致了该错误?双击Unity编辑器中的错误,它会将您带到该行。在尝试获得
命中之前,您应该检查
物理.Raycast
的结果。检查
hit
是否为空。然后检查
hit.collider
是否为空。然后检查hit.collider.gameObject
是否为空。它工作了!你救了我!非常感谢你!。我有一个小问题。你要花多少时间才能学会编程…我一个月前就开始了,我只是好奇,只是想知道我的动机。有人说是2年6个月左右。事实上,你是否擅长编程取决于你花在编程上的时间。每天都这样做。学习新的东西,和会编程的人交朋友。也向他们学习。每周做一个随机的项目。这取决于你。如果你在学校,问你的教授如何改进你做的每个项目/家庭作业的代码。如果你每天都这样做,5个月就可以了。很好的建议。谢谢!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JumpDestination : MonoBehaviour {

    private RaycastHit hit;
    public float jumpMaxDistance;

    void Update(){
        Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out hit, jumpMaxDistance);
        if (hit.collider.gameObject.tag == "RichPoint") {
            print (hit.collider.transform.position);
        }
    }
}