摘要:在Unity游戏开发中,获取鼠标点击的世界坐标是一项基本技能,它能够帮助你实现各种交互功能,如角色移动、物体放置等。本文将详细介绍如何在Unity中使用射线投射技术来获取鼠标点击的世界坐标,并提供完整的代码示例。适合Unity初学者和进阶开发者阅读。

一、准备工作

确保Unity项目中满足以下条件:

1.一个主摄像机(Camera.main),用于捕捉屏幕上的鼠标位置

2.一个或多个场景中的物体,以便我们可以测试射线投射

二、Raycast

Raycast(射线检测) 是 Unity Physics 系统提供的一种检测方法,它可以模拟一条从某个起点发出的射线,并返回射线与物体的碰撞信息。这在鼠标点击交互、射击检测、导航路径计算等功能中非常有用

Raycast 的基本用法

bool Physics.Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask);
  • origin:射线的起点

  • direction:射线的方向(通常是 Vector3.forwardScreenPointToRay 计算得到)

  • hitInfo:返回的碰撞信息

  • maxDistance:射线检测的最大距离(可选)

  • layerMask:检测的层级(可选)

三、代码实现

public class PlayerControl : MonoBehaviour
{
    private RaycastHit _hitPoint; // 存储射线检测的碰撞点
    
    void Update()
    {
        // 从摄像机位置向鼠标指针方向发射一条射线
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        // 检测射线是否击中了物体
        if (Physics.Raycast(ray, out _hitPoint))
        {
            // 检测是否按下了鼠标左键,并确保射线检测到的物体不为空
            if (Input.GetMouseButtonDown(0) && _hitPoint.collider != null)
            {
                // 判断是否点击到了地面
                if (_hitPoint.collider.gameObject.CompareTag("Ground"))
                {
                    Debug.Log("点击了地面:" + _hitPoint.point);
                }
            }
        }
    }
}

代码解析

Camera.main.ScreenPointToRay(Input.mousePosition)

  • 该方法从 摄像机位置鼠标点击位置 发出一条射线,用于检测玩家点击了什么物体

Physics.Raycast(ray, out _hitPoint)

  • Physics.Raycast() 方法用于检测射线是否击中了某个对象,并将结果存储在 _hitPoint 变量中

_hitPoint.collider.gameObject.CompareTag("Ground")

  • 确保玩家点击的是地面,而不是其他物体
Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐