【MVC界面框架搭建 三】

21 篇文章 1 订阅
文章展示了如何使用自动生成的代码来构建游戏界面,包括UI控件、事件转发、页面切换以及数据绑定。代码框架用于创建登录界面和页签切换子界面,事件通过CtrlEvent在界面层和逻辑层之间传递。
摘要由CSDN通过智能技术生成

前二章主要分享的框架层代码
后面介绍使用实例
生成代码的模板代码:

using System.Collections;
using System.Collections.Generic;
using UIFrameWork;
using UnityEngine;

public class XViewCtrl : UICtrlPanel
{
    //path
    protected override string AssetPath { get { return "--respath--"; } }
    public override string AssetName { get { return "--resname--"; } }

    private UIViewBase uiViewBase;
    // view init
    protected override void OnViewInit()
    {
//fillviewinit
    }
    // attach ext ctrls
    protected override void OnAttachCtrls()
    {
    }
    //on forward
    public override void OnForward()
    {
        uiViewBase.OnForward();
    }
    //on attach ctrls forward
    protected override void OnAttachCtrlsForward()
    {
    }
    // on background
    public override void OnBackground()
    {
        uiViewBase.OnBackground();
    }
    //add events
    protected override void OnAddEvents()
    {
//filladdevents
    }
    //remove events
    protected override void OnRemoveEvents()
    {
//fillremoveevents
    }
//fillevents
    //on destroy
    protected override void OnDestroy()
    {
        uiViewBase.OnDestroy();
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class XUIView : UIViewBase
{
    //component info
//Local Compnent
    //init
    public override void OnInit()
    {
//Init Component
    }
    //forward
    public override void OnForward()
    {
//On Forward
    }
}

简单界面实例:
登录界面的ctrl 和面板

using System.Collections;
using System.Collections.Generic;
using UIFrameWork;
using UnityEngine;

public class UILoginPanelCtrl : UICtrlPanel
{
    //path
    protected override string AssetPath { get { return "Assets/Art/Bundle/UIPrefabs/UILoginPanel.prefab"; } }
    public override string AssetName { get { return "UILoginPanel"; } }
    // view init
    protected override void OnViewInit()
    {
		uiViewBase = new UILoginPanel();
        uiViewBase.SetViewReference(viewReference);
        SetUIViewBase(uiViewBase);
        uiViewBase.OnInit();
    }
    //on forward
    public override void OnForward()
    {
        uiViewBase.OnForward();
    }
    // on background
    public override void OnBackground()
    {
        uiViewBase.OnBackground();
    }
    //add events
    protected override void OnAddEvents()
    {
		AddCtrlEvent("onClick_btn", OnClick_btn);
    }
    //remove events
    protected override void OnRemoveEvents()
    {
		RemoveCtrlEvent("onClick_btn", OnClick_btn);
    }
	private void OnClick_btn(System.Object obj) 
	{
        GameSceneManager.Instance.EnterScene(GameSceneType.Main,false, null);
    }
    //on destroy
    protected override void OnDestroy()
    {
        uiViewBase.OnDestroy();
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UILoginPanel : UIViewBase
{
    //component info
	private Image _bg;
	private TypeMaker _maker;
	private Button _btn;
	private Text _txt;
    //init
    public override void OnInit()
    {
		this._bg = this.viewReference.binders[0].go.GetComponent<Image>();
		this._maker = this.viewReference.binders[1].go.GetComponent<TypeMaker>();
		this._btn = this.viewReference.binders[2].go.GetComponent<Button>();
		this._btn.onClick.AddListener(() => { ctrlEvent.SendMessage("onClick_btn", null); });
		this._txt = this.viewReference.binders[3].go.GetComponent<Text>();
    }
    //forward
    public override void OnForward()
    {
		this._maker.MakerByCount(1, (oGo,oIndex) => { });
		this._txt.text = "登录";
    }
}

上面界面的代码除了一个登录界面的事件实现,其他代码逻辑都是自动生成,界面层的点击或者其他事件通过CtrlEvent 传递 。
复制界面的介绍:

using System.Collections;
using System.Collections.Generic;
using UIFrameWork;
using UnityEngine;
public class UITableSubPanelCtrlData
{
    public TablePanelCtrlData tablePanelCtrlData;
    private System.Action<int> onSelectAction;
    public UITableSubPanelCtrlData() {
        //tablePanelCtrlData = new TablePanelCtrlData();
    }
    public UITableSubPanelCtrlData(List<string> pShowTexts,List<string> pHideTexts,int pDefaultIndex) {
        tablePanelCtrlData = new TablePanelCtrlData(pShowTexts, pHideTexts, pDefaultIndex);
        tablePanelCtrlData.SetOnSelectIndexAction(OnSelectIndex);
    }

    public void SetSelectAction(System.Action<int> pOnSelectAction) {
        onSelectAction = pOnSelectAction;
    }
    public int curSelectIndex;
    public void OnSelectIndex(int pIndex)
    {
        //Debug.LogError($"OnSelectIndex {pIndex}");
        curSelectIndex = pIndex;
        onSelectAction?.Invoke(curSelectIndex);
    }
    public static UITableSubPanelCtrlData LoadTestData() {
        var showTexts = new List<string>() { "TestShow1", "TestShow2" };
        var hideTexts = new List<string>() { "TestHide1", "TestHide2" };
        var ctrlData = new UITableSubPanelCtrlData(showTexts, hideTexts,0);
        return ctrlData;
    }
}
//切换页签的子界面控制
public class UITableSubPanelCtrl : UICtrlPanel
{
    //path
    protected override string AssetPath { get { return ""; } }
    public override string AssetName { get { return "UITableSubPanel"; } }

    private UITableSubPanel uiTableSubPanel;
    private TablePanelCtrl panelCtrl;
    private UITableSubPanelCtrlData uITableSubPanelCtrlData;
    private List<UICtrlSub> subs = new List<UICtrlSub>();
    private UICtrlSub curSubCtrl;
    private int selectIndex;

    // view init
    protected override void OnViewInit()
    {
        uiTableSubPanel = new UITableSubPanel();
        uiTableSubPanel.SetViewReference(viewReference);
        uiTableSubPanel.OnInit();
        SetUIViewBase(uiTableSubPanel);
    }

    protected override void OnAttachCtrls()
    {
        panelCtrl = new TablePanelCtrl();
        panelCtrl.SetFillPanelAndParentAction(GetPanelCtrl);
        panelCtrl.SetTablePanelCtrlData(uITableSubPanelCtrlData.tablePanelCtrlData);

        var uiCtrl1 = new SubPaneTestCtrl();
        uiCtrl1.SetFillPanelAndParentAction(SetSubPanelTestParent);
        subs.Add(uiCtrl1);
        var uiCtrl2 = new SubPaneTest2Ctrl();
        uiCtrl2.SetFillPanelAndParentAction(SetSubPanelTestParent);
        subs.Add(uiCtrl2);
    }
    protected override void OnAttachCtrlsForward() {
        OpenSubCtrl(panelCtrl, null);
        OnSelectIndex(selectIndex);
    }

    public void SetSubPanelTestParent(UICtrlBase pUICtrlBase, System.Action<GameObject, GameObject> pCallBack) {
        pCallBack?.Invoke(uiTableSubPanel._SubPanelsRoot,null);
    }
    public void SetUITableSubPanelCtrlData(UITableSubPanelCtrlData pUITableSubPanelCtrlData) 
    {
        uITableSubPanelCtrlData = pUITableSubPanelCtrlData;
        uITableSubPanelCtrlData.SetSelectAction(OnSelectIndex);
        selectIndex = uITableSubPanelCtrlData.curSelectIndex;
    }
    private void OnSelectIndex(int pIndex) {
        selectIndex = pIndex;
        var subCtrl = subs[pIndex];
        if (curSubCtrl == subCtrl)
            return;
        if (curSubCtrl != null) {
            curSubCtrl.DoHide();
        }
        curSubCtrl = subCtrl;
        OpenSubCtrl(subCtrl,null,true);
        panelCtrl?.OnNewSelectIndex(pIndex);
    }
    private void GetPanelCtrl(UICtrlBase pUICtrlBase, System.Action<GameObject,GameObject> pCallBack) {
        var subPanelGo = uiTableSubPanel._TablePanel.gameObject;
        pCallBack?.Invoke(subPanelGo.transform.parent.gameObject, subPanelGo);
    }
    //on forward
    public override void OnForward()
    {
        uiTableSubPanel.OnForward();
    }
    // on background
    public override void OnBackground()
    {
        uiTableSubPanel.OnBackground();
    }
    //add events
    protected override void OnAddEvents()
    {
		AddCtrlEvent("onClick_backBtn", OnClick_backBtn);
		AddCtrlEvent("onClick_homeBtn", OnClick_homeBtn);
    }
    //remove events
    protected override void OnRemoveEvents()
    {
		RemoveCtrlEvent("onClick_backBtn", OnClick_backBtn);
		RemoveCtrlEvent("onClick_homeBtn", OnClick_homeBtn);
    }
	private void OnClick_backBtn(System.Object obj) 
	{
        policyBase?.CloseTopCtrl();
	}
	private void OnClick_homeBtn(System.Object obj) 
	{
        policyBase?.CloseToHomeCtrl();
	}
    //on destroy
    protected override void OnDestroy()
    {
        uiTableSubPanel.OnDestroy();
        curSubCtrl = null;
        panelCtrl.DestoryPrefab(null);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//切换页签的子界面
public class UITableSubPanel : UIViewBase
{
    //component info
	public GameObject _SubPanelsRoot;
	private Button _backBtn;
	private Text _backtxt;
	private Button _homeBtn;
	private Text _hometxt;
	public ViewReference _TablePanel;
    //init
    public override void OnInit()
    {
		this._SubPanelsRoot = this.viewReference.binders[0].go;
		this._backBtn = this.viewReference.binders[1].go.GetComponent<Button>();
		this._backBtn.onClick.AddListener(() => { ctrlEvent.SendMessage("onClick_backBtn", null); });
		this._backtxt = this.viewReference.binders[2].go.GetComponent<Text>();
		this._homeBtn = this.viewReference.binders[3].go.GetComponent<Button>();
		this._homeBtn.onClick.AddListener(() => { ctrlEvent.SendMessage("onClick_homeBtn", null); });
		this._hometxt = this.viewReference.binders[4].go.GetComponent<Text>();
		this._TablePanel = this.viewReference.binders[5].go.GetComponent<ViewReference>();
    }
    //forward
    public override void OnForward()
    {
		this._backtxt.text = "返回";
		this._hometxt.text = "主页";
    }
}
using System.Collections;
using System.Collections.Generic;
using UIFrameWork;
using UnityEngine;


public class TablePanelCtrlData
{
    public List<tableItemCtrlData> itemDatas = new List<tableItemCtrlData>();
    public int curSelectIndex;
    public System.Action<int> onSelectAction;

    public TablePanelCtrlData(List<string> pShowTexts, List<string> pHideTexts,int pDefaultIndex) {
        curSelectIndex = pDefaultIndex;
        for (var i = 0; i < pShowTexts.Count; i++) {
            var tableItemCtrlData = new tableItemCtrlData(pShowTexts[i], pHideTexts[i],i);
            tableItemCtrlData.SetCurSelectIndex(curSelectIndex);
            //tableItemCtrlData.SetRp(false);
            tableItemCtrlData.SetOnSelectAction(OnSelectIndex);
            itemDatas.Add(tableItemCtrlData);
        }
    }
    public void SetOnSelectIndexAction(System.Action<int> pOnSelectAction) {
        onSelectAction = pOnSelectAction;
    }
    public void OnSelectIndex(int pIndex) {
        curSelectIndex = pIndex;
        //Debug.LogError($"TablePanelCtrlData OnSelectIndex{pIndex}");
        onSelectAction?.Invoke(pIndex);
    }
}
//切换页签的单元界面控制
public class TablePanelCtrl : UICtrlSub
{
    //path
    protected override string AssetPath { get { return "Assets/Art/Bundle/UIPrefabs/UITableSubPanel.prefab"; } }
    public override string AssetName { get { return "_TablePanel"; } }
    private TablePanel tablePanel;
    private TablePanelCtrlData tablePanelCtrlData;
    private List<tableItemCtrl> tableItemCtrls = new List<tableItemCtrl>();
    // view init
    protected override void OnViewInit()
    {
        tablePanel = new TablePanel();
        tablePanel.SetViewReference(viewReference);
        tablePanel.OnInit();
        SetUIViewBase(tablePanel);
    }
    protected override void OnAttachCtrls()
    {
        for (var i = tableItemCtrls.Count; i < tablePanelCtrlData.itemDatas.Count; i++)
        {
            var itemData = tablePanelCtrlData.itemDatas[i];
            var itemCtrl = new tableItemCtrl();
            itemCtrl.SettableItemCtrlData(itemData);
            itemCtrl.SetFillPanelAndParentAction(SetGetFillPanelParentFunc);
            tableItemCtrls.Add(itemCtrl);
        }
    }
    protected override void OnAttachCtrlsForward()
    {
        tableItemCtrls.ForEach((oItemCtrl) =>
        {
            this.OpenItemCtrl(oItemCtrl, null,true);
        });
    }
    public void OnNewSelectIndex(int pNewSelectIndex)
    {
        tableItemCtrls.ForEach((oItemCtrl) =>
        {
            oItemCtrl.SetNewSelectIndex(pNewSelectIndex);
        });
    }
    //fill data
    public void SetTablePanelCtrlData(TablePanelCtrlData pTablePanelCtrlData) {
        tablePanelCtrlData = pTablePanelCtrlData;
    }
    //on forward
    public override void OnForward()
    {
        tablePanel.SetTablePanelData(tablePanelCtrlData);
        tablePanel.OnForward();
    }
    private void SetGetFillPanelParentFunc(UICtrlBase pCtrlBase,System.Action<GameObject,GameObject> pCallBack) {
        var itemCtrl = pCtrlBase as tableItemCtrl;
        var itemGo = tablePanel.GetItemGo(itemCtrl.index);
        pCallBack?.Invoke(itemGo.transform.parent.gameObject, itemGo);
    }
    // on background
    public override void OnBackground()
    {
        tablePanel.OnBackground();
    }
    //add events
    protected override void OnAddEvents()
    {
        AddCtrlEvent("OnAddItemGo", OnAddItemGo);
    }
    //remove events
    protected override void OnRemoveEvents()
    {
        RemoveCtrlEvent("OnAddItemGo", OnAddItemGo);
    }

    private void OnAddItemGo(object pobj) { 
        
    }
    //on destroy
    protected override void OnDestroy()
    {
        tablePanel.OnDestroy();
    }
}
using EventG;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//切换页签的单元界面
public class TablePanel : UIViewBase
{
    //component info
	private TypeMaker _tableMaker;
    private TablePanelCtrlData tablePanelCtrlData;
    public List<GameObject> makerItems = new List<GameObject>();
    //init
    public override void OnInit()
    {
		this._tableMaker = this.viewReference.binders[0].go.GetComponent<TypeMaker>();
    }
    public GameObject GetItemGo(int pIndex) {
        return makerItems[pIndex];
    }
    // fill data
    public void SetTablePanelData(TablePanelCtrlData pTablePanelCtrlData) {
        tablePanelCtrlData = pTablePanelCtrlData;
    }
    //forward
    public override void OnForward()
    {
        makerItems.Clear();
        this._tableMaker.MakerByCount(tablePanelCtrlData.itemDatas.Count, (oGo,oIndex) => {
            makerItems.Add(oGo);
            // ctrlEvent.SendMessage("OnNewItemGo",new DoubleInfoT<GameObject,int>(oGo,oIndex));
        });
        //ctrlEvent.SendMessage("OnMakerFinish", makerItems.Count);
    }
}
using System.Collections;
using System.Collections.Generic;
using UIFrameWork;
using UnityEngine;

public class tableItemCtrlData
{
    public string showTxt;
    public string hideTxt;
    public bool rp;
    public int index;
    public int curSelectIndex;
    private System.Action<int> selectAction;

    public tableItemCtrlData(string pShowTxt,string pHideTxt,int pIndex) {
        showTxt = pShowTxt;
        hideTxt = pHideTxt;
        index = pIndex;
        //var rp = UnityEngine.Random.Range(1, 3) == 1;
        //SetRp(rp);
    }
    public void SetRp(bool pIsRp) {rp = pIsRp;}

    public void SetCurSelectIndex(int pSelectIndex) {
        curSelectIndex = pSelectIndex;
    }
    public void SetOnSelectAction(System.Action<int> pSelectAction) {
        selectAction = pSelectAction;
    }
    public void OnSelectIndex(int pIndex) {
        selectAction?.Invoke(pIndex);
    }
}
//切换的页签按钮单元控制
public class tableItemCtrl : UICtrlItem
{
    //path
    protected override string AssetPath { get { return "Assets/Art/Bundle/UIPrefabs/UITableSubPanel.prefab"; } }
    public override string AssetName { get { return "_tableItem"; } }
    private tableItem tableItem;
    private tableItemCtrlData tableItemCtrlData;
    public int index;

    // view init
    protected override void OnViewInit()
    {
        tableItem = new tableItem();
        tableItem.SetViewReference(viewReference);
        tableItem.OnInit();
        SetUIViewBase(tableItem);
    }
    //fill data
    public void SettableItemCtrlData(tableItemCtrlData ptableItemCtrlData)
    {
        this.tableItemCtrlData = ptableItemCtrlData;
        index = ptableItemCtrlData.index;
    }
    public void SetNewSelectIndex(int pSelectIndex) {
        this.tableItemCtrlData.SetCurSelectIndex(pSelectIndex);
        OnForward();
    }
    //on forward
    public override void OnForward()
    {
        tableItem.SetTableItem(this.tableItemCtrlData.showTxt, this.tableItemCtrlData.hideTxt, this.tableItemCtrlData.curSelectIndex == index, this.tableItemCtrlData.rp);
        tableItem.OnForward();
    }
    // on background
    public override void OnBackground()
    {
        tableItem.OnBackground();
    }
    //add events
    protected override void OnAddEvents()
    {
		AddCtrlEvent("onClick_btn", OnClick_btn);
    }
    //remove events
    protected override void OnRemoveEvents()
    {
		RemoveCtrlEvent("onClick_btn", OnClick_btn);
    }
	private void OnClick_btn(System.Object obj) 
	{
        tableItemCtrlData?.OnSelectIndex(index);
    }
    //on destroy
    protected override void OnDestroy()
    {
        tableItem.OnDestroy();
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//切换的页签按钮单元
public class tableItem : UIViewBase
{
    //component info
	private Image _rp;
	private Text _hideTxt;
	private Text _showTxt;
	private Button _btn;
	
	private string showTxt;
	private string hideTxt;
	private bool rpEnable;
	private bool isSelect;
	//init
	public override void OnInit()
    {
		this._rp = this.viewReference.binders[0].go.GetComponent<Image>();
		this._hideTxt = this.viewReference.binders[1].go.GetComponent<Text>();
		this._showTxt = this.viewReference.binders[2].go.GetComponent<Text>();
		this._btn = this.viewReference.binders[3].go.GetComponent<Button>();
		this._btn.onClick.AddListener(() => { 
			ctrlEvent.SendMessage("onClick_btn", null); 
		});
    }
	public void SetTableItem(string showTxt, string hideTxt,bool isSelect,bool rpEnable) {
		this.showTxt = showTxt;
		this.hideTxt = hideTxt;
		this.isSelect = isSelect;
		this.rpEnable = rpEnable;
	}
    //forward
    public override void OnForward()
    {
		this._hideTxt.text = hideTxt;
		this._showTxt.text = showTxt;
		this._hideTxt?.gameObject.SetActive(!isSelect);
		this._showTxt?.gameObject.SetActive(isSelect);
		this._rp?.gameObject.SetActive(rpEnable);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值