开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:606

当前位置:游戏蛮牛 技术专区 教程分享

查看: 5634|回复: 2

[入门教程] unity 2d 四大坐标系问题 鼠标点击位置问题 详细入门解析

[复制链接]  [移动端链接]
抢楼 抢楼 本帖为抢楼帖,欢迎抢楼! 
排名
3785
昨日变化
1

474

主题

540

帖子

2545

积分

Rank: 16

UID
35857
好友
0
蛮牛币
2976
威望
0
注册时间
2014-7-23
在线时间
330 小时
最后登录
2016-11-15
发表于 2015-7-29 13:47:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
首先,unity中的camera有四大坐标系你需要了解清楚:
官方对unity camera的描述:
Description

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();

转换函数一共六种,详见下面的测试代码:
[JavaScript] 纯文本查看 复制代码
[csharp] view plaincopyprint?

    //          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 如何获取鼠标位置/如何实现点击哪里就在哪里生成一个新物体/过去点击位置/点击位置转换
获取鼠标位置,放置新物体:
[JavaScript] 纯文本查看 复制代码
[csharp] view plaincopyprint?

    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、是我代码所依附的空物体的位置,无所谓在哪,用了WorldToScreenPoint函数之后它的z轴值变为跟camera一样,我们只用z轴的值;


[JavaScript] 纯文本查看 复制代码
[csharp] view plaincopyprint?

    transform.position  


3、虽然属于屏幕坐标,但它的z轴值不是屏幕坐标系的z轴值,所以我们用来把刚刚取到的camera z轴坐标值赋给鼠标点击坐标,只有这时的值才是真正你在屏幕点击的位置,可以想像,触摸位置是屏幕,所以我们获取的点击位置只有在屏幕坐标下才是有效的,这一步就将世界坐标下的mousePosition转化到了屏幕坐标下;

[JavaScript] 纯文本查看 复制代码
[csharp] view plaincopyprint?

    mousePositionOnScreen.z = screenPosition.z;  


4、由于生成新的物体,位置一定是世界坐标系下的才有利于游戏开发,因为标准相同,普遍适用,所以我们放置新的物体也要将物体坐标转化为世界坐标,即

[JavaScript] 纯文本查看 复制代码
[csharp] view plaincopyprint?

    mousePositionInWorld =  Camera.main.ScreenToWorldPoint(mousePositionOnScreen);  


这样得到了鼠标点击位置在世界坐标系下的坐标,由于是2d游戏,我们不涉及射线定位了,放置新物体也统一默认放置在世界坐标x-y平面,z轴值为0;
5、

[JavaScript] 纯文本查看 复制代码
[csharp] view plaincopyprint?

    Input .GetMouseButtonDown(0)  


感知鼠标点击,触发条件;6、
[JavaScript] 纯文本查看 复制代码
[csharp] view plaincopyprint?

    Instantiate (Soldier, mousePositionInWorld , Quaternion.identity);  


生成新物体。









unity3d获取鼠标点击的物体的位置信息;unity 获得鼠标点击的位置;unity 鼠标屏幕坐标;unity 鼠标点击 在屏幕上生成;unity坐标系;unity点击;unity鼠标;unity3d 射线绘制;unity 2d 射线;unity射线坐标;unity如何测试触摸;unity中的坐标系;unity点击移动;unity 鼠标按下;unity鼠标移动;unity3d 绘制射线;unity 2d射线怎么用;unity 坐标射线;unity 触摸 测试;unity 测试触摸

回复

使用道具 举报

0

主题

10

帖子

13

积分

Rank: 1

UID
34510
好友
0
蛮牛币
8
威望
0
注册时间
2014-7-15
在线时间
3 小时
最后登录
2015-3-30
发表于 2015-3-30 09:56:27 | 显示全部楼层
本帖最后由 yanzhanyi123 于 2015-3-30 09:59 编辑

您好,上面这篇文章是本人原创,请在标题注明转载,请在文章首段加入“转载自http://blog.csdn.net/yanzhanyi/article/details/38235145 ”

谢谢!

回复

使用道具 举报

6蛮牛粉丝
1205/1500
排名
1627
昨日变化
1

14

主题

375

帖子

1205

积分

Rank: 6Rank: 6Rank: 6

UID
9671
好友
5
蛮牛币
1066
威望
0
注册时间
2013-12-5
在线时间
240 小时
最后登录
2017-4-18
发表于 2015-12-4 16:54:13 | 显示全部楼层
我想问下,当在用NGUI的时候,如何将鼠标点击得到的位置,设置成NGUI中一个label的位置呢,看到希望能够回复,谢谢

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表