美文网首页
Unity 鼠标检测点击2D物体

Unity 鼠标检测点击2D物体

作者: Francis_Rose | 来源:发表于2020-11-23 15:51 被阅读0次

    准备一个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物体

          本文链接:https://www.haomeiwen.com/subject/cjkviktx.html