Unity 鼠标检测点击2D物体
2020-11-23 本文已影响0人
Francis_Rose
准备一个2D的sprite,添加BoxCollider2D,如下
image.png
输入模块使用Unity新的输入系统即Input System,需要在PackageManager中导入,具体使用流程参考官网文档。
检测原理是使用Unity的2D物理模块的射线检测函数,即Physics2D.Raycast(),具体实现
using UnityEngine.InputSystem;
public class TestInputScript : MonoBehaviour
{
// Update is called once per frame
void Update()
{
var mouse = Mouse.current;
if(mouse == null)
{
return;
}
if(mouse.leftButton.isPressed)
{
var onScreenPosition = mouse.position.ReadValue();
var ray = Camera.main.ScreenPointToRay(onScreenPosition);
var hit = Physics2D.Raycast(new Vector2(ray.origin.x, ray.origin.y), Vector2.zero, Mathf.Infinity);
if(hit.collider != null)
{
Debug.Log(hit.collider.gameObject.name);
hit.collider.gameObject.transform.position = ray.origin;
}
}
}
}
这段代码有两个问题:
- 如果使用isPressed来检测,检测频率会非常高,通常不需要
- 使用 Physics2D.Raycast()函数方式比较怪,只是用了射线中的一部分,查找了下API,还可以使用Physics2D.GetRayIntersection()来处理,这个可以酌情使用。
对于问题一,比较倾向于用mouse.leftButton.wasPressedThisFrame来判断,每一帧处理一次,应该足够了。
if(mouse.leftButton.wasPressedThisFrame)
{
var onScreenPosition = mouse.position.ReadValue();
var ray = Camera.main.ScreenPointToRay(onScreenPosition);
var hit = Physics2D.Raycast(new Vector2(ray.origin.x, ray.origin.y), Vector2.zero, Mathf.Infinity);
if(hit.collider != null)
{
Debug.Log(hit.collider.gameObject.name);
hit.collider.gameObject.transform.position = ray.origin;
}
}
image.png