【unity小技巧】封装unity适合2D3D进行鼠标射线检测,获取鼠标位置信息检测工具类

文章目录

前言

在现代游戏开发中,鼠标交互是最基础也最核心的功能之一。无论是RTS游戏的单位选择、FPS游戏的武器瞄准,还是RPG游戏的物品拾取,几乎所有的PC端游戏都离不开精确的鼠标位置检测。

为此,我精心设计了这套Mouse3D和Mouse2D工具类,,它将为你带来三大核心优势:

  • 开箱即用:封装了最完善的鼠标检测逻辑,无需重复造轮子

  • 全场景覆盖:同时支持3D和2D游戏开发需求

  • 高性能实现:采用最优化的物理检测方式,确保运行效率

3D鼠标位置检测类

csharp 复制代码
using UnityEngine;

public static class Mouse3D 
{
    private static Camera _mainCamera;
    
    private static Camera MainCamera
    {
        get
        {
            if (_mainCamera == null)
                _mainCamera = Camera.main;
            return _mainCamera;
        }
    }

    /// <summary>
    /// 获取鼠标在3D世界中的位置
    /// </summary>
    /// <param name="layerMask">要检测的层级(默认为所有层)</param>
    /// <param name="maxDistance">最大检测距离</param>
    /// <returns>鼠标的世界坐标,如果没有命中则返回null</returns>
    public static Vector3? GetMouseWorldPosition(LayerMask? layerMask = null, float maxDistance = Mathf.Infinity)
    {
        if (MainCamera == null) return null;
        
        Ray ray = MainCamera.ScreenPointToRay(Input.mousePosition);
        
        if (Physics.Raycast(ray, out RaycastHit hit, maxDistance, layerMask ?? ~0))
        {
            return hit.point;
        }

        return null;
    }

    /// <summary>
    /// 获取鼠标在3D世界中的命中信息
    /// </summary>
    /// <param name="hitInfo">射线命中信息</param>
    /// <param name="layerMask">层级掩码(默认为所有层)</param>
    /// <param name="maxDistance">最大检测距离</param>
    /// <returns>是否命中物体</returns>
    public static bool TryGetMouseHitInfo(out RaycastHit hitInfo, LayerMask? layerMask = null, float maxDistance = Mathf.Infinity)
    {
        hitInfo = default;
        if (MainCamera == null) return false;
        
        Ray ray = MainCamera.ScreenPointToRay(Input.mousePosition);
        return Physics.Raycast(ray, out hitInfo, maxDistance, layerMask ?? ~0);
    }
}

2D鼠标检测类

csharp 复制代码
using UnityEngine;

public static class Mouse2D 
{
    private static Camera _mainCamera;
    
    private static Camera MainCamera
    {
        get
        {
            if (_mainCamera == null)
                _mainCamera = Camera.main;
            return _mainCamera;
        }
    }

    /// <summary>
    /// 获取鼠标在2D世界中的位置
    /// </summary>
    /// <param name="layerMask">要检测的层级(默认为所有层)</param>
    /// <param name="maxDistance">最大检测距离</param>
    /// <returns>鼠标的世界坐标,如果没有命中则返回null</returns>
    public static Vector3? GetMouseWorldPosition(LayerMask? layerMask = null, float maxDistance = Mathf.Infinity)
    {
        if (MainCamera == null) return null;
        
        Vector3 mousePos = Input.mousePosition;
        mousePos.z = -MainCamera.transform.position.z;
        Ray ray = MainCamera.ScreenPointToRay(mousePos);

        RaycastHit2D hit = Physics2D.GetRayIntersection(ray, maxDistance, layerMask ?? ~0);

        if (hit.collider != null)
        {
            return hit.point;
        }

        return null;
    }

    /// <summary>
    /// 获取鼠标在2D世界中的命中信息
    /// </summary>
    /// <param name="hitInfo">射线命中信息</param>
    /// <param name="layerMask">层级掩码(默认为所有层)</param>
    /// <param name="maxDistance">最大检测距离</param>
    /// <returns>是否命中物体</returns>
    public static bool TryGetMouseHitInfo(out RaycastHit2D hitInfo, LayerMask? layerMask = null, float maxDistance = Mathf.Infinity)
    {
        hitInfo = default;
        if (MainCamera == null) return false;
        
        Vector3 mousePos = Input.mousePosition;
        mousePos.z = -MainCamera.transform.position.z;
        Ray ray = MainCamera.ScreenPointToRay(mousePos);

        hitInfo = Physics2D.GetRayIntersection(ray, maxDistance, layerMask ?? ~0);
        return hitInfo.collider != null;
    }
}

调用示例

csharp 复制代码
// 3D 使用
Vector3? mousePos = Mouse3D.GetMouseWorldPosition(LayerMask.GetMask("Ground"));
if (mousePos.HasValue)
{
    // 使用 mousePos.Value
}

// 2D 使用
if (Mouse2D.TryGetMouseHitInfo(out var hitInfo))
{
    // 使用 hitInfo
}

专栏推荐

地址
【unity游戏开发入门到精通------C#篇】
【unity游戏开发入门到精通------unity通用篇】
【unity游戏开发入门到精通------unity3D篇】
【unity游戏开发入门到精通------unity2D篇】
【unity实战】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架/工具集开发】
【unity游戏开发------模型篇】
【unity游戏开发------InputSystem】
【unity游戏开发------Animator动画】
【unity游戏开发------UGUI】
【unity游戏开发------联网篇】
【unity游戏开发------优化篇】
【unity游戏开发------shader篇】
【unity游戏开发------编辑器扩展】
【unity游戏开发------热更新】
【unity游戏开发------网络】

完结

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

相关推荐
亚里随笔12 小时前
GenEnv:让AI智能体像人一样在_游戏_中成长
人工智能·游戏·llm·rl·agentic
weixin_4242946712 小时前
在Unity中,摄像机移动时出现“残影”或“闪烁”是常见问题,主要原因和处理方法。
unity·游戏引擎
孟无岐12 小时前
【Laya】Browser 使用说明
typescript·游戏引擎·游戏程序·laya
天人合一peng13 小时前
unity 3d 通过游戏对象的名子查到其对象
游戏·unity·游戏引擎
UnderTurrets13 小时前
A_Survey_on_3D_object_Affordance
pytorch·深度学习·计算机视觉·3d
Zhichao_9713 小时前
【UE5.3 C++】ARPG游戏 05-准备角色攻击的武器和动画
游戏·ue5
纯属个人爱好14 小时前
Unity2020+PicoNeo3Pro开发
unity·vr
Hao_Harrision15 小时前
50天50个小项目 (React19 + Tailwindcss V4) ✨| ThreeDBackgroundBoxes(3D背景盒子组件)
前端·3d·typescript·react·tailwindcss·vite7
GOSIM 全球开源创新汇17 小时前
科班出身+跨界双轨:陈郑豪用 AI 压缩技术,让 4K 游戏走进普通设备|Open AGI Forum
人工智能·游戏·agi
__water17 小时前
RHK《Unity接入DeepSeek问答》
unity·游戏引擎·智能问答·deepseek接入·deepseekapikey