解决在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# String.ToLower()方法: 将字符串转换为小写

    String.ToLower() 是 C# 的字符串方法,其作用是将一个字符串对象的所有字母字符转换成小写形式。 使用方法: string str = "EXAMPLE"; string lowerStr = str.ToLower(); 在上面的代码中,ToLower() 方法将字符串 str 转换成小写形式并存储到 lowerStr …

    C# 2023年4月19日
    00
  • Sitecore XP 10.3(latest) Docker一键部署

    本文演示通过PowerShell+Docker Desktop for Windows 一键部署Sitecore10.3(即Sitecore最新版)Docker开发/测试/演示 环境。 官方参考 SitecoreXP 10.3.0 Developer Workstation Deployment With Docker 演示配置为XP Single(XP0)…

    C# 2023年4月27日
    00
  • Visual studio 2017如何发布dotnet core到docker

    在本攻略中,我们将详细讲解如何使用Visual Studio 2017将.NET Core应用程序发布到Docker,并提供两个示例说明。 步骤一:安装Docker for Windows 在使用Visual Studio 2017将.NET Core应用程序发布到Docker之前,您需要安装Docker for Windows。您可以从Docker官网下载…

    C# 2023年5月17日
    00
  • js实现hashtable的赋值、取值、遍历操作实例详解

    JS实现Hashtable的赋值、取值、遍历操作实例详解 HashTable是一种常用的数据结构,它可以实现高效的数据存储和查找。在JS中,我们可以使用对象的方式来实现HashTable,将key-value对应的数据存储到对象中,从而实现高效的数据查询和遍历。在本文中,我们将讲解JS实现HashTable的赋值、取值、遍历操作的详细攻略。 实现思路 实现一…

    C# 2023年6月7日
    00
  • asp.net+Ligerui实现grid导出Excel和Word的方法

    下面是“asp.net+Ligerui实现grid导出Excel和Word的方法”的完整攻略。 一、前置条件 在开始实现导出Excel和Word的方法前,需要确保已经安装了以下环境: Visual Studio以及.NET Framework Ligerui框架 二、实现导出Excel和Word的方法 1. 导出Excel 步骤一:添加NuGet包 在Vis…

    C# 2023年5月31日
    00
  • C#开发简易winform计算器程序

    下面就是关于“C#开发简易winform计算器程序”的完整攻略: 1. 确定需求并创建新项目 首先,我们需要明确需求,即需要开发一个可以完成加减乘除四则运算的简易winform计算器程序。然后,我们在Visual Studio中创建一个新的Windows窗体应用程序项目,该项目将包含我们的主要应用程序代码。 2. 设计用户界面 在这一步中,我们设计计算器应用…

    C# 2023年5月15日
    00
  • unity 如何获取Text组件里text内容的长度

    获取Text组件中包含的文本内容长度是通过Unity中提供的string.Length属性实现的。下面是获取Text组件中文本内容长度的完整攻略: 步骤一:获取Text组件对象 使用GameObject.GetComponent()函数获取文本对象的Text组件。例如: Text textComponent = GetComponent<Text&gt…

    C# 2023年6月3日
    00
  • C# 运算符 ?、??、?: 各种问号的用法和说明

    C#运算符?、??、?:各种问号的用法和说明 在C#中,有三种问号运算符:?、??和?:。它们可以帮助我们简化代码,并更好地处理可能会出现空值的情况。让我们逐个来了解它们。 ?运算符 ?运算符用于处理可能为null的对象。它的语法是: object? nullableObject = null; var x = nullableObject?.SomeMet…

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