Unity3D-关于Unity屏幕坐标到iOS屏幕坐标的映射方法

有时候在Unity里面做一些原生的功能,比如:在某个UI的Button旁边弹出一个原生的选择框,我们需要知道这个选择框要显示在那个位置,但是我们只知道在Unity的UI坐标,那么怎么从Unity的UI坐标转到原生去呢。

其实有一个很好的办法,Unity之前已经考虑到了,那就是ViewPoint,这个就是关键。

ViewPoint是什么?

它就是指一个点在屏幕中的百分比!比如,我们的UI的中心点是(0,0),那么转化成ViewPoint就是(0.5f, 0.5f)了。

我们知道这个百分比之后,就可以将这个值传递给原生,在原生那边乘以原生的宽高,就得到了在原生那边的坐标啦!另外需要注意的是,坐标系的原点,原生是左上角为原点,而在Unity中,有好多,就说屏幕坐标系,是左下角为原点的,所以这里只要把y坐标转化一下就OK啦。

具体实现如下:

1、首先在Unity端拿到UI的坐标,将它转化为屏幕坐标;

Vector2 screenPos = RectTransformUtility.WorldToScreenPoint(Camera.main, target.transform.position);
			screenPos.x += 20;
			screenPos.y = Screen.height - screenPos.y;

下面的Screen.height - screenPos.y就是转化y坐标的

2、然后将屏幕坐标转化为ViewPoint;

Vector2 viewPoint = Camera.main.ScreenToViewportPoint(screenPos);
			OpenIOSFrameByPos(viewPoint*100);

这里将坐标转化成ViewPoint,然后乘上100,100是精度,我里面是传递的两个int型的变量,所以需要这么做,如果要精确的,可以乘以1000,这样一般就不会偏差了。

3、最后在iOS原生部分,拿到传递的数值之后,和原生视图的宽高相乘,就得到坐标位置了;

扫描二维码关注公众号,回复: 2827703 查看本文章
-(void)showActionSheet:(int)sx :(int)sy
{
    ....code.....
    UIView* tv = UnityGetGLViewController().view;
    _sx = sx*tv.bounds.size.width/100 + tv.bounds.origin.x;
    _sy = sy*tv.bounds.size.height/100 + tv.bounds.origin.y;
    
    [showView showFromRect:CGRectMake(_sx, _sy, 0, 0)
                     inView: tv
                   animated: YES];
   ...code....
    
}

在这里乘以view的实际宽高,就拿到的坐标,然后显示出来就OK啦,我之前是乘以100,所以这里就除以100!




猜你喜欢

转载自blog.csdn.net/pz789as/article/details/80074223