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

    }
}

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐