请您认真阅读下面的攻略:
解决在Unity中使用FairyGUI遇到的坑
问题描述
在Unity中使用FairyGUI进行UI制作,其实现机制是在编辑器中制作UI,同时生成对应的xml和bin文件,然后在Unity中通过代码加载bin文件实现UI展示。但是在操作过程中,我们可能会遇到以下问题:
- 在Unity中加载FairyGUI生成的.bin文件时,Unity报错,提示“FileLoadException: Could not load file or assembly 'FairyGUI' or one of its dependencies. The system cannot find the file specified.”;
- 在Unity中加载FairyGUI生成的.bin文件时,Unity成功编译,但是在运行时提示“NullReferenceException: Object reference not set to an instance of an object”的错误;
- 在Unity5.6及以上版本中,由于Unity对加密机制进行了升级,导致上述两种情况的解决方案略有不同。
针对以上几种情况,我们需要针对不同的情况进行解决。
解决方案
方案一:.bin文件丢失或路径不正确
如果第一种情况出现,那么说明Unity在加载FairyGUI生成的bin文件时出现问题。这个问题一般是由于生成的.bin文件路径错误或者文件不存在导致的。解决方法是:
- 如果您使用的是最新版本的FairyGUI编辑器,在您的项目根目录下生成了FairyGUI文件夹。在Unity中打开Asset文件夹,将FairyGUI文件夹全部拖入 Assets 文件夹下;
- 在Unity中选中生成的.fairy文件,查看Inspector面板中的“Package”属性,确保该属性的值为“Custom Package”;
- 确保在Asset文件夹下找到一个和您的fairy文件同名的bin文件。如果没有相应的bin文件,可以点击fairy文件中的“Publish”按钮重新生成bin文件。
方案二:.bin文件无法正确读取
如果第二种情况出现,那么说明在Unity中读取FairyGUI生成的bin文件时出现了问题。这个问题一般是由于.bin文件被加密导致的。解决方法是:
- 在FairyGUI编辑器中,选中您需要加密的UI,进入“Tools”->“Publish Settings”面板,勾选“Encrypt”选项;
- 点击“Export”按钮,生成.bin和xml加密文件;
- 在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文件时遇到过问题,请尝试以下步骤解决:
- 打开Unity编辑器,进入Edit->Project Settings->Player选项卡;
- 在Inspector面板中,找到“Other Settings”区域,展开“Optimization”菜单;
- 找到“AOT Compilation”并勾选它,然后选中“Force gzip”选项;
- 重新运行程序以查看是否可以成功加载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开发时,有以下几点需要注意:
- 在FairyGUI编辑器中,选中需要进行自定义修改的UI元素后,找到“Renderer”属性下的“Touchable”选项。当需要在UI元素中添加按钮或者开启其他可交互性时,请确保该选项处于激活状态;
- 当您使用“精灵集”功能时,您需要知道在代码中可以使用“CreateObjectFromURL”函数,并在其中使用“ui://包名/元素名”来实现对UI元素的引用。
如果您按照上述步骤操作,就可以在Unity中成功集成FairyGUI,并充分利用 FairyGUI 提供的UI制作优势。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决在Unity中使用FairyGUI遇到的坑 - Python技术站