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

yizhihongxing

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

解决在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# SendInput 模拟鼠标操作的实现方法

    C# SendInput 模拟鼠标操作的实现方法 1. SendInput 简介 SendInput 是 Windows API 提供的一个函数,可以模拟键盘、鼠标等输入设备的操作。使用它可以实现一些自动化测试,或者模拟用户的鼠标和键盘操作。 使用 SendInput 函数需要先安装 InputSimulator 库,可以通过 NuGet 包管理器安装。 2…

    C# 2023年6月6日
    00
  • NetCore 配置Swagger的详细代码

    以下是“NetCore配置Swagger的详细代码”的完整攻略: 什么是Swagger Swagger是一种API文档生成工具,它可以自动生成API文档,并提供一个交式UI,使开人员可以轻松地测试API。 配置Swagger的详细代码 配置Swagger的详细代码包括以下步骤: 安装Swashb.AspNetCore NuGet包。 在Startup.cs文…

    C# 2023年5月12日
    00
  • 详解c# 多态

    关于“详解C#多态”的完整攻略,下面我会分为以下几个部分来逐步讲解。 什么是多态? 多态(Polymorphism)是面向对象编程的三大特性之一,指同一种行为具有多个不同的表现形式或状态的能力。在C#中,多态分为编译时多态和运行时多态。 编译时多态(静态多态):也叫重载,是指同一个类中的方法名称相同,但参数列表不同,也可以分为方法重载和运算符重载。 运行时多…

    C# 2023年6月1日
    00
  • C#实现计算一个点围绕另一个点旋转指定弧度后坐标值的方法

    下面我将详细讲解一下如何用C#实现计算一个点围绕另一个点旋转指定弧度后坐标值的方法。 问题描述 在计算机图形学中,经常需要对一个点或一组点进行旋转操作,而在进行旋转操作时,需要知道旋转点和旋转角度,然后计算出旋转后的坐标值。如果我们选定了一个中心点P(x0, y0),要对点A(x1, y1)绕P点逆时针旋转θ弧度,则旋转后得到的新点坐标B(x2, y2)可以…

    C# 2023年6月3日
    00
  • linq中的聚合操作符

    当我们使用LINQ查询数据时,通常需要对数据进行聚合,即对一组数据进行计算,并返回一个聚合结果。在LINQ中,聚合操作符提供了一组强大的工具,帮助我们完成各种不同类型的计算。本文将详细讲解LINQ中的聚合操作符及其使用方法。 聚合操作符概述 在LINQ中,聚合操作符主要包括以下几种: Count Count操作符用于返回一个序列中元素的数量。其语法如下: i…

    C# 2023年6月1日
    00
  • Unity 实现框选游戏战斗单位的思路详解

    Unity 实现框选游戏战斗单位的思路详解 框选是游戏中必不可少的功能,在游戏战斗中,我们需要选择多个战斗单位进行指挥和操作。在此处,我们将介绍如何在Unity中实现框选游戏战斗单位的功能。 实现思路 首先,监听鼠标输入,记录下鼠标移动的起点和终点,来确定选框的范围。 当鼠标抬起的时候,检查选框范围内是否存在可选中的游戏战斗单位,如果存在,将其选中并添加到选…

    C# 2023年6月3日
    00
  • C# 输出字符串到文本文件中的实现代码

    下面是在 C# 中输出字符串到文本文件中的实现代码攻略: 1. 创建文件并写入字符串 代码实现 using System.IO; // 定义字符串变量 string str = "hello world!"; // 创建一个文件流 FileStream fs = new FileStream("output.txt",…

    C# 2023年5月31日
    00
  • 浅解关于C#多线程的介绍

    下面我将为您详细讲解“浅解关于C#多线程的介绍”的完整攻略。 什么是多线程 在计算机科学中,多线程是指程序中包含多个执行线程的计算机程序执行模型的能力。这些线程可以并发执行,并在需要时协调共享资源以避免与另一个线程的冲突。 C#是一门拥有强大多线程支持的编程语言。C#的多线程功能旨在提高应用程序的性能和可伸缩性。 如何使用多线程 C#多线程可以采用多种方式实…

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