当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • 3D鼠标位置检测类
  • 2D鼠标检测类
  • 调用示例
  • 专栏推荐
  • 完结

前言

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

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

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

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

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

3D鼠标位置检测类

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鼠标检测类

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;}
}

调用示例

// 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,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

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

http://www.dtcms.com/a/309173.html

相关文章:

  • 8.1每日一题
  • (线段树)SP2916 GSS5 / nfls #2899 查询最大子段和 题解
  • STL进阶典题整理 2025.7.30-2025.8.1
  • 关于继承的一些知识(C++)
  • react-native在mac的m2芯片下,pod install安装glog的时候报错
  • bmcweb工作流程
  • 【科研绘图系列】R语言绘制环状分组显著性柱状堆积图
  • Spring AI 系列之三十 - Spring AI Alibaba-其它模型
  • CSS font-weight:500不生效
  • Git 命令使用指南:从入门到进阶
  • 动态规划(数位统计dp 状态压缩dp 树形dp 记忆化搜索) from y总
  • 【C语言】字符函数与字符串函数详解
  • http请求访问响应慢问题解决的基本思路
  • 基于python大数据的招聘数据可视化及推荐系统
  • natapp的报错Tunnel StatusReconnecting...
  • STM32芯片简述
  • 使用GPU和NPU视频生成的优劣对比
  • 人工智能与金融:金融服务的重塑
  • Linux9 root密码修改
  • armbian 启用nginx并设置访问密码
  • CTF实战:用Sqlmap破解表单输入型SQL注入题(输入账号密码/usernamepassword)
  • SpringBoot AI应用实战:从图像识别到预测分析
  • 【通用视觉框架】基于OpenCvSharp+WPF+YOLO开发的仿VisionMaster的通用视觉框架软件,全套源码,开箱即用
  • 机器人芯片:智能机器的“大脑”与未来趋势
  • Nature Machine Intelligence 面向机器人操作有效滑移控制的仿生轨迹模块
  • alaxea机器人由星海图人工智能科技有限公司研发的高性能仿人形机器人
  • 【LeetCode 热题 100】155. 最小栈
  • PL-0功能拓展及基于VSCode的IDE配置
  • kotlin语法和特性分析
  • PDFsam免费开源!PDF分割合并工具