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在Cocos2d-x下的多平台接入和lua绑定

    Cocos2d-x版本是3.16FairyGUI库来自https://github.com/fairygui/Fa...

  • Laya开发-FairyGui使用

    xzhuan原创稿件,转载请注明出处! FairyGui简介FairyGUI(下面简称FGUI)提供了一个强大的U...

  • FairyGUI与Unity交互示例

    适用人群:需要使用FairyGUI的Unity开发人员。本文内容:介绍FairyGUI和Unity如何合作项目。 ...

  • Laya FairyGui系列一 FairyGui接入

    一,什么是FairyGui FairyGUI(下面简称FGUI)提供了一个强大的UI编辑器,使用习惯与Adobe系...

  • FairyGUI

    1、导出\不导出 FairyGUI是以包为单位组织资源的。包在文件系统中体现为一个目录。assets目录下每个子目...

  • 转化PSD为Unity3D 使用的 UI界面

    操作顺序: PSD文件 -> psd2fgui转化为 .fairypackage 文件 -> FairyGUI进行...

  • FairyGUI 结构解读

    ## 核心类 ### Stage: * UIContantScale:屏幕大小 * StageCamera:渲染相...

  • UI篇-FairyGUI

    工欲善其事,必先利其器FairyGUI是国内一个对UI有深厚的理解,加上经验丰富的程序(号称:谷主),开发的一款U...

  • FairyGUI-fairyBatching

    一般来说,这种强调渲染顺序,以合批为主要目的的优化方式,会用在常驻主界面多一些。其他界面可以按照实际情况酌情处理。...

  • FairyGUI插入Spine

    最近FairyGui新添了对Spine动画功能的支持,然后项目中就想用Spine动画做一些表现。然后按照官方文档上...

网友评论

      本文标题:FairyGUI

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