UIWindow和UIWidget的预制体为啥都要加Canvas和GraphicRaycaster
UGUI Canvas上元素变更操作会导致整个Canvas网格重建,非常耗时。而且分Canvas 比较好调整order in layer 来处理层级关系。正常都是一个面板一个canva。如果所有panel 都是一个canvas ,那你一个元素变化会导致整个canvas网格重建,性能也不好。
GraphicRaycaster,让该画布的按钮等可以点击。
一、游戏菜单(UIWindow)
先做一个简单的菜单,命名根据规则
复制粘贴
二、商店(UIWidget)
1、UIWindow和UIWidget关系
整个窗口的是个UIWindow,里面所有部件都是UIWidget。比如背包系统,整个界面可能是个BagWindow,左上角为血条Widget,顶部为切换页签的Widget。
灵活定义
UIWidget : 格子
UIWidget : 背包面板Grid
UIWindow : 仓库
UIWindow : 背包
UIWIndow :装备栏
2、实践
商店界面
找了三个类型的商店界面,取一套公共的作为UI_Shop(UIWindow),和其他三个不同的作为子界面(UIWidget)
一般生成后,在点一下这个将脚本覆盖就好。等有时间可以拓展一下这里,会更好用。
商店的三个子界面
using UnityEngine;
using UnityEngine.UI;
using TEngine;
namespace GameLogic
{
partial class Shop_LIfe:UIWidget
{
#region 脚本工具生成的代码
private Button m_btnGem1;
private Button m_btnGem2;
private Button m_btnAsk;
protected override void ScriptGenerator()
{
m_btnGem1 = FindChildComponent<Button>("List/m_btnGem1");
m_btnGem2 = FindChildComponent<Button>("List/m_btnGem2");
m_btnAsk = FindChildComponent<Button>("List/m_btnAsk");
m_btnGem1.onClick.AddListener(OnClickGem1Btn);
m_btnGem2.onClick.AddListener(OnClickGem2Btn);
m_btnAsk.onClick.AddListener(OnClickAskBtn);
}
private void OnClickAskBtn()
{
Log.Debug("1");
}
private void OnClickGem2Btn()
{
Log.Debug("2");
}
private void OnClickGem1Btn()
{
Log.Debug("3");
}
#endregion
}
}
这次采用这个生成方式,还有好几种就不一个一个讲了,看看源码就行
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using TEngine;
namespace GameLogic
{
[Window(UILayer.UI)]
class UI_Shop : UIWindow
{
private Shop_LIfe m_Shop_Life;
private Shop_Gem m_Shop_Gem;
private Shop_Gold m_Shop_Gold;
#region 脚本工具生成的代码
private Button m_btnTab_Life;
private Button m_btnTab_Gem;
private Button m_btnTab_Gold;
private Button m_btnClose_Blue;
protected override void ScriptGenerator()
{
m_btnTab_Life = FindChildComponent<Button>("Dimed/Popup/m_btnTab_Life");
m_btnTab_Gem = FindChildComponent<Button>("Dimed/Popup/m_btnTab_Gem");
m_btnTab_Gold = FindChildComponent<Button>("Dimed/Popup/m_btnTab_Gold");
m_btnClose_Blue = FindChildComponent<Button>("Dimed/Popup/m_btnClose_Blue");
m_btnTab_Life.onClick.AddListener(OnClickTab_LifeBtn);
m_btnTab_Gem.onClick.AddListener(OnClickTab_GemBtn);
m_btnTab_Gold.onClick.AddListener(OnClickTab_GoldBtn);
m_btnClose_Blue.onClick.AddListener(OnClickClose_BlueBtn);
}
#endregion
protected override async void OnCreate()
{
base.OnCreate();
m_Shop_Life=await CreateWidgetByPathAsync<Shop_LIfe>(this.transform,"Shop_LIfe",false);
m_Shop_Gem=await CreateWidgetByPathAsync<Shop_Gem>(this.transform,"Shop_Gem",false);
m_Shop_Gold= await CreateWidgetByPathAsync<Shop_Gold>(this.transform,"Shop_Gold",true);
}
#region 事件
private void OnClickTab_LifeBtn()
{
m_Shop_Life.Visible = true;
m_Shop_Gem.Visible = false;
m_Shop_Gold.Visible = false;
}
private void OnClickTab_GemBtn()
{
m_Shop_Life.Visible = false;
m_Shop_Gem.Visible = true;
m_Shop_Gold.Visible = false;
}
private void OnClickTab_GoldBtn()
{
m_Shop_Life.Visible = false;
m_Shop_Gem.Visible = false;
m_Shop_Gold.Visible = true;
}
private void OnClickClose_BlueBtn()
{
}
#endregion
}
}