36.组件拓展类

36.FGUI基础-Unity中的使用必备-组件拓展类


36.1 知识点

什么是组件类拓展

  • FairyGUI提供了绑定一个类为组件的扩展类的功能,让我们可以更加面向对象的进行编程。

  • 回顾目前显示面板,处理面板逻辑的方式:

  • 目前我们的面板并没有类与之对应专门处理该面板的逻辑,只是通过view面板获取它的子对象,然后处理子对象对应逻辑初始化或者事件监听,设置适配相关。

//设置适配相关
GRoot.inst.SetContentScaleFactor(1365, 768, UIContentScaler.ScreenMatchMode.MatchHeight);
//包和依赖包
UIPackage package = UIPackage.AddPackage("UI/Teach");
foreach (var item in package.dependencies)
{
    UIPackage.AddPackage("UI/" + item["name"]);
}
//GComponent view = UIPackage.CreateObject("Teach", "TeachPanel").asCom;
//GRoot.inst.AddChild(view);
  • 正常面向对象的思路应该是有一个类专门处理这个面板的逻辑。

  • 组件类拓展可以将某一个面板的逻辑封装到指定类当中。

实现组件类拓展

创建MyPanel组件并发布

创建自定义类继承GComponent

public class MyPanel : GComponent

重写ConstructFromXML方法,在其中初始化面板相关控件。类中可以定义其他控件的成员。

//重写ConstructFromXML
public override void ConstructFromXML(XML xml)
{
    base.ConstructFromXML(xml);
    //在这里初始化 面板相关内容 比如获取某个控件 或者初始化面板显示 按钮监听等
    //在面板创建时 会自动执行这里面的逻辑
    inputTxt = this.GetChild("inputTxt").asTextInput;
    btnTest = this.GetChild("btnTest").asButton;

    btnTest.onClick.Add(() =>
    {
        Debug.Log("按钮点击");
    });
}

在该类中处理面板逻辑。类中可以定义其他控件作为成员变量,封装成员方法。

//面板控件作为成员变量
public GTextInput inputTxt;
public GButton btnTest;

//成员方法 提供给外部
public void ShowInfo(string str)
{
    inputTxt.text = str;
}

将自定义类和对应组件进行注册关联

//进行面板和自定义类的关系注册
UIObjectFactory.SetPackageItemExtension("ui://FGUI教程/MyPanel", typeof(MyPanel));
//由于我们注册了 所以我们在创建该面板时 他会自动和自定义类进行关联 用自定义类来装载它
MyPanel myPanel = (MyPanel)UIPackage.CreateObject("FGUI教程", "MyPanel").asCom;
GRoot.inst.AddChild(myPanel);
myPanel.ShowInfo("MyPanel哈哈");

FairyGUI编辑器导出代码功能

发布设置发布代码

  • 允许发布代码 是否生成绑定的代码。生成绑定的代码可以更直观地访问组件的各个节点,但会造成美术工作和程序员工作的耦合。
  • 包设置里也有允许发布代码的开关。如果这里不勾选,那么所有包都不会发布代码。如果这里勾选,那么由包设置的开关决定该包是否发布代码。
  • 发布路径 发布的代码保存的路径。发布路径支持相对路径和绝对路径,也支持变量。
  • 组件名前缀 给每个组件生成的类名加上前缀。例如如果组件名为“Component1”,这里设置前缀为“T”,那么最后生成的类名为“TComponent1”。前缀可以为空。注意,如果组件名是中文,会被自动转换为拼音。
  • 成员名称前缀 给组件里每个元件的名称前加上前缀。例如如果元件名称为“n10”,这里设置前缀为“m_”,那么最后生成的类成员的名称为“m_n10”。前缀可以为空,但不建议这样做。因为元件名称很可能和类的一些属性和方法名称冲突。例如,如果元件名称为“icon”,那就和GObject的icon属性冲突了。
  • 不生成使用默认名称的成员 勾选后,对于”n1”,”n2”等这种系统自动生成的名称,或者“title”,“icon”等这种扩展组件里约定的名称,将不会为这些名称的元件生成成员获取代码。如果一个组件里,全部都是这些名称的元件,那么整个组件都不会生成代码。例如,一个按钮,里面只有名称为“title”和“icon”的元件,则不会为这个按钮生成代码,因为使用基类GButton已经足够。
  • 使用名称获取成员对象 如果不勾选,组件初始化时使用索引获得子对象;如果勾选,则使用名称获得子对象。前者效率高,推荐使用;后者则兼容性较好,例如,如果调整了元件的顺序,不会发生异常。
  • 包名称 对于AS3代码,是指发布的代码的package;对于C#代码,是指发布的代码的namespace;对于Typscript代码,是指发布的代码的module;对于C++代码,是指发布的代码的namespace。

包设置发布代码

  • 为本包生成代码 为本包生成代码。生成代码的作用请参考全局设置。注意,即使这个勾选了,如果全局设置里没有勾选,最后也不会生成代码。
  • 发布路径 发布结果放置的路径。参考全局设置。
  • 使用全局配置 如果勾选,发布路径使用全局配置里的设置,本页面的设置无效。

查看发布后的代码

  • 在Binder方法中有帮我们自动绑定组件
  • 也有自动生成控件成员并获取,并提供了一个CreateInstance方法让我们得到这个组件实例。使用绑定类创建UI的API是CreateInstance,不能直接new。

Unity中的使用

//在使用绑定类之前,一定要调用XXXBinder.BindAll,并且在创建任何UI之前调用。
FGUIJiaoChengBinder.BindAll();
//使用绑定类创建UI的API是CreateInstance,不能直接new。
UI_MyPanel uI_myPanel = UI_MyPanel.CreateInstance();
//添加到Groot
GRoot.inst.AddChild(uI_myPanel);
//要添加什么方法自行去生成代码类中的添加
uI_myPanel.ShowInfo("林文韬123");

运行结果

不要依赖自动发布的代码

注意:还是建议自己手写 不要依赖自动发布的代码 原因如下

  1. 要避免生成的代码 把现有的关键逻辑覆盖了 假如修改了组件 再重新发布 会把自己新加的逻辑覆盖
  2. 要注意生成的代码 控件名变化了

36.2 知识点代码

Lesson36_FGUI基础_Unity中的使用必备_组件拓展类

using FairyGUI;
using FairyGUI.Utils;
using FGUIJiaoCheng;
using System.Collections;
using System.Collections.Generic;
using Teach;
using UnityEngine;

public class Lesson36_FGUI基础_Unity中的使用必备_组件拓展类 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 什么是组件类拓展?

        //FairyGUI提供了绑定一个类为组件的扩展类的功能
        //让我们可以更加面向对象的进行编程

        //回顾目前显示面板,处理面板逻辑的方式
        //目前我们的面板并没有类与之对应专门处理该面板的逻辑
        //只是通过view面板获取它的子对象 然后处理子对象 对应逻辑 初始化 或者 事件监听
        //设置适配相关
        //GRoot.inst.SetContentScaleFactor(1365, 768, UIContentScaler.ScreenMatchMode.MatchHeight);
        //包和依赖包
        //UIPackage package = UIPackage.AddPackage("UI/Teach");
        //foreach (var item in package.dependencies)
        //{
        //    UIPackage.AddPackage("UI/" + item["name"]);
        //}
        //GComponent view = UIPackage.CreateObject("Teach", "TeachPanel").asCom;
        //GRoot.inst.AddChild(view);
        //正常面向对象的思路应该是有一个类专门处理这个面板的逻辑

        //组件类拓展 可以将某一个面板的逻辑封装到指定类当中

        #endregion

        #region 知识点二 实现组件类拓展

        //1.创建自定义类继承GComponent
        //2.重写ConstructFromXML方法,在其中初始化面板相关控件
        //3.在该类中处理面板逻辑
        //4.将自定义类和对应组件进行注册关联UIObjectFactory.SetPackageItemExtension("组件URL地址", typeof(自定义类));这一步一定要再创建对应面板之前。

        //基础包和组件面板的导入
        //设置默认字体
        UIConfig.defaultFont = "Other/STHUPO";
        //设置超链接字体颜色
        HtmlParseOptions.DefaultLinkColor = Color.red;
        //基础包和组件面板的导入
        //设置适配相关
        GRoot.inst.SetContentScaleFactor(1365, 768, UIContentScaler.ScreenMatchMode.MatchHeight);
        //当前包和依赖包的加载
        UIPackage package = UIPackage.AddPackage("UI/FGUI教程");
        foreach (var item in package.dependencies)
        {
            UIPackage.AddPackage("UI/" + item["name"]);
        }
        //设置按钮音效和音量
        UIConfig.buttonSound = (NAudioClip)UIPackage.GetItemAssetByURL("ui://Teach/btnMusic");
        UIConfig.buttonSoundVolumeScale = 0.5f;
        //默认竖直滚动条 再FGUI全局默认设置的进unity不用代码设置会不生效 或者用UIConfig设置
        UIConfig.verticalScrollBar = "ui://Teach/MyScrollBar3";
        ////创建组件对象 要设置为导出
        //GComponent view = UIPackage.CreateObject("FGUI教程", "Lesson36_FGUI基础_Unity中的使用必备_组件拓展类").asCom;
        ////添加到根对象
        //GRoot.inst.AddChild(view);


        ////进行面板和自定义类的关系注册
        //UIObjectFactory.SetPackageItemExtension("ui://FGUI教程/MyPanel", typeof(MyPanel));
        ////由于我们注册了 所以我们在创建该面板时 他会自动和自定义类进行关联 用自定义类来装载它
        //MyPanel myPanel = (MyPanel)UIPackage.CreateObject("FGUI教程", "MyPanel").asCom;
        //GRoot.inst.AddChild(myPanel);
        //myPanel.ShowInfo("MyPanel哈哈");

        #endregion

        #region 知识点三 FairyGUI编辑器导出代码功能

        //在使用绑定类之前,一定要调用XXXBinder.BindAll,并且在创建任何UI之前调用。
        FGUIJiaoChengBinder.BindAll();
        //使用绑定类创建UI的API是CreateInstance,不能直接new。
        UI_MyPanel uI_myPanel = UI_MyPanel.CreateInstance();
        //添加到Groot
        GRoot.inst.AddChild(uI_myPanel);
        //要添加什么方法自行去生成代码类中的添加
        uI_myPanel.ShowInfo("林文韬123");

        //注意:还是建议自己手写 不要依赖自动发布的代码 原因如下
        //1.要避免生成的代码 把现有的关键逻辑覆盖了 假如修改了组件 再重新发布 会把自己新加的逻辑覆盖
        //2.要注意生成的代码 控件名变化了 
        #endregion
    }
}

MyPanel

using FairyGUI;
using FairyGUI.Utils;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyPanel : GComponent
{
    //面板控件作为成员变量
    public GTextInput inputTxt;
    public GButton btnTest;

    //重写ConstructFromXML
    public override void ConstructFromXML(XML xml)
    {
        base.ConstructFromXML(xml);
        //在这里初始化 面板相关内容 比如获取某个控件 或者初始化面板显示 按钮监听等
        //在面板创建时 会自动执行这里面的逻辑
        inputTxt = this.GetChild("inputTxt").asTextInput;
        btnTest = this.GetChild("btnTest").asButton;

        btnTest.onClick.Add(() =>
        {
            Debug.Log("按钮点击");
        });
    }

    //成员方法 提供给外部
    public void ShowInfo(string str)
    {
        inputTxt.text = str;
    }
}

FGUIJiaoChengBinder

/** This is an automatically generated class by FairyGUI. Please do not modify it. **/

using FairyGUI;

namespace FGUIJiaoCheng
{
    public class FGUIJiaoChengBinder
    {
        public static void BindAll()
        {
            UIObjectFactory.SetPackageItemExtension(UI_Lesson18_FGUIJiChu_JiChuYuanJian_ZhuangZaiQi_ZhuangZaiQi.URL, typeof(UI_Lesson18_FGUIJiChu_JiChuYuanJian_ZhuangZaiQi_ZhuangZaiQi));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson19_FGUIJiChu_JiChuYuanJian_ZhuangZaiQi_3DNeiRongZhuangZaiQi.URL, typeof(UI_Lesson19_FGUIJiChu_JiChuYuanJian_ZhuangZaiQi_3DNeiRongZhuangZaiQi));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson20_FGUIJiChu_KongJian_WenBen_PuTongWenBen.URL, typeof(UI_Lesson20_FGUIJiChu_KongJian_WenBen_PuTongWenBen));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson21_FGUIJiChu_KongJian_WenBen_ZiTiDeChuLi.URL, typeof(UI_Lesson21_FGUIJiChu_KongJian_WenBen_ZiTiDeChuLi));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson22_FGUIJiChu_KongJian_WenBen_FuWenBen.URL, typeof(UI_Lesson22_FGUIJiChu_KongJian_WenBen_FuWenBen));
            UIObjectFactory.SetPackageItemExtension(UI_ExercisesPanel.URL, typeof(UI_ExercisesPanel));
            UIObjectFactory.SetPackageItemExtension(UI_ExercisesBagPanel.URL, typeof(UI_ExercisesBagPanel));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson22_LianXiTi.URL, typeof(UI_Lesson22_LianXiTi));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson23_FGUIJiChu_KongJian_WenBen_ShuRuWenBen.URL, typeof(UI_Lesson23_FGUIJiChu_KongJian_WenBen_ShuRuWenBen));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson23_LianXiTi.URL, typeof(UI_Lesson23_LianXiTi));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson24_FGUIJiChu_KongJian_Zu.URL, typeof(UI_Lesson24_FGUIJiChu_KongJian_Zu));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson25_FGUIJiChu_KongJian_KongZhiQi.URL, typeof(UI_Lesson25_FGUIJiChu_KongJian_KongZhiQi));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson26_FGUIJiChu_KongJian_GuanLianXiTong.URL, typeof(UI_Lesson26_FGUIJiChu_KongJian_GuanLianXiTong));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson26_LianXiTi.URL, typeof(UI_Lesson26_LianXiTi));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson27_FGUIJiChu_KongJian_BiaoQian.URL, typeof(UI_Lesson27_FGUIJiChu_KongJian_BiaoQian));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson28_FGUIJiChu_KongJian_AnNiu_PuTongAnNiu.URL, typeof(UI_Lesson28_FGUIJiChu_KongJian_AnNiu_PuTongAnNiu));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson28_LianXiTi.URL, typeof(UI_Lesson28_LianXiTi));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson29_FGUIJiChu_KongJian_AnNiu_DanXuanAnNiuHeFuXuanAnNiu.URL, typeof(UI_Lesson29_FGUIJiChu_KongJian_AnNiu_DanXuanAnNiuHeFuXuanAnNiu));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson29_LianXiTi.URL, typeof(UI_Lesson29_LianXiTi));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson13_FGUIJiChu_JiChuYuanJian_YuanJian.URL, typeof(UI_Lesson13_FGUIJiChu_JiChuYuanJian_YuanJian));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson14_FGUIJiChu_JiChuYuanJian_TuPian.URL, typeof(UI_Lesson14_FGUIJiChu_JiChuYuanJian_TuPian));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson15_FGUIJiChu_JiChuYuanJian_TuXing.URL, typeof(UI_Lesson15_FGUIJiChu_JiChuYuanJian_TuXing));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson16_FGUIJiChu_JiChuYuanJian_DongHua_XuLieZhenDongHua.URL, typeof(UI_Lesson16_FGUIJiChu_JiChuYuanJian_DongHua_XuLieZhenDongHua));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson30_FGUIJiChu_KongJian_JinDuTiao.URL, typeof(UI_Lesson30_FGUIJiChu_KongJian_JinDuTiao));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson31_FGUIJiChu_KongJian_HuaDongTiao.URL, typeof(UI_Lesson31_FGUIJiChu_KongJian_HuaDongTiao));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson31_LianXiTi.URL, typeof(UI_Lesson31_LianXiTi));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson33_FGUIJiChu_KongJian_GunDongRongQi.URL, typeof(UI_Lesson33_FGUIJiChu_KongJian_GunDongRongQi));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson33_LianXiTi.URL, typeof(UI_Lesson33_LianXiTi));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson33_LianXiTiBeiBaoMianBan.URL, typeof(UI_Lesson33_LianXiTiBeiBaoMianBan));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson34_FGUIJiChu_KongJian_LieBiao.URL, typeof(UI_Lesson34_FGUIJiChu_KongJian_LieBiao));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson34_LianXiTi.URL, typeof(UI_Lesson34_LianXiTi));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson34_LianXiTiBeiBaoMianBan.URL, typeof(UI_Lesson34_LianXiTiBeiBaoMianBan));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson35_FGUIJiChu_KongJian_XiaLaKuang.URL, typeof(UI_Lesson35_FGUIJiChu_KongJian_XiaLaKuang));
            UIObjectFactory.SetPackageItemExtension(UI_MyComboBox_popup.URL, typeof(UI_MyComboBox_popup));
            UIObjectFactory.SetPackageItemExtension(UI_MyComboBox2_popup.URL, typeof(UI_MyComboBox2_popup));
            UIObjectFactory.SetPackageItemExtension(UI_MyPanel.URL, typeof(UI_MyPanel));
            UIObjectFactory.SetPackageItemExtension(UI_ControllerTest.URL, typeof(UI_ControllerTest));
            UIObjectFactory.SetPackageItemExtension(UI_MyComboBox2_popup.URL, typeof(UI_MyComboBox2_popup));
            UIObjectFactory.SetPackageItemExtension(UI_TreeNode.URL, typeof(UI_TreeNode));
            UIObjectFactory.SetPackageItemExtension(UI_Lesson37_FGUIJiChu_UnityZhongDeShiYongBiBei_FenBianLvZiShiYing.URL, typeof(UI_Lesson37_FGUIJiChu_UnityZhongDeShiYongBiBei_FenBianLvZiShiYing));
        }
    }
}

UI_MyPanel

/** This is an automatically generated class by FairyGUI. Please do not modify it. **/

using FairyGUI;
using FairyGUI.Utils;
using UnityEngine;

namespace FGUIJiaoCheng
{
    public partial class UI_MyPanel : GComponent
    {
        public Controller m_RadioGroup;
        public Controller m_c1;
        public GImage m_imgTest;
        public GGraph m_graphTest;
        public GGraph m_graphTest2;
        public GMovieClip m_movieClip;
        public GLoader m_loader1;
        public GLoader3D m_3dLoader;
        public GTextField m_txtInfo2;
        public GTextField m_txtInfo;
        public GRichTextField m_richTxt1;
        public GTextInput m_inputTxt;
        public GGroup m_group1;
        public UI_ControllerTest m_controllerTest;
        public GLabel m_myLabel;
        public GButton m_btnTest;
        public GButton m_checkBox1;
        public GButton m_checkBox2;
        public GButton m_radioBox1;
        public GImage m_page1;
        public GImage m_page2;
        public GImage m_page3;
        public GProgressBar m_pbTest;
        public GSlider m_sliderTest;
        public GComponent m_svTest;
        public GList m_myList;
        public GComboBox m_comboBoxTest;
        public GGraph m_pos3D;
        public GGraph m_click3D;
        public GTree m_tree;
        public Transition m_Test;
        public const string URL = "ui://c8d1gzdoxu9p5d";

        public static UI_MyPanel CreateInstance()
        {
            return (UI_MyPanel)UIPackage.CreateObject("FGUI教程", "MyPanel");
        }

        public override void ConstructFromXML(XML xml)
        {
            base.ConstructFromXML(xml);

            m_RadioGroup = GetController("RadioGroup");
            m_c1 = GetController("c1");
            m_imgTest = (GImage)GetChild("imgTest");
            m_graphTest = (GGraph)GetChild("graphTest");
            m_graphTest2 = (GGraph)GetChild("graphTest2");
            m_movieClip = (GMovieClip)GetChild("movieClip");
            m_loader1 = (GLoader)GetChild("loader1");
            m_3dLoader = (GLoader3D)GetChild("3dLoader");
            m_txtInfo2 = (GTextField)GetChild("txtInfo2");
            m_txtInfo = (GTextField)GetChild("txtInfo");
            m_richTxt1 = (GRichTextField)GetChild("richTxt1");
            m_inputTxt = (GTextInput)GetChild("inputTxt");
            m_group1 = (GGroup)GetChild("group1");
            m_controllerTest = (UI_ControllerTest)GetChild("controllerTest");
            m_myLabel = (GLabel)GetChild("myLabel");
            m_btnTest = (GButton)GetChild("btnTest");
            m_checkBox1 = (GButton)GetChild("checkBox1");
            m_checkBox2 = (GButton)GetChild("checkBox2");
            m_radioBox1 = (GButton)GetChild("radioBox1");
            m_page1 = (GImage)GetChild("page1");
            m_page2 = (GImage)GetChild("page2");
            m_page3 = (GImage)GetChild("page3");
            m_pbTest = (GProgressBar)GetChild("pbTest");
            m_sliderTest = (GSlider)GetChild("sliderTest");
            m_svTest = (GComponent)GetChild("svTest");
            m_myList = (GList)GetChild("myList");
            m_comboBoxTest = (GComboBox)GetChild("comboBoxTest");
            m_pos3D = (GGraph)GetChild("pos3D");
            m_click3D = (GGraph)GetChild("click3D");
            m_tree = (GTree)GetChild("tree");
            m_Test = GetTransition("Test");

            m_btnTest.onClick.Add(() =>
            {
                Debug.Log("发布生成的代码" + "按钮点击");
            });
        }

        //成员方法 提供给外部
        public void ShowInfo(string str)
        {
            m_inputTxt.text = "发布生成的代码" + str;
        }
    }
}

36.3 练习题

在之前练习题的基础上,利用组件拓展类整理之前完成的练习题面板相关功能

设置整合所有练习题的面板,发布代码 找到对应的类ExercisesPanel


整合所有练习题逻辑,把之前写的Exercises代码的逻辑剪切到ExercisesPanel中 整理逻辑 修改命名

在Exercises处理注册逻辑和设置玩家逻辑

//一定要先注册
TeachBinder.BindAll();
//再显示
ExercisesPanel panel = ExercisesPanel.CreateInstance();
//再添加
GRoot.inst.AddChild(panel);
//关联玩家
panel.SetPlayer(player);

把背包相关的逻辑丢到背包面中,练习题面板只负责背包按钮点击打开背包面板

public partial class ExercisesBagPanel : GComponent
{
    public GList m_svTest;
    public GButton m_btnBack;
    public const string URL = "ui://wrs19joe5b993r";

    public static ExercisesBagPanel CreateInstance()
    {
        return (ExercisesBagPanel)UIPackage.CreateObject("Teach", "ExercisesBagPanel");
    }

    public override void ConstructFromXML(XML xml)
    {
        base.ConstructFromXML(xml);

        m_svTest = (GList)GetChildAt(3);
        m_btnBack = (GButton)GetChildAt(4);

        m_svTest.itemRenderer = RenderItem;
        m_svTest.SetVirtual();
        m_svTest.numItems = 50;

        m_btnBack.onClick.Add(()=> {
            //隐藏背包面板
            UIManager.Instance.HidePanel<ExercisesBagPanel>();
        });
    }

    private void RenderItem(int index, GObject obj)
    {
        //在这里面对每一个item进行初始化操作
    }
}

36.4 练习题代码

Exercises

using FairyGUI;
using FairyGUI.Utils;
using System.Collections;
using System.Collections.Generic;
using Teach;
using UnityEngine;

public class Exercises : MonoBehaviour
{
    public Player player;

    void Start()
    {
        UIConfig.defaultFont = "Other/STHUPO";
        HtmlParseOptions.DefaultLinkColor = Color.red;

        //设置适配相关
        GRoot.inst.SetContentScaleFactor(1365, 768, UIContentScaler.ScreenMatchMode.MatchHeight);
        //包和依赖包的加载
        UIPackage package = UIPackage.AddPackage("UI/Teach");
        foreach (var item in package.dependencies)
        {
            UIPackage.AddPackage(item["name"]);
        }
        //设置默认按钮音效
        UIConfig.buttonSound = (NAudioClip)UIPackage.GetItemAssetByURL("ui://Teach/btnMusic");
        //设置默认按钮音效大小
        UIConfig.buttonSoundVolumeScale = 0.5f;

        //一定要先注册
        TeachBinder.BindAll();
        //再显示
        ExercisesPanel panel = ExercisesPanel.CreateInstance();
        //再添加
        GRoot.inst.AddChild(panel);
        //关联玩家
        panel.SetPlayer(player);
    }


    public static void ClickLinkOpenPanel(EventContext eventData)
    {
        string info = eventData.data.ToString();
        switch (info)
        {
            case "1":
                print("打开任务面板");
                break;
            case "2":
                print("打开装备面板");
                break;
            case "3":
                print("打开PVP面板");
                break;
            case "4":
                print("打开商店面板");
                break;
            default:
                print("数据未知");
                break;
        }
    }
}

ExercisesPanel

/** This is an automatically generated class by FairyGUI. Please do not modify it. **/

using FairyGUI;
using FairyGUI.Utils;

namespace Teach
{
    public partial class ExercisesPanel : GComponent
    {
        public Controller m_RadioGroup;
        public GRichTextField m_richTxt1;
        public GRichTextField m_richTxt2;
        public GTextInput m_inputTxt;
        public GTextField m_txtInfo;
        public GTextField m_txtName;
        public GButton m_btnFire;
        public GButton m_checkBoxMusic;
        public GButton m_radioBoxOpen;
        public GButton m_radioBoxClose;
        public GSlider m_soundSlider;
        public GButton m_btnBag;
        public const string URL = "ui://wrs19joehkfz2s";

        private Player player;

        public static ExercisesPanel CreateInstance()
        {
            return (ExercisesPanel)UIPackage.CreateObject("Teach", "ExercisesPanel");
        }

        public override void ConstructFromXML(XML xml)
        {
            base.ConstructFromXML(xml);

            m_RadioGroup = GetControllerAt(0);
            m_richTxt1 = (GRichTextField)GetChildAt(0);
            m_richTxt2 = (GRichTextField)GetChildAt(1);
            m_inputTxt = (GTextInput)GetChildAt(3);
            m_txtInfo = (GTextField)GetChildAt(4);
            m_txtName = (GTextField)GetChildAt(7);
            m_btnFire = (GButton)GetChildAt(15);
            m_checkBoxMusic = (GButton)GetChildAt(16);
            m_radioBoxOpen = (GButton)GetChildAt(17);
            m_radioBoxClose = (GButton)GetChildAt(18);
            m_soundSlider = (GSlider)GetChildAt(19);
            m_btnBag = (GButton)GetChildAt(20);

            m_richTxt1.onClickLink.Add(Exercises.ClickLinkOpenPanel);
            m_richTxt2.onClickLink.Add(Exercises.ClickLinkOpenPanel);

            //输入文本练习题相关
            m_inputTxt.onChanged.Add(() =>
            {
                //让文本控件的内容和输入的内容一致
                m_txtInfo.text = m_inputTxt.text;
            });

            m_btnFire.onClick.Add(() =>
            {
                player.Fire();
            });

            m_checkBoxMusic.onChanged.Add(() =>
            {
                if (m_checkBoxMusic.selected)
                    GRoot.inst.EnableSound();
                else
                    GRoot.inst.DisableSound();
            });

            Controller c = this.GetController("RadioGroup");
            c.onChanged.Add(() =>
            {
                if (c.selectedIndex == 0)
                    GRoot.inst.EnableSound();
                else
                    GRoot.inst.DisableSound();
            });

            m_soundSlider.onChanged.Add(() => {
                GRoot.inst.soundVolume = (float)m_soundSlider.value;
            });

            m_btnBag.onClick.Add(() =>
            {
                ExercisesBagPanel bagPanel = ExercisesBagPanel.CreateInstance();
                GRoot.inst.AddChild(bagPanel);
            });
        }



        

        public void SetPlayer(Player player)
        {
            this.player = player;
        }
    }
}

ExercisesBagPanel

/** This is an automatically generated class by FairyGUI. Please do not modify it. **/

using FairyGUI;
using FairyGUI.Utils;

namespace Teach
{
    public partial class ExercisesBagPanel : GComponent
    {
        public GList m_svTest;
        public const string URL = "ui://wrs19joe5b993r";

        public static ExercisesBagPanel CreateInstance()
        {
            return (ExercisesBagPanel)UIPackage.CreateObject("Teach", "ExercisesBagPanel");
        }

        public override void ConstructFromXML(XML xml)
        {
            base.ConstructFromXML(xml);

            m_svTest = (GList)GetChildAt(3);

            //for (int i = 0; i < 50; i++)
            //{
            //    //方式一:
            //    //GObject img = UIPackage.CreateObject("Teach", "quanlity_3");
            //    //m_svTest.AddChild(img);

            //    //方式二:(建议使用)
            //    //创建从缓存池中取  之后 移除时  也用对应方法 放入缓存池 这样更加节约性能
            //    m_svTest.AddItemFromPool();
            //}

            //方式三:
            m_svTest.itemRenderer = RenderItem;
            //如果要显示的内容对象多 那么可以设置为虚拟列表
            m_svTest.SetVirtual();
            m_svTest.numItems = 50;
        }

        private void RenderItem(int index, GObject obj)
        {
            //在这里面对每一个item进行初始化操作
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏