解决在Unity中使用FairyGUI遇到的坑

请您认真阅读下面的攻略:

解决在Unity中使用FairyGUI遇到的坑

问题描述

在Unity中使用FairyGUI进行UI制作,其实现机制是在编辑器中制作UI,同时生成对应的xml和bin文件,然后在Unity中通过代码加载bin文件实现UI展示。但是在操作过程中,我们可能会遇到以下问题:

  1. 在Unity中加载FairyGUI生成的.bin文件时,Unity报错,提示“FileLoadException: Could not load file or assembly 'FairyGUI' or one of its dependencies. The system cannot find the file specified.”;
  2. 在Unity中加载FairyGUI生成的.bin文件时,Unity成功编译,但是在运行时提示“NullReferenceException: Object reference not set to an instance of an object”的错误;
  3. 在Unity5.6及以上版本中,由于Unity对加密机制进行了升级,导致上述两种情况的解决方案略有不同。

针对以上几种情况,我们需要针对不同的情况进行解决。

解决方案

方案一:.bin文件丢失或路径不正确

如果第一种情况出现,那么说明Unity在加载FairyGUI生成的bin文件时出现问题。这个问题一般是由于生成的.bin文件路径错误或者文件不存在导致的。解决方法是:

  1. 如果您使用的是最新版本的FairyGUI编辑器,在您的项目根目录下生成了FairyGUI文件夹。在Unity中打开Asset文件夹,将FairyGUI文件夹全部拖入 Assets 文件夹下;
  2. 在Unity中选中生成的.fairy文件,查看Inspector面板中的“Package”属性,确保该属性的值为“Custom Package”;
  3. 确保在Asset文件夹下找到一个和您的fairy文件同名的bin文件。如果没有相应的bin文件,可以点击fairy文件中的“Publish”按钮重新生成bin文件。

方案二:.bin文件无法正确读取

如果第二种情况出现,那么说明在Unity中读取FairyGUI生成的bin文件时出现了问题。这个问题一般是由于.bin文件被加密导致的。解决方法是:

  1. 在FairyGUI编辑器中,选中您需要加密的UI,进入“Tools”->“Publish Settings”面板,勾选“Encrypt”选项;
  2. 点击“Export”按钮,生成.bin和xml加密文件;
  3. 在Unity中加载UI时,使用以下代码:
string path = "Assets/UI/SignWindow.bin";
byte[] bytes = File.ReadAllBytes(path);

GLoader.RegisterExtension(typeof(UnityAssetRes));

ByteBuffer buffer = new ByteBuffer(bytes);

UIPackage.AddPackage(buffer);

上述代码中,我们使用Unity自带的File和File.ReadAllBytes函数,将bin文件中的数据以byte数组的形式读入内存中。然后使用GLoader.RegisterExtension函数来注册UnityAssetRes插件,该插件负责将Unity资源转化成FairyGUI资源。最后使用UIPackage.AddPackage函数来加载UI资源。

方案三:.bin文件无法正确读取(针对Unity5.6及以上版本)

如果您的Unity版本是5.6或更高版本,并且您在加载FairyGUI的bin文件时遇到过问题,请尝试以下步骤解决:

  1. 打开Unity编辑器,进入Edit->Project Settings->Player选项卡;
  2. 在Inspector面板中,找到“Other Settings”区域,展开“Optimization”菜单;
  3. 找到“AOT Compilation”并勾选它,然后选中“Force gzip”选项;
  4. 重新运行程序以查看是否可以成功加载bin文件。

这里我们提供一个完整的示例代码,涉及到一些数据的加载和解析,需要您自己下载示例资源

using System.IO;
using UnityEngine;
using FairyGUI;

public class TwoPage : MonoBehaviour
{
    private GComponent _mainView;

    void Start()
    {
        LoadFairyGUI();
    }

    void LoadFairyGUI()
    {
        string path = Application.streamingAssetsPath + "/TwoPage.bin";
        byte[] bytes = File.ReadAllBytes(path);
        ByteBuffer buffer = new ByteBuffer(bytes);
        UIPackage.AddPackage(buffer);

        _mainView = UIPackage.CreateObject("TwoPage", "Main").asCom;
        _mainView.fairyBatching = true;

        GRoot.inst.AddChild(_mainView);

        _mainView.GetController("c1").selectedIndex = 0;
        _mainView.GetController("c2").selectedIndex = 0;

        _mainView.GetChild("btn_left").onClick.Add(() =>
        {
            _mainView.GetController("c1").selectedIndex--;
        });

        _mainView.GetChild("btn_right").onClick.Add(() =>
        {
            _mainView.GetController("c1").selectedIndex++;
        });
    }
}

上述示例代码中,我们通过File和File.ReadAllBytes函数读入TwoPage.bin文件的数据并生成一个ByteBuffer对象,然后使用UIPackage.AddPackage函数将其加载到Unity内存中。

接着,我们使用UIPackage.CreateObject函数从UIPackage中创建一个GComponent对象。在这里,我们使用了“TwoPage”和“Main”这两个字符串来指定我们需要加载的资源,其中“TwoPage”是我们在FairyGUI编辑器中指定的UI包的名称,“Main”是我们所需UI包下的UI元素名称。

最后,我们将GComponent添加到GRoot中,并根据需要进行设置。

示例一

在面对第一种情况时,您需要检查.bin文件是否存在以及路径是否正确。例如,如果您在Unity中有一个名为“SignWindow”的UI,并拖拽该 UI 到了您的Assets文件夹下,那么您可以通过以下代码来加载该UI:

GLoader.RegisterExtension(typeof(UnityAssetRes));
string path = "Assets/UI/SignWindow.bin";
byte[] bytes = File.ReadAllBytes(path);
ByteBuffer buffer = new ByteBuffer(bytes);
UIPackage.AddPackage(buffer);

代码中,“GLoader.RegisterExtension(typeof(UnityAssetRes))”用于注册UnityAssetRes插件,这意味着我们可以在代码中直接使用名为“Assets/UI/SignWindow”(在FairyGUI编辑器中生成的路径)的路径来加载UI。

示例二

当我们遇到第二种情况时,我们必须加密我们的.bin文件。在FairyGUI编辑器中,我们可以通过选中需要加密的UI元素并进入“Tools”->“Publish Settings”面板,勾选“Encrypt”选项并生成.bin和加密后的.xml文件来实现加密。

然后我们可以使用以下代码来加载UI:

string path = "Assets/UI/SignWindow.bin";
byte[] bytes = File.ReadAllBytes(path);

GLoader.RegisterExtension(typeof(UnityAssetRes));

ByteBuffer buffer = new ByteBuffer(bytes);

UIPackage.AddPackage(buffer);

代码中,我们使用Unity自带的File和File.ReadAllBytes函数以byte数组的形式读取.bin文件的内容。然后,我们使用GLoader.RegisterExtension函数注册UnityAssetRes插件,该插件用于将Unity资源转化成FairyGUI资源。最后,我们使用UIPackage.AddPackage函数将bin文件转化成UI资源,实现UI的加载。

注意事项

使用FairyGUI进行UI开发时,有以下几点需要注意:

  1. 在FairyGUI编辑器中,选中需要进行自定义修改的UI元素后,找到“Renderer”属性下的“Touchable”选项。当需要在UI元素中添加按钮或者开启其他可交互性时,请确保该选项处于激活状态;
  2. 当您使用“精灵集”功能时,您需要知道在代码中可以使用“CreateObjectFromURL”函数,并在其中使用“ui://包名/元素名”来实现对UI元素的引用。

如果您按照上述步骤操作,就可以在Unity中成功集成FairyGUI,并充分利用 FairyGUI 提供的UI制作优势。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决在Unity中使用FairyGUI遇到的坑 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#串口通信模块使用方法示例

    下面就详细讲解一下“C#串口通信模块使用方法示例”的完整攻略。 1. 简介 C#串口通信模块是一个用于实现PC机与设备之间高效通信的模块。它的主要作用是简化串口通信过程,使得我们可以更加方便、稳定地与硬件设备进行通信,并且可进行快读写、繁忙等控制。接下来,我将教大家如何使用C#串口通信模块。 2. 示例说明 2.1. 实例1:C#串口通信模块的基本用法 下面…

    C# 2023年6月7日
    00
  • windows中使用C# 调用 C语言生成的dll

    准备工作 首先,确保你会C#开发,并且已经安装好了Visual Studio。其次,我们需要准备一个C语言的dll,作为我们的示例,我们将使用以下的代码: #include <stdio.h> int add_numbers(int a, int b) { return a + b; } 保存以上代码到一个add_numbers.c的文件中。接下…

    C# 2023年6月1日
    00
  • C#中Convert.ToString和ToString的区别分析

    下面是“C#中Convert.ToString和ToString的区别分析”的完整攻略。 什么是 Convert.ToString 和 ToString 在 C# 中,基本数据类型、数据类型的变量、对象都提供了 ToString 方法,用于将其转换为字符串表示形式。Convert.ToString 方法也可以将一个对象转换为字符串。 Convert.ToSt…

    C# 2023年5月15日
    00
  • c#文件操作示例带详细注释

    请看以下完整攻略: C#文件操作示例带详细注释 一、概述 在C#中,文件操作是一个非常重要的知识点。C#提供了强大的文件操作功能,可以用来读取、写入、删除文件,以及建立目录等操作。本文将以示例代码的方式,为大家详细解释不同的文件操作方法,并附带详细注释。 二、文件读取 1. 读取文本文件 using System; using System.IO; clas…

    C# 2023年6月1日
    00
  • 在ASP.NET 2.0中操作数据之六:编程设置ObjectDataSource的参数值

    操作数据是Web应用程序中最常见的任务之一。在ASP.NET 2.0之后,为了简化设置数据源和处理数据的任务,可以使用ObjectDataSource控件。本攻略将详细讲解如何编程设置ObjectDataSource的参数值。 什么是ObjectDataSource ObjectDataSource是ASP.NET用于极度简化数据访问代码的控件之一。利用Ob…

    C# 2023年5月31日
    00
  • Java中Switch用法代码示例

    理解和掌握Java中的switch语句是我们编写程序时的必修课程之一。在本文中,我将详细讲解Java中switch语句的用法和注意事项,包括语法、代码示例和执行流程。 switch语句的语法 Java中的switch语句,用于根据表达式的值,从多个选项中选择一个执行。其语法结构如下: switch(expression) { case value1: //执…

    C# 2023年5月15日
    00
  • C#程序执行时间长查询速度慢解决方案

    C#程序执行时间长查询速度慢解决方案 在C#程序开发中,由于程序涉及到大量的数据查询操作,有时会出现查询速度慢的情况,导致程序执行时间长。本文将为大家介绍C#程序执行时间长查询速度慢的原因及解决方案。 原因分析 造成C#程序查询速度慢的原因主要有以下几点: 数据库索引不合理:在数据库中,如果没有为查询字段建立索引,将导致查询速度缓慢。 查询语句不合理:查询语…

    C# 2023年5月15日
    00
  • WinForm入门与基本控件使用详解

    WinForm入门与基本控件使用详解 1. WinForm简介 WinForm是Windows应用程序的主要用户界面框架,它是在.NET框架之上创建的。使用WinForm可以轻松创建各种Windows应用程序。 1.1 WinForm的优势 可以使用Visual Studio创建WinForm应用程序,这使得对开发者来说非常方便。 WinForm提供了许多内…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部