1、导出\不导出
FairyGUI是以包为单位组织资源的。包在文件系统中体现为一个目录。assets目录下每个子目录都表示一个包。包内的每个资源都有一个是否导出的属性,一个包只能使用其他包设置为已导出的资源,而不设置为导出的资源是不可访问的。同时,只有设置为导出的组件才可以使用代码动态创建。已导出的资源在资源库显示时,图标右下角有一个小红点。如果某个界面没有导出就调用,调用UIPackage.CreateObject(PackageName, uiName)创建UI时就会报如下图所示的错误:
2、今天用FairyGUI做新手引导,用到了组件的点击穿透功能。在组件上添加一个子元件A(如图1-2红色图形),勾选组件点击穿透后,点击A处点击不可穿透,其它空白区域可穿透。然后我将A隐藏(即visible置为false),此时我认为点击A处也可以穿透,结果依然不能穿透,最后只能通过SetSize()设置A的大小为0实现穿透。感觉这一点和UGUI确实不同,隐藏的元素竟然没有忽略。后来了解到GObject有个不可触摸属性可以决定Object是否可以接收点击事件。通过代码动态设置focusable,结果也不好使。最后通过修改enabled属性才生效。
3、FairyGUI适配
FairyGUI在Unity上全屏适配直接调用GComponent.MakeFullScreen()就可以,我在加载完UI资源后,直接调用GComponent.MakeFullScreen(),结果打包到手机上不好使,后来发现是调用顺序有问题,MakeFullScreen()之前应该先初始化window窗口,这样才会生效。
4、FairyGUI中GObject和Unity的GameObject关联
GObject有个displayObject属性,DisplayObject就相当于一个中间件,可以和各个平台具体对象进行关联。DisplayObject类中有个gameObject,针对Unity平台就是GameObject。当我们需要读取GameObject的属性时就可以这样获取,例如我做新手引导时,需要指引挂载在3D对象上的UI组件,UI是通过UIPanel(Render Mode设为WorldSpace)直接挂在3D对象上的,指引UI是Stage下的2DUI,所以就需要进行一个坐标的转换。首先找到目标对象为A,通过A.displayObject.gameObject.transform.position获取A的世界坐标为APos,然后通过GObject.WorldToLocal(APos,Camera.main)转换为指引UI中的本地坐标。
5、FairyGUI插入UGUI元素
此例子是实现在某个GGraph下创建一个UGUI的Image组件,并让Image使用自己的shader达到某种效果。但是插入UGUI元素后,UGUI元素显示层级和FairyGUI元素层级不知如何调节,看FairyGUI官网也没有对应的说明,所以FairyGUI中插入UGUI元素慎用。
public static void SetGuideAlphaEffect(GComponent gc,GGraph holder,float range, float centerX, float centerY, float alpha)
? ? ? ? {
? ? ? ? ? ? UnityEngine.UI.Image img = holder.displayObject.gameObject.GetComponentInChildren<UnityEngine.UI.Image>();
? ? ? ? ? ? if (img == null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? GameObject ngo = new GameObject("Canvas");
? ? ? ? ? ? ? ? Canvas canvas = ngo.AddComponent<Canvas>();
? ? ? ? ? ? ? ? ngo.GetComponent<RectTransform>().sizeDelta = new Vector2(gc.width, gc.height);
? ? ? ? ? ? ? ? canvas.renderMode = RenderMode.WorldSpace;
? ? ? ? ? ? ? ?canvas.worldCamera = StageCamera.main;
? ? ? ? ? ? ? ?GoWrapper gw = new GoWrapper(canvas.gameObject);
? ? ? ? ? ? ? ? holder.SetNativeObject(gw);
? ? ? ? ? ? ? ? img = ngo.AddComponent<UnityEngine.UI.Image>();
? ? ? ? ? ? ? ? img.raycastTarget = false;
? ? ? ? ? ? ? ? img.material = new Material(Shader.Find("UIEffect/Koi/Effect/Mask_Alpha_Gradual"));
? ? ? ? ? ? ? ? canvas.gameObject.SetActive(true);
? ? ? ? ? ? }
? ? ? ? ? ? img.material.SetFloat("_Range", range);
? ? ? ? ? ? img.material.SetFloat("_CenterX", centerX);
? ? ? ? ? ? img.material.SetFloat("_CenterY", centerY);
? ? ? ? ? ? img.material.SetFloat("_CustomAlpha", alpha);
? ? ? ? }