📜  unity get gameobject from hit - (1)

📅  最后修改于: 2023-12-03 15:20:51.868000             🧑  作者: Mango

Unity中使用Raycast获取点击位置的GameObject

在Unity中,我们可以使用Raycast来获取鼠标点击或触摸位置的GameObject。本篇教程详细介绍了如何使用Raycast获取GameObject,并将其转化为C#代码片段,让程序员轻松实现:

第一步:创建一个空物体并赋予Collider组件

以一个简单的场景为例,在场景中创建一个Cube并为其添加一个Box Collider组件。此外,我们还需要在场景中创建一个空物体并为其添加一个Sphere Collider组件。代码如下:

using UnityEngine;

public class GetGameObjectFromHit : MonoBehaviour
{
    private void Start()
    {
        // 创建一个Cube并添加Box Collider组件
        GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        cube.AddComponent<BoxCollider>();

        // 创建一个空物体并添加Sphere Collider组件
        GameObject sphere = new GameObject();
        sphere.AddComponent<SphereCollider>();
    }
}
第二步:获取鼠标点击或触摸位置的GameObject

我们将使用Input类的GetMouseButtonDown方法检测鼠标左键是否按下,如果按下,则从鼠标点击的位置创建射线。接着,我们使用Physics.Raycast检测是否有GameObject与射线接触,并返回最近的GameObject。代码如下:

using UnityEngine;

public class GetGameObjectFromHit : MonoBehaviour
{
    private void Update()
    {
        // 检测鼠标左键
        if (Input.GetMouseButtonDown(0))
        {
            // 从鼠标点击的位置创建射线
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            // 检测是否有GameObject与射线接触
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                GameObject hitObject = hit.collider.gameObject;
                Debug.Log(hitObject.name);
            }
        }
    }
}

在上面的代码中,我们首先从鼠标点击的位置创建一个射线,然后使用Physics.Raycast检测射线是否与任何GameObject相交。如果有,则返回与射线相交的第一个GameObject的信息,并将其赋值给hitObject变量。最后,我们将该GameObject的名称打印到控制台中。

第三步:使用射线检测Layer

我们可以使用Raycast时还可以传递一个LayerMask参数,从而可以只检测特定的Layer。例如,在我们的场景中我们可以创建一个名为"Clickable"的Layer。然后,我们将通过Raycast来检测只与此Layer交互的GameObject。代码如下:

using UnityEngine;

public class GetGameObjectFromHit : MonoBehaviour
{
    private void Update()
    {
        // 检测鼠标左键
        if (Input.GetMouseButtonDown(0))
        {
            // 创建射线,并设置检测的Layer为"Clickable"
            int clickableLayer = 1 << LayerMask.NameToLayer("Clickable");
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit, Mathf.Infinity, clickableLayer))
            {
                GameObject hitObject = hit.collider.gameObject;
                Debug.Log(hitObject.name);
            }
        }
    }
}

在上面的代码中,我们首先将"Clickable"图层转换为位掩码,然后将其传递给Physics.Raycast方法的第三个参数中。这里我们使用Mathf.Infinity作为射线长度的参数,以便忽略射线长度。

总的来说,使用Raycast获取鼠标点击或触摸位置的GameObject很容易实现,只需要创建一个射线并使用Physics.Raycast方法检测是否与GameObject相交即可。本篇教程通过代码和详细解释的方式,教会了各位程序员如何在Unity中实现此功能。