前二章主要分享的框架层代码
后面介绍使用实例
生成代码的模板代码:
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);
}
}