FairGUI 坐标和Unity坐标转换

本文档详细介绍了FairyGUI与Unity中坐标系统的不同及其转换方法,包括从局部坐标到全局坐标的转换、屏幕坐标与逻辑屏幕坐标的转换及世界空间坐标与UI坐标的互转等,并给出具体的游戏实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、FairGUI教程文档(https://www.bookstack.cn/read/fairygui/unity.md

坐标系统

坐标原点

FairyGUI是以屏幕左上角为原点的,Unity的屏幕坐标是以左下角为原点的。一般这个转换都不需要开发者干预,如果确实需要进行这两者的转换,可以用:

  1. //Unity的屏幕坐标系,以左下角为原点

    Vector2 pos = Input.mousePosition;

    //转换为FairyGUI的屏幕坐标

    pos.y = Screen.height - pos.y;


坐标转换

GObject里的x/y/position值都是局部坐标,也就是相对于父元件的偏移。GObject没有提供直接的属性获得对象的全局坐标,但提供了方法进行转换。

请注意:一个对象,本地(Local)坐标的原点是(0,0),不是(x,y),(x,y)是在父元件的坐标,不是自己的本地坐标。

如果要获得任意一个UI元件在屏幕上的坐标,可以用:

  1. Vector2 screenPos = aObject.LocalToGlobal(Vector2.zero);

(注意,这里说的屏幕,是指FairyGUI语义中的屏幕,是以屏幕左上角为原点的,不是指Unity语义中的屏幕)

相反,如果要获取屏幕坐标在UI元件上的局部坐标,可以用:

  1. Vector2 localPos = aObject.GlobalToLocal(screenPos);

如果有UI适配导致的全局缩放,那么逻辑屏幕大小和物理屏幕大小不一致,逻辑屏幕的坐标就是GRoot里的坐标。如果要进行局部坐标与逻辑屏幕坐标的转换,可以用:

  1. //物理屏幕坐标转换为逻辑屏幕坐标

    Vector2 logicScreenPos = GRoot.inst.GlobalToLocal(screenPos);

    //UI元件坐标与逻辑屏幕坐标之间的转换

    aObject.LocalToRoot(pos);

    aObject.RootToLocal(pos);

注意,我们在编辑器里定义的,代码里处理的,一般就是指这个逻辑屏幕坐标。

如果要转换任意两个UI对象间的坐标,例如需要知道A里面的坐标(10,10)在B里面的位置,可以用:

  1. Vector2 posInB = aObject.TransformPoint(new Vector2(10,10), bObject);

与世界空间坐标转换

如果要转换世界空间的坐标到UI里的坐标,需要先将世界空间的坐标转换为屏幕坐标,再继续转换,例如:

  1. Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);

    //原点位置转换

    screenPos.y = Screen.height - screenPos.y;

    Vector2 pt = GRoot.inst.GlobalToLocal(screenPos);

如果要转换UI里的坐标到世界空间的坐标,需要先将UI里的坐标转换为屏幕坐标,再继续转换,例如:

  1. Vector2 screenPos = GRoot.inst.LocalToGlobal(pos);

    //原点位置转换

    screenPos.y = Screen.height - screenPos.y;

    一般情况下,还需要提供距离摄像机视野正前方distance长度的参数作为screenPos.z(如果需要,将screenPos改为Vector3类型)

    Vector3 worldPos = Camera.main.ScreenToWorldPoint(screenPos);

二、 游戏实例使用

    private GObject tPoint = null;//fairgui 控件
    Vector2 screenPos = GRoot.inst.LocalToGlobal(tPoint.LocalToRoot(Vector2.zero, GRoot.inst));//tPoint.LocalToRoot(Vector2.zero, GRoot.inst);有适配问题//tPoint.LocalToGlobal(Vector2.zero);有适配问题
    screenPos.y = Screen.height - screenPos.y;
    Vector3 position = camera.ScreenToWorldPoint(screenPos);

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值