Unity 鼠标检测点击2D物体

准备一个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;
            }
        }
    }
}

这段代码有两个问题:

  1. 如果使用isPressed来检测,检测频率会非常高,通常不需要
  2. 使用 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

你可能感兴趣的:(Unity 鼠标检测点击2D物体)