Unity FairyGUI(十一)
一.插入模型,粒子,Canvas
- 插入模型需要通过图形(Graph来模拟占位)
public class Lesson41 : MonoBehaviour
{
private void Start()
{
var panel = UIManager.Instance.ShowPanel<LearnFGUI4>("Package1");
var graph = panel.GetChild("n14").asGraph;
var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
var wrapper = new GoWrapper(go);
go.transform.localPosition = Vector3.zero;
go.transform.localScale = Vector3.one * 100;
go.transform.localEulerAngles = Vector3.zero;
graph.SetNativeObject(wrapper);
//模拟点击模型
panel.GetChild("n15").onClick.Add(() =>
{
Debug.Log("模型被点击");
});
//更新模型
wrapper.CacheRenderers();
//替换模型
Destroy(go);
var sceneObj = Instantiate(Resources.Load<GameObject>("Cube"));
sceneObj.transform.position = Vector3.zero;
go = Instantiate(Resources.Load<GameObject>("Cube"));
go.transform.localPosition = Vector3.zero;
go.transform.localScale = Vector3.one * 100;
go.transform.localEulerAngles = Vector3.zero;
//材质的复用(貌似源码有问题,无论True还是False都不会克隆材质)
wrapper.SetWrapTarget(go,true);
go.GetComponent<MeshRenderer>().material.color = Color.green;
}
}
二.DrawCall优化
官方文档
在Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call(DC)。Draw Call次数是一项非常重要的性能指标。UI系统一般包含数量众多的物体,有效控制DC是衡量一个UI系统是否实用的关键因素,特别是在移动设备上。
- FGUI和UGUI与NGUI不同点在于,FairyGUI基于Unity的Dynamic Batching技术,提供了深度调整技术进行 Draw Call优化 。
- 而UGUI和NGUI都是将相同材质的Widget进行Mesh合并,例如使用相同图集的图片,或者文字。Mesh合并的优点是合并后这些Widget就只产生一个DC。但这个合并过程需要计算所有Widget坐标相对于Panel的变换,而且如果Widget行为改变,例如平移,缩放等,都会触发Mesh重新合并,这会带来一定的CPU消耗,这就需要开发者谨慎组织UI元素到各个UIPanel,并且对深度需要细致安排,否则达不到减少DC效果的同时更可能带来比较大的CPU消耗。
具体优化流程
- 在Unity中开启Dynamic Batching技术
- 设置面板开启合批技术,aComponent.fairyBatching = true;
- 当图片被遮挡影响,需要手动调用aObject.InvalidateBatchingState();
- 对于一些特殊的UI动效aTransition.invalidateBatchingEveryFrame = true;
三.分支
- 分支功能用于实现项目的多态设计,例如多国语言版本下UI的差别,又例如多个渠道版本下UI的差别。
- 通过FGUI编辑器设置好,到Unity中只需要一句代码即可
- UIPackage.branch = “XXX”
四.多国语言
- 先在FGUI的编辑器中导出语言的Xml文件,对其进行翻译
- 导入到Unity中对Xml文件进行读取,转成Xml类,完成多国语言
var txt = Resources.Load<TextAsset>("en").text;
var xml = new XML(txt);
UIPackage.SetStringsSource(xml);
多语言一般需要配合分支一起使用,分支可以实现图片的多语言切换