unity3d 鼠标屏幕位置_unity3d鼠标点击屏幕位置 - CSDN
  • unity3d中的屏幕坐标系 是以 屏幕 左下角为(0,0)点 右上角为(Screen.Width,Screen.Height) 鼠标位置坐标与屏幕坐标系一致 视口坐标是以摄像机为准 以屏幕的左下角为(0,0)点 右上角为(1,1)点 绘制GUI界面...

    unity3d中的屏幕坐标系 是以 屏幕  左下角为(0,0)点 右上角为(Screen.Width,Screen.Height)

    鼠标位置坐标与屏幕坐标系一致

    视口坐标是以摄像机为准  以屏幕的左下角为(0,0)点 右上角为(1,1)点

    绘制GUI界面时使用的坐标是以  屏幕  的左上角为(0,0)点 右下角为(Screen.width,Screen,Height)

    经常会用到 某个物体的世界坐标到屏幕坐标的转化然后再屏幕上绘制出这个物体的代表性图片

    是这样做的

    1、Vector3 ScreenPos=Camera.WorldToScreenPoint(trans.Position);

    2、GUIPos=new Vector3(ScreenPos.x,Screen.height-ScreenPos.y,0);

    然后按照这个坐标绘制图片就可以了


    //---------------------------

    Monobehaviour.OnMouseEnter()等适用于3维场景里的collider,(使用射线查询)

    Unity canvas UI上的按钮要实现拖拽等操作,最后继承IDragHandler等接口,重写OnDrag()等函数;

    展开全文
  • Unity3D由于是在三维世界中编程,而最终的结果是需要反馈到肉眼所示的2D屏幕之上的。这就产生了一种比较需要考虑的问题,尤其在一些涉及屏幕Unity3D的3D世界交互的情况。网络上对于这方面的文字,大部分罗列了许...

    Unity3D由于是在三维世界中编程,而最终的结果是需要反馈到肉眼所示的2D屏幕之上的。这就产生了一种比较需要考虑的问题,尤其在一些涉及屏幕与Unity3D的3D世界交互的情况。网络上对于这方面的文字,大部分罗列了许许多多文字与代码或者API,甚至连什么视口坐标也带上了。其实在于我个人看来,关键是世界坐标与屏幕坐标之间的互转。

    在Unity3D中一打开就会有一个主照相机Main Camera,根据版本不同的初始坐标会在不同的位置。拿Unity3D 4.x的(0,-1,-10)做例子,他的视距,默认是0.3~1000。


    主摄像机会对外无间断的发出投影面,将投影面所截取得到的东西,通通投影到屏幕。比如下图,这是一张极其简单的图,(0,-1,-10)的主摄像机将(0,0,0)的正方体投影出来的结果。


    现在这个正方体的世界坐标是(0,0,0),如果我们要获取屏幕坐标该怎么做呢?这注定需要用脚本来获取的,而且根据上面的示意图大家也可以知道,屏幕的大小的不同导致最后产生出来的屏幕坐标是不同的。因为Unity3D对屏幕坐标定义是这样的:


    以下脚本展示了屏幕坐标和世界坐标的互转:

    using UnityEngine;
    using System.Collections;
    
    public class CoordinateChange : MonoBehaviour
    {
        void Start()
        {
            Debug.Log("屏幕宽:" + Screen.width + "高:" + Screen.height);//获取屏幕的长和宽
            Vector2 screenPos = Camera.main.WorldToScreenPoint(new Vector3(0, 0, 0));//世界坐标(0,0,0),一般可以用transform.position获取->屏幕坐标
    
            //屏幕坐标->世界坐标
            Debug.Log(screenPos.x + "," + screenPos.y);
            Vector3 worldPos1 = Camera.main.ScreenToWorldPoint(new Vector3(0, 0, Camera.main.nearClipPlane));
            Debug.Log(worldPos1.x + "," + worldPos1.y + "," + worldPos1.z);
            Vector3 worldPos2 = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, -Camera.main.transform.position.z));
            Debug.Log(worldPos2.x + "," + worldPos2.y + "," + worldPos2.z);
        }
    }
    
    运行结果如下:


    上面脚本有几点需要说明的:

    1、Camera.main.XX能够直接对主摄像机操作,无须像网上部分文章需要利用的GameObject.Find之类的找主摄像机。

    2、世界坐标与屏幕坐标互转直接就是用WorldToScreenPoint/ScreenToWorldPoint两个方法,这方法凡是照相机对象就有。在部分设置多摄像机编程的程序,就是转换到调用的摄像机所对应的屏幕的世界。

    3、WorldToScreenPoint世界坐标转屏幕坐标,很好理解,大家也看到(0,0,0)这个世界的三维坐标转到的(431.5,174.4537)这个屏幕的二维坐标Vector2 screenPos。这里屏幕宽:863高:422,处于(0,0,0)的长方体被投影到屏幕的中央偏下的位置,这和实际是吻合的。

    当然实际操作中,其实这个屏幕坐标的多少对于我们来说是没意义的,但这个屏幕坐标所处的位置是在屏幕的百分之多少是很有意义的。所以,这一般还要配合Screen.width/height求屏幕的宽和高用。

    4、对于ScreenToWorldPoint,屏幕坐标转世界坐标,可能有人会有疑问,屏幕坐标不是一个二维坐标,怎么这里试图对一个三维坐标转换?还在Z轴附带一些奇怪奇怪的位置。这里的Z轴,是投影面底部所处的Z轴位置距离摄像机Z轴的多少。上面的投影示意图,已经可以说明投影面是多个的,但只会投影到一个2D屏幕平面而已,世界中的物体/对象只能有一个,那么就形成一种 一个世界坐标只会对应一个屏幕坐标,一个屏幕坐标可能对应多个世界坐标。所以我们要补上一个Z轴,告诉程序,我要的是哪个屏幕坐标。

    这里展示了将(0,0)这个左下角的屏幕坐标,转到距离摄像机最近的投影面上面,要拿这个投影面,如脚本所示,可以直接用Camera.main.nearClipPlane来取。还展示了将(Screen.width, Screen.height)这个右上角的屏幕坐标,放到Z轴为0,也就是世界屏幕的这个位置,因为摄像机所处的Z=-10,要放到世界坐标z=0,所以这里的Z轴要填上-Camera.main.transform.position.z,刚好就是-10-0。结果如上图所示。

    理论上,投影面距离摄像头越近,他的投影面越小。所以大家看到如果转到距离摄像机最近的投影面上面,边角的坐标是0.x级别的,放到z=0这个投影面上面,边角的坐标则去到个位数级别。

    展开全文
  • 不管我鼠标怎么移动,他的坐标值一直不变,因此得到的并不是正确的世界坐标点, 解决方案: Vector3 pos = Input.mousePosition; pos.z = 10f; //这里的数值会有影响 具体应该怎么设置还没搞懂 print(Camera.main

    一般的使用ScreenToWorldPoint的API去转换坐标,但是转换的时候发现一个问题,如下:

        print(Camera.main.ScreenToWorldPoint(Input.mousePosition));
    

    不管我鼠标怎么移动,他的坐标值一直不变,因此得到的并不是正确的世界坐标点,
    解决方案:

        Vector3 pos = Input.mousePosition;
    	pos.z = 10f; //这里的数值会有影响 具体应该怎么设置还没搞懂
    	print(Camera.main.ScreenToWorldPoint(pos));
    
    测试代码:
       void Update()
        {
            Vector3 pos = Input.mousePosition;
            pos.z = 10f;
            Vector3 mouGlobalPos = Camera.main.ScreenToWorldPoint(pos);
            gb.position = mouGlobalPos;
    	}
    

    区别: pos.z 为 10f的时候
    在这里插入图片描述

    而5f的时候
    在这里插入图片描述
    有人知道这个z 应该怎么设置吗

    展开全文
  • https://www.cnblogs.com/yanghui0702/p/yanghui20180521.html
    展开全文
  • 以前转载了一篇关于在Unity3d鼠标控制物体的旋转、移动、缩放的代码 然后发现错误比较多,就重新写了一个代码,自我感觉简单实用。。。特意分享出来供大家参考 原文章也贴出来吧 【Unity3d 鼠标滚动拉近模型、鼠标...

    一、前言

    以前转载了一篇关于在Unity3d中鼠标控制物体的旋转、移动、缩放的代码
    然后发现错误比较多,就重新写了一个代码,自我感觉简单实用。。。特意分享出来供大家参考
    原文章也贴出来吧
    【Unity3d 鼠标滚动拉近模型、鼠标右键旋转模型、鼠标中键拖拽模型】
    https://blog.csdn.net/q764424567/article/details/78630649

    效果图:
    在这里插入图片描述

    二、知识点

    • Input.GetMouseButton(0)
      获取鼠标输入,参数为一个int值
      为0的时候获取的是左键

    • Input.GetMouseButton(1)
      为1的时候获取的是右键

    • Input.GetMouseButton(2)
      为2的时候获取的是中键(就是那个滑轮)

    • Input.GetMouseButton
      鼠标按压

    • Input.GetMouseButtonUp
      鼠标点击

    • Input.GetMouseButtonDown
      鼠标松开

    • Camera.main.ScreenToWorldPoint
      屏幕坐标转化为世界坐标

    • Quaternion rotation = Quaternion.Euler(0, 0, 0);
      欧拉角转化为四元数

    三、代码分享

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class MouseControlModel : MonoBehaviour
    {
        //旋转最大角度
        public int yMinLimit = -20;
        public int yMaxLimit = 80;
        //旋转速度
        public float xSpeed = 250.0f;
        public float ySpeed = 120.0f;
        //旋转角度
        private float x = 0.0f;
        private float y = 0.0f;
    
        void Update()
        {
            if (Input.GetMouseButton(0))
            {
                //将屏幕坐标转化为世界坐标  ScreenToWorldPoint函数的z轴不能为0,不然返回摄像机的位置,而Input.mousePosition的z轴为0
                //z轴设成10的原因是摄像机坐标是(0,0,-10),而物体的坐标是(0,0,0),所以加上10,正好是转化后物体跟摄像机的距离
                Vector3 temp = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10));
                transform.position = temp;
            }
            else if (Input.GetMouseButton(1))
            {
                //Input.GetAxis("MouseX")获取鼠标移动的X轴的距离
                x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
                y = ClampAngle(y, yMinLimit, yMaxLimit);
                //欧拉角转化为四元数
                Quaternion rotation = Quaternion.Euler(y, x, 0);
                transform.rotation = rotation;
            }
            else if (Input.GetAxis("Mouse ScrollWheel") != 0)
            {
                //鼠标滚动滑轮 值就会变化
                if (Input.GetAxis("Mouse ScrollWheel") < 0)
                {
                    //范围值限定
                    if (Camera.main.fieldOfView <= 100)
                        Camera.main.fieldOfView += 2;
                    if (Camera.main.orthographicSize <= 20)
                        Camera.main.orthographicSize += 0.5F;
                }
                //Zoom in  
                if (Input.GetAxis("Mouse ScrollWheel") > 0)
                {
                    //范围值限定
                    if (Camera.main.fieldOfView > 2)
                        Camera.main.fieldOfView -= 2;
                    if (Camera.main.orthographicSize >= 1)
                        Camera.main.orthographicSize -= 0.5F;
                }
            }
        }
    
        //角度范围值限定
        static float ClampAngle(float angle, float min, float max)
        {
            if (angle < -360)
                angle += 360;
            if (angle > 360)
                angle -= 360;
            return Mathf.Clamp(angle, min, max);
        }
    }
    
    

    谢谢大家!

    展开全文
  • //将物体从世界坐标转换为屏幕坐标 Vector3 mousePositionOnScreen;//获取到点击屏幕屏幕坐标 Vector3 mousePositionInWorld;//将点击屏幕屏幕坐标转换为世界坐标 void Update() { MouseFollow(); }
  • 想要获取鼠标屏幕的准确点击位置,千万不要胡乱写,什么转化坐标系,什么Ray射线检测都是浮云。 1,转化坐标系只是相对而言,并不能准确实现当前鼠标点击在屏幕位置; 2,Ray检测,hit是需要碰撞的,没碰撞,...
  • unity3d判断鼠标左右滑动,响应不同事件
  • 写在前面:本人初学unity3D,仅仅是菜鸟的一点小心得,想记录下来,欢迎大神来指导,也欢迎其他初学者同学来交流,互相勉励,共同进步 unity中有关于鼠标位置的函数,Input.mousePosition。但不得不说,这个函数不...
  • 下面举一个简单的例子说明在Unity3D如何用键盘鼠标控制视角的移动的。如下图所示: 就像大部分游戏一样,可以用鼠标滚轮控制视角的远近,键盘的wasd和上下左右控制镜头的位置,而按着鼠标右键则可以控制镜头的旋转...
  • 这是一个unity3D一个鼠标控制自由浏览场景C#代码。实现的是鼠标左键拖拽使得屏幕看到的场景旋转,鼠标滚轴滑动就拉近拉远场景,鼠标滚轴按下滑动就是上下左右移动屏幕看到的场景。导入到unity3D你得项目中,把他绑定...
  • 作为一个新人,我也来发表一篇文章,大早上的通过unity3d来给大家分享一下我自己做的小demo; 首先获取鼠标屏幕上点击的那个点的坐标,在这里要用到input类中的MouseButtonDown()这个方法来获得鼠标的左键...
  • 需求:制作一个鼠标中键移动缩放和鼠标右键旋转的功能(鼠标右键旋转可以自行改成鼠标左键旋转) 效果图: 1.新建一个名为Target的立方体cube 2.新建一个材质球 Yellow颜色的并挂载到Target立方体上 3...
  • Unity3D改变鼠标样式很简单,直接就封装好方法,以满足在游戏里面定制自己的鼠标样式的需求。下面举一个例子来说明这个问题。我需要将光标改成如下的形状: 注意这张图片是经过处理的png,白色的地方都用photo...
  • Unity3D鼠标点击地面特效Real-time Strategy FX v1.0,类似英雄联盟的点击特效
  • Unity3D鼠标拖拽绕任意轴旋转的实现
  • 想要获取鼠标屏幕的准确点击位置,千万不要胡乱写,什么转化坐标系,什么Ray射线检测都是浮云。 1,转化坐标系只是相对而言,并不能准确实现当前鼠标点击在屏幕位置; 2,Ray检测,hit是需要碰撞的,没碰撞,...
  • Unity3D鼠标控制摄像机“左右移动控制视角+WASD键盘控制前后左右+空格键抬升高度”脚本
  • unity3d改变鼠标的样式 设置光标形状 用GUI实现的可能效率有点差 能播动画图标 基本上现在的作法也只有这样了 不然网页上不能用 还要考虑多平台的问题
  • 很多时候,我们都需要屏幕坐标与世界空间坐标进行转换,比如鼠标的实时位置映射到世界坐标。那很多人就说了,不就是直接用Camera.main.ScreenToWorldPoint()方法就好了吗。嗯,没错,但我要讲的不止这些。 先想这样...
1 2 3 4 5 ... 20
收藏数 3,871
精华内容 1,548
关键字:

unity3d 鼠标屏幕位置