unity 2d 四大坐标系问题 鼠标点击位置问题 详细入门解析
2014-07-28 20:25
861 查看
首先,unity2d中的camera有四大坐标系你需要了解清楚:
A Camera is a device through which the player views the world.
A screen space point is defined in pixels. The bottom-left of the screen is (0,0); the right-top is (pixelWidth,pixelHeight).
The z position is in world units from the camera.
A viewport space point is normalized and relative to the camera. The bottom-left of the camera is (0,0); the top-right is (1,1). The z position is in world units from the camera.
A world space point is defined in global coordinates (eg. Transform.position).
翻译:
摄像机是玩家观看世界的入口。
屏幕空间:以像素为单位,屏幕的左下为(0,0);右上是(PixelWidth,pixelHeight),z轴的值与camera相同。注意:鼠标位置坐标属于屏幕坐标,但Input.mousePosition获得的位置坐标是世界坐标,z轴值为0,需要转换,见下文。
视口空间:与camera相关的归一化坐标,相机的左下角为(0,0)点,右上角为(1,1)点,z轴的值与camera相同。(用的不多
世界空间:普遍坐标系,是场景中物体的3D实际位置。注意:transform.position 的值默认是代码所贴附的物体的位置。
第四个坐标系是 绘制GUI界面的坐标系:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。
他们之间有转换关系,如下:
世界坐标→屏幕坐标:camera.WorldToScreenPoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。
屏幕坐标→视口坐标:camera.ScreenToViewportPoint(Input.GetTouch(0).position);这样可以将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。
视口坐标→屏幕坐标:camera.ViewportToScreenPoint();
视口坐标→世界坐标:camera.ViewportToWorldPoint();
可以用以上代码来了解这些坐标系的区别
下面介绍 unity2d 如何获取鼠标位置/如何实现点击哪里就在哪里生成一个新物体/获取点击位置/点击位置转换
1、在默认写好的Update函数中,先获取相机的z轴位置,(由于我们是2d界面,可能玩法跟3d编程有所出入)
2、
3、
来把刚刚取到的camera z轴坐标值赋给鼠标点击坐标,只有这时的值才是真正你在屏幕点击的位置,可以想像,触摸位置是屏幕,所以我们获取的点击位置只有在屏幕坐标下才是有效的,这一步就将世界坐标下的mousePosition转化到了屏幕坐标下;
4、
由于生成新的物体,位置一定是世界坐标系下的才有利于游戏开发,因为标准相同,普遍适用,所以我们放置新的物体也要将物体坐标转化为世界坐标,即
这样得到了鼠标点击位置在世界坐标系下的坐标,由于是2d游戏,我们不涉及射线定位了,放置新物体也统一默认放置在世界坐标x-y平面,z轴值为0;
5、
6、
http://docs.unity3d.com/ScriptReference/Camera.html http://blog.csdn.net/yanzhanyi/article/details/38235145
官方对unity camera的描述:
DescriptionA Camera is a device through which the player views the world.
A screen space point is defined in pixels. The bottom-left of the screen is (0,0); the right-top is (pixelWidth,pixelHeight).
The z position is in world units from the camera.
A viewport space point is normalized and relative to the camera. The bottom-left of the camera is (0,0); the top-right is (1,1). The z position is in world units from the camera.
A world space point is defined in global coordinates (eg. Transform.position).
翻译:
摄像机是玩家观看世界的入口。
屏幕空间:以像素为单位,屏幕的左下为(0,0);右上是(PixelWidth,pixelHeight),z轴的值与camera相同。注意:鼠标位置坐标属于屏幕坐标,但Input.mousePosition获得的位置坐标是世界坐标,z轴值为0,需要转换,见下文。
视口空间:与camera相关的归一化坐标,相机的左下角为(0,0)点,右上角为(1,1)点,z轴的值与camera相同。(用的不多
世界空间:普遍坐标系,是场景中物体的3D实际位置。注意:transform.position 的值默认是代码所贴附的物体的位置。
第四个坐标系是 绘制GUI界面的坐标系:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。
他们之间有转换关系,如下:
世界坐标→屏幕坐标:camera.WorldToScreenPoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。
屏幕坐标→视口坐标:camera.ScreenToViewportPoint(Input.GetTouch(0).position);这样可以将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。
视口坐标→屏幕坐标:camera.ViewportToScreenPoint();
视口坐标→世界坐标:camera.ViewportToWorldPoint();
转换函数一共六种,详见下面的测试代码:
// print("Input.mousePosition: " + Input.mousePosition ); // print("Input.mousePosition world to viewport: " + Camera.main.WorldToViewportPoint(Input.mousePosition )); // print("Input.mousePosition world to screen: " + Camera.main.WorldToScreenPoint(Input.mousePosition)); // print("Input.mousePosition Viewport To Screen: " + Camera.main.ViewportToScreenPoint(Input.mousePosition )); // print("Input.mousePosition Viewport To World: " + Camera.main.ViewportToWorldPoint(Input.mousePosition)); // print("Input.mousePosition Screen To Viewport " + Camera.main.ScreenToViewportPoint(Input.mousePosition )); // print("Input.mousePosition Screen To World: " + Camera.main.ScreenToWorldPoint(Input.mousePosition)); // print("-------------------" );
可以用以上代码来了解这些坐标系的区别
下面介绍 unity2d 如何获取鼠标位置/如何实现点击哪里就在哪里生成一个新物体/获取点击位置/点击位置转换
获取鼠标位置,放置新物体:
void Update () { screenPosition = Camera.main.WorldToScreenPoint(transform.position); mousePositionOnScreen = Input.mousePosition; mousePositionOnScreen.z = screenPosition.z; mousePositionInWorld = Camera.main.ScreenToWorldPoint(mousePositionOnScreen); if (Input .GetMouseButtonDown(0)) { Instantiate (Soldier, mousePositionInWorld , Quaternion.identity); } }
1、在默认写好的Update函数中,先获取相机的z轴位置,(由于我们是2d界面,可能玩法跟3d编程有所出入)
2、
transform.position是我代码所依附的空物体的位置,无所谓在哪,用了WorldToScreenPoint函数之后它的z轴值变为跟camera一样,我们只用z轴的值;
3、
Input.mousePosition虽然属于屏幕坐标,但它的z轴值不是屏幕坐标系的z轴值,所以我们用
mousePositionOnScreen.z = screenPosition.z;
来把刚刚取到的camera z轴坐标值赋给鼠标点击坐标,只有这时的值才是真正你在屏幕点击的位置,可以想像,触摸位置是屏幕,所以我们获取的点击位置只有在屏幕坐标下才是有效的,这一步就将世界坐标下的mousePosition转化到了屏幕坐标下;
4、
由于生成新的物体,位置一定是世界坐标系下的才有利于游戏开发,因为标准相同,普遍适用,所以我们放置新的物体也要将物体坐标转化为世界坐标,即
mousePositionInWorld = Camera.main.ScreenToWorldPoint(mousePositionOnScreen);
这样得到了鼠标点击位置在世界坐标系下的坐标,由于是2d游戏,我们不涉及射线定位了,放置新物体也统一默认放置在世界坐标x-y平面,z轴值为0;
5、
Input .GetMouseButtonDown(0)感知鼠标点击,触发条件;
6、
Instantiate (Soldier, mousePositionInWorld , Quaternion.identity);生成新物体。
参考文章:
http://www.juziku.com/wiki/53595.htmhttp://docs.unity3d.com/ScriptReference/Camera.html http://blog.csdn.net/yanzhanyi/article/details/38235145
相关文章推荐
- Unity获取鼠标点击位置,物体朝鼠标点击处移动
- [求助]关于在状态栏显示自定义坐标系下鼠标指针所在位置坐标的问题
- unity实现鼠标点击位置小脚印标志
- Unity中UGUI中获取鼠标点击位置以及UI物体的屏幕坐标
- Unity 将UI放置在鼠标点击位置的位置
- 我的Unity(1)一点一滴 鼠标点击任意位置,物体移动到该位置。
- Unity中物体如何移动到鼠标点击位置
- Unity 鼠标点击位置转换成UI坐标
- javascript窗口宽高,鼠标位置,滚动高度(详细解析)
- 【Unity 3D学习】鼠标点击控制人物移动到目标位置
- unity 2D中的向着鼠标点击方向进行射击
- Unity移动物体到鼠标点击位置
- Unity中获取鼠标位置,且点击鼠标右键则在点击位置显示物体
- Android Studio 光标位置不在行首,而是跟随鼠标点击位置 问题解决
- unity 在鼠标点击位置生成物体
- unity 从相机的位置发射小球并打到鼠标点击的位置
- 关于获取鼠标点击的位置的问题
- unity 2d鼠标拖动卡牌运动,发现鼠标与物体的实际运行位置不一致
- Unity2D - 5. 向鼠标点击处发射子弹
- javascript窗口宽高,鼠标位置,滚动高度(详细解析)