近日看fairygui的几个例子,试着看懂代码,并照着例子再做一遍, 看是不是真的掌握了,并将其步骤等写在这,不然过段时间我可能又会忘记掉了。
关于组件的扩展,官网上有相关的介绍,用组件的扩展可以完成很多内容,而今天我要学的呢,是自定义扩展:
当基础组件、扩展组件都不能满足你的需求时,你可以编写自定义的扩展。使用API UIObjectFactory.setPackageItemExtension
完成定义。例如:
UIObjectFactory.setPackageItemExtension(UIPackage.getItemURL(“包名“,”组件A”), MyComponent );
public class MyComponent extends GComponent
{
override protected function constructFromXML(xml:XML):void
{
super.constructFromXML(xml);
//在这里继续你的初始化
}
}
这样就为组件A指定了一个实现类MyComponent 。以后所有组件A创建出来的对象(包括在编辑器里使用的组件A)都为
MyComponent 类型。例如:
var obj:MyComponent = UIPackage.createObject(“包名“, ”组件A”) as MyComponent ;
注意:如果组件A只是一个普通的组件,没有定义“扩展”,那么基类是GComponent,如上例所示;如果组件A的扩展是按钮,
那么MyComponent的基类应该为GButton,如果扩展是进度条,那么基类应该为GProgressBar,等等。这个不要弄错。
首先我们来看看效果图
1,在fairygui编辑器里开始编辑。
两个组件,一个为main,一个为Item。
首先在main组建中布局好,背景加上一个列表。在Item组件中添加Item中的内容。
2,导入unity,需要写两个脚本,一个是关于拓展的Item的类型,此处要注意,若是拓展的是button,则基类写button,
没有选择过就是GCompoent,
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FairyGUI;
public class mail :GButton
{
GTextField time;
GTextField mailname;
Controller got;
public override void ConstructFromXML(FairyGUI.Utils.XML cxml) //zhege
{
base.ConstructFromXML(cxml);
time= this.GetChild("time").asTextField;
mailname = this.GetChild ("title").asTextField;
got = this.GetController ("c1");
}
public void setTime(string value)
{
time.text = value;
}
public void setname (string value)
{
mailname.text = value;
}
public void setgot(int value)
{
got.selectedIndex = value;
}
}
然后是关于显示的最主要的代码段
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FairyGUI;
public class Extetion : MonoBehaviour {
GComponent main;
GList list;
// Use this for initialization
void Start () {
UIPackage.AddPackage("ui/Extension2");
UIObjectFactory.SetPackageItemExtension (UIPackage.GetItemURL ("Extension2", "mail"), typeof(mail)); //
main = UIPackage.CreateObject ("Extension2", "main").asCom;
list = main.GetChild ("n4").asList;
for (int i = 0; i < 5; i++) {
mail item = (mail)list.AddItemFromPool();
item.setTime ("2017,8,10");
item.setname ("ayou");
item.setgot (i % 2);
}
list.EnsureBoundsCorrect ();
GRoot.inst.AddChild (main);
}
// Update is called once per frame
void Update () {
}
}
这样就大功告成了!
第二个例子:效果图;
这个例子还将unity的粒子系统加入到了ui之中,在fairygui中布局好之后,用一个空的图形占位,在unity中再将例子系统
放入到这个占位的图形中。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FairyGUI;
public class fire : GComponent
{
public override void ConstructFromXML(FairyGUI.Utils.XML cxml)
{
base.ConstructFromXML (cxml);
GGraph graph = this.GetChild ("fire").asGraph;
Object prefab = Resources.Load ("Flame");
GameObject go = (GameObject)Object.Instantiate (prefab);
graph.SetNativeObject (new GoWrapper (go));
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FairyGUI;
public class Particles2 : MonoBehaviour {
GComponent main;
// Use this for initialization
void Start () {
UIPackage.AddPackage ("ui/Particles2");
UIObjectFactory.SetPackageItemExtension (UIPackage.GetItemURL ("Particles2", "fire"), typeof(fire));
main = UIPackage.CreateObject ("Particles2", "main").asCom;
GRoot.inst.AddChild (main);
main.GetChild ("n0").draggable = true;
main.GetChild ("n1").draggable = true;
}
// Update is called once per frame
void Update () {
}
}