FairyGUI

作者: 不正经的搬砖工 | 来源:发表于2020-09-11 09:16 被阅读0次

    1、导出\不导出

    FairyGUI是以包为单位组织资源的。包在文件系统中体现为一个目录。assets目录下每个子目录都表示一个包。包内的每个资源都有一个是否导出的属性,一个包只能使用其他包设置为已导出的资源,而不设置为导出的资源是不可访问的。同时,只有设置为导出的组件才可以使用代码动态创建。已导出的资源在资源库显示时,图标右下角有一个小红点。如果某个界面没有导出就调用,调用UIPackage.CreateObject(PackageName, uiName)创建UI时就会报如下图所示的错误:

    1-1

    2、今天用FairyGUI做新手引导,用到了组件的点击穿透功能。在组件上添加一个子元件A(如图1-2红色图形),勾选组件点击穿透后,点击A处点击不可穿透,其它空白区域可穿透。然后我将A隐藏(即visible置为false),此时我认为点击A处也可以穿透,结果依然不能穿透,最后只能通过SetSize()设置A的大小为0实现穿透。感觉这一点和UGUI确实不同,隐藏的元素竟然没有忽略。后来了解到GObject有个不可触摸属性可以决定Object是否可以接收点击事件。通过代码动态设置focusable,结果也不好使。最后通过修改enabled属性才生效。

    图1-2

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

            }

    相关文章

      网友评论

          本文标题:FairyGUI

          本文链接:https://www.haomeiwen.com/subject/lappektx.html