unity3d FairyGUI(2)

  • Post author:
  • Post category:其他




一坐标系统



(1)坐标原点

FairyGUI是以屏幕

左上角为原点

,Unity的屏幕坐标是以

左下角为原点

,如果需要转换

  //Unity的屏幕坐标系,以左下角为原点
    Vector2 pos = Input.mousePosition;

    //转换为FairyGUI的屏幕坐标
    pos.y = Screen.height - pos.y;


(2)坐标转换

1.

获取本地坐标点 以及全局坐标和本地坐标之间的转换关系

//GObject里的x/y/position值都是局部坐标
_backBtn = _mainView.GetChild("btn_Back");
//_backBtn.x
// _backBtn.y
// _backBtn.position
  //_backBtn.xy

//获取_backBtn在这个FairyGUI 的屏幕坐标
Vector2 screenPos = aObject.LocalToGlobal(_backBtn.xy);

//获取屏幕坐标在_backBtn里的局部坐标
 Vector2 localPos = aObject.GlobalToLocal(screenPos);


  1. 适配问题导致的逻辑坐标(GRoot内的坐标 )和物理坐标的不一直

    本地坐标和屏幕坐标的转换,逻辑屏幕就是FairyGUI显示区域的大小
//物理屏幕坐标转换为逻辑屏幕坐标  
    Vector2 logicScreenPos = GRoot.inst.GlobalToLocal(screenPos);
    
    //UI元件坐标与逻辑屏幕坐标之间的转换
    aObject.LocalToRoot(pos);
    aObject.RootToLocal(pos);

	//想知道aObject里的(10,10) 在bObject里的位置 可以使用TransformPoint方法
    Vector2 posInB = aObject.TransformPoint(new Vector2(10,10), bObject);


(2)与世界空间坐标转换

1.如果要转换

世界空间的坐标到UI里

的坐标,需要先将世界空间的坐标转换为屏幕坐标,再继续转换

 Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);
  screenPos.y = Screen.height - screenPos.y; 
    Vector2 pt = GRoot.inst.GlobalToLocal(screenPos);

2.如果要转换

UI里的坐标到世界空间的坐标

,需要先将UI里的坐标转换为屏幕坐标,再继续转换

Vector2 screenPos = GRoot.inst.LocalToGlobal(pos);
    //原点位置转换
    screenPos.y = Screen.height - screenPos.y; 
    一般情况下,还需要提供距离摄像机视野正前方distance长度的参数作为screenPos.z(如果需要,将screenPos改为Vector3类型)
    Vector3 worldPos = Camera.main.ScreenToWorldPoint(screenPos);



二 字体的处理



(1)使用动态字体
//设置全局字体:
UIConfig.defaultFont = "Droid Sans Fallback, LTHYSZK, Helvetica-Bold, Microsoft YaHei, SimHei";


注意

:

多个字体名称用逗号隔开。Unity会自动使用第一个能识别的字体名称。但必须有一个是能识别的。能识别的意思是,必须是在系统环境中存在的字体,且字体名称一定要正确。假设你设置了“微软雅黑”,那手机上肯定是没有的,显示效果就达不到期望。



(2)使用TTF字体
//font1.ttf已经放置放置在Resources目录:
UIConfig.defaultFont = "font1";

//如果需要将字体打包到AssetBundle,那么需要自行加载并注册字体
 Font myFont = myBundle.LoadAsset<Font>(name);
  FontManager.RegisterFont(new DynamicFont("字体名称", myFont),"字体名称");


(3)字体映射

这里用到了”黑体”这个名字的字体,

但”黑体”未必能被Unity识别

,更加不能在手机上生效。我们需要建立一个这种字体到已知字体的映射。假设我们已经按照上述方法,准备好一个TTF字体HeiTi.ttf

//RegisterFont的第二个参数对应编辑器里使用的字体名称;第一个参数,就是Unity能识别的字体名称,参考上面的“使用动态字体”和“使用TTF字体”。
FontManager.RegisterFont(FontManager.GetFont("HeiTi"), "黑体");


(4)字体设置
//设置粗体
FontManager.GetFont("字体名称").customBold = true;

//粗斜
 FontManager.GetFont("字体名称").customBoldAndItalic = true;
//描边
FontManager.GetFont("字体名称").customOutline=true



版权声明:本文为qq_39873732原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。