unity相机的三种模式,UGUI坐标与鼠标之间的变换

首先是canvas的第一种渲染模式,全覆盖,顾名思义就是UGUI覆盖在任何的物体之上,适用于做一些普通的开发,这时候我们的UI坐标跟我们的屏幕坐标相同,

Vector2 mouseInput;
    public Text _text;

    public void Test()
    {

        if(Input.GetMouseButtonDown(0))
        {
            //鼠标点击的即为屏幕坐标,最简单的text组件跟随鼠标
            mouseInput = Input.mousePosition;
            _text.transform.position = mouseInput;
        }

      
        
    }

    private void Update()
    {
        Test();
    }

下面这种方式利用屏幕空间的本地坐标解决

public void Test()
    {
        mouseInput = Input.mousePosition;

        //因为在ui坐标里,我们的锚点原因,需要把求出中心所在,不然回出现,位置出现一定偏差,当然我们定义一个offest也可以解决
        Vector2 screenSize = new Vector2(Screen.width*0.5f, Screen.height*0.5f);
        if(Input.GetMouseButtonDown(0))
        {
            
            _text.transform.localPosition= mouseInput-screenSize;
        }
 
    }

    private void Update()
    {
        Test();
    }

但是在我们的开发当中,一般要让场景的物体显示在UI之前,那么我们就不能使用刚刚的那种渲染模式,换成第二种即为屏幕空间-摄像机渲染,这种渲染模式存在单独的UI坐标,,转化起来相对麻烦,但是我们可能使用localPosition这一个参数实现坐标转化,这种渲染模式所渲染出来的图像取决于order layer与sorting layer的深度值。这个是基于视口坐标转化的,原理同上,只不过是把视口坐标映射到屏幕坐标上呢

 Vector2 mouseInput;
    public Text _text;

    public void Test()
    {
        mouseInput = Input.mousePosition;

        Vector2 screenPos = Camera.main.ScreenToWorldPoint(mouseInput);
        //Vector2 screenSize = new Vector2(Screen.width*0.5f, Screen.height*0.5f);
        Vector2 viewPos = Camera.main.ScreenToViewportPoint(mouseInput);//把屏幕坐标给到视口坐标
        Vector2 ss = viewPos * new Vector2(Screen.width*0.5f, Screen.height*0.5f);//视口坐标*屏幕分辨率
        if(Input.GetMouseButtonDown(0))
        {
            
            _text.transform.localPosition= mouseInput- ss;
        }
 
    }

    private void Update()
    {
        Test();
    }

讲世界空间的物体转化为屏幕空间,进而进行跟随,原理同第一个,不描述

在canvas的第三种渲染模式下,世界空间下面转化,但是会出现偏移,需要自行加上一个offest进行调节,渲染模式世界模式下的渲染,决定为death,距离摄像机的远近渲染

public void Test()
    {
        mouseInput = Input.mousePosition;

        Vector2 screenPos = Camera.main.ScreenToWorldPoint(mouseInput);

        Vector2 worldPos = Camera.main.ScreenToWorldPoint(screenPos);
        if(Input.GetMouseButtonDown(0))
        {

            _text.transform.position = new Vector3(worldPos.x, worldPos.y, _text.transform.root.transform.position.z)+offest;

        }
 
    }

    private void Update()
    {
        Test();
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值