前言
在现代游戏开发中,鼠标交互是最基础也最核心的功能之一。无论是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
}
专栏推荐
完结
好了,我是向宇
,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!