Unity FairyGUI(一)
一.加载UI包
- 可以从Resources加载
- 可以从AssetBundle加载
* 注意的问题,从AssetBundle中加载需要注意释放和加载,如果自己管理,需要特别注意
public class Lesson7 : MonoBehaviour
{
private void Start()
{
// =============方法一:从Resources加载=============
// 将导出的UI文件放入Resources目录或者其子目录下
// 使用FairyGUI提供的 API加载对应UI
// AddPackage会先使用传入的路径作为key进行检测,如果这个包已经添加了 不会重复添加
// 直接填写包名即可 不需要加_fui(UI/包名)
var package1 = UIPackage.AddPackage("UI/Package1");
//遍历依赖包相关信息
foreach (var dependenciePack in package1.dependencies)
{
UIPackage.AddPackage(dependenciePack["name"]);
}
//=============方法二:从两个AssetBundle包加载=============
//将定义文件和图集资源分别放入两个AssetBundle文件中
//自己去加载对应的AB包
//AddPackage在加载AB包时没有排重检测机制,需要自己判断
//自己去判断 AB包 是否重复加载
AssetBundle resAB = null;
AssetBundle bytesAB = null;
UIPackage.AddPackage(bytesAB, resAB);
//=============方法三:从一个AB包加载=============
//将定义文件和图集打入一个AssetBundle文件中
//AddPackage在加载AB包时没有排重检测机制,需要自己判断
AssetBundle AB = null;
UIPackage.AddPackage(AB);
#region 知识点五 卸载UI包
//当一个包不在使用时,可以卸载
//包卸载后,所有包里的贴图等资源均会被卸载,创建出来的组件也无法显示
//一般不建议包进行频繁装载卸载,因为每次装载卸载必然是要消耗CPU时间(意味着耗电)和产生大量GC的。
//UI系统占用的内存是可以精确估算的,你可以按照包的使用频率设定哪些包是常驻内存的(建议尽量多)。
UIPackage.RemovePackage("Teach");
UIPackage.RemoveAllPackages();
#endregion
#region 知识点六 包内存管理
//1.AddPackage只有用到才会载入贴图、声音等资源。
//如果你需要提前全部载入
package1.LoadAllAssets();
//2.如果UIPackage是从AssetBundle中载入的,在RemovePackage时AssetBundle才会被Unload(true)。
//如果你确认所有资源都已经载入了(例如调用了LoadAllAssets),也可以自行卸载AssetBundle。
//如果你的ab是自行管理,不希望FairyGUI做任何处理的,可以设置UIPackage.unloadBundleByFGUI为false。
UIPackage.unloadBundleByFGUI = false;
#endregion
}
}
二.UIPanel加载
public class Lesson8 : MonoBehaviour
{
void Start()
{
UIPackage.AddPackage("Package1");
var go = new GameObject("UIPanel");
var uiPanel = go.AddComponent<UIPanel>();
uiPanel.packageName = "Package1";
uiPanel.componentName = "LearnFGUI";
uiPanel.SetHitTestMode(HitTestMode.Raycast);
uiPanel.SetSortingOrder(100,true);
uiPanel.container.renderMode = RenderMode.ScreenSpaceCamera;
uiPanel.container.renderCamera = null;
uiPanel.container.fairyBatching = false;
uiPanel.CreateUI();
}
}
- 当渲染模式为世界空间时,需要如下图设置
三.动态创建UI
如何选择使用UIPanel还是动态创建?
- 当创建的是3DUI或者一开始就要显示的UI时可以使用UIPanel
- 当正式的项目中使用动态创建UI的方式更方便管理UI
*注意FGUI不要和GameObject有牵连,销毁UI使用内置的Dispose方法
public class Lesson9 : MonoBehaviour
{
void Start()
{
//设置屏幕自适应
GRoot.inst.SetContentScaleFactor(1365,768,UIContentScaler.ScreenMatchMode.MatchHeight);
var pack = UIPackage.AddPackage("Package1");
foreach (var item in pack.dependencies)
{
UIPackage.AddPackage(item["name"]);
}
var com = UIPackage.CreateObject("Package1", "LearnFGUI").asCom;
GRoot.inst.AddChild(com);
//销毁Panel
com.Dispose();
UIPackage.CreateObjectAsync("Package1", "LearnFGUI", (Gobj) =>
{
var com1 = Gobj.asCom;
GRoot.inst.AddChild(com1);
//Component属性
com1.x = 10;
com1.y = 10;
com1.SetPosition(10,10,0);
com1.width = 1000;
com1.height = 900;
com1.SetSize(1365,768);
com1.SetPivot(0,0,true);
com1.rotation = 90f;
com1.sortingOrder = 1;
com1.opaque = true;
print(com1.numChildren);
print(com1.GetChild("n1"));
print(com1.GetChildAt(4));
//升序,大的先渲染
com1.childrenRenderOrder = ChildrenRenderOrder.Ascent;
// //降序
// com1.childrenRenderOrder = ChildrenRenderOrder.Descent;
// //拱形
// com1.childrenRenderOrder = ChildrenRenderOrder.Arch;
//com1.apexIndex = 5;
});
}
}
四.相关脚本
1.Stage Camera
2.UIContentScaler
在设置UI自适应时,已经默认添加了这个脚本,若果需要也可自行添加
3.UIConfig
设置全局配置