【Unity筆記01】基于單例模式的簡單UI框架

單例模式的UIManager

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UIManager 
{private static UIManager _instance;public Dictionary<string, string> pathDict;public Dictionary<string, GameObject> prefabDict;public Dictionary<string, BasePanel> panelDict;private Transform _uiRoot;//單例模式public static UIManager Instance{get{if( _instance == null ){_instance = new UIManager();}return _instance;}}private UIManager(){Init();}private void Init(){prefabDict = new Dictionary<string, GameObject>();panelDict = new Dictionary<string, BasePanel>();pathDict = new Dictionary<string, string>(){{UIConst.Menu,"Prefabs/Pop/Menu" },{UIConst.SettingPop,"Prefabs/Pop/SettingPop" },{UIConst.OtherPop,"Prefabs/Pop/OtherPop" }};}public Transform UIRoot{get{if( _uiRoot == null ){_uiRoot = GameObject.Find("Canvas").transform;}return _uiRoot;}}public BasePanel OpenPanel(string name, bool isOnly = true){//如果要只顯示一個彈窗的話if(isOnly){CloseAllPops(name);}BasePanel panel = null;if(panelDict.TryGetValue(name, out panel)){Debug.Log("界面已經打開過" + name);panel.OpenPanel(name);return null;}string path = "";if( !pathDict.TryGetValue(name, out path) ){Debug.Log("路徑錯誤"+path);return null;}GameObject panelPrefab = null;if(!panelDict.TryGetValue(name, out panel)){string realPath =path;panelPrefab=Resources.Load<GameObject>(realPath);prefabDict.Add(name, panelPrefab);}//openGameObject panelObject = GameObject.Instantiate(panelPrefab, UIRoot, false);Debug.Log(panelObject.name);panel= panelObject.GetComponent<BasePanel>();if( panel == null ){Debug.Log("沒有腳本哦");}panelDict.Add(name,panel);panel.OpenPanel(name);return panel;}public bool ClosePanel(string name){BasePanel panel= null;if(! panelDict.TryGetValue(name,out panel)){Debug.Log("界面未打開");return false;}panel.ClosePanel();return true;}public void CloseAllPops(string name){foreach(var pair in panelDict){if (pair.Key == name) continue;pair.Value.ClosePanel();}}
}

面板的基類?

控制面板的打開和關閉,帶動畫

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;public class BasePanel : MonoBehaviour
{private bool isRemove = false;private string name;public virtual void OpenPanel(string name){this.name = name;gameObject.SetActive(true);OpenAnimation(gameObject);}public virtual void ClosePanel(){isRemove = true;CloseAnimation(gameObject).OnComplete(() =>{gameObject.SetActive(false);});//gameObject.SetActive(false);}public void OpenAnimation(GameObject gameObject){//用dotween 從0%放大到105% 再縮小到95% 再到100%//初始縮放為 0gameObject.transform.localScale = Vector3.zero;//創建動畫序列Sequence scaleSequence = DOTween.Sequence();// 添加動畫步驟scaleSequence.Append(gameObject.transform.DOScale(1.05f, 0.3f)); // 放大到 105%scaleSequence.Append(gameObject.transform.DOScale(0.95f, 0.3f)); // 縮小到 95%scaleSequence.Append(gameObject.transform.DOScale(1.0f, 0.3f));  // 回到 100%// 緩動scaleSequence.SetEase(Ease.OutBack);}public Tween CloseAnimation(GameObject gameObject){Sequence scaleSequence = DOTween.Sequence();scaleSequence.Append(gameObject.transform.DOScale(0f, 0.2f));return scaleSequence;}
}

常量

?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UIConst 
{public const string Menu = "Menu";public const string SettingPop = "SettingPop";public const string OtherPop = "OtherPop";
}

使用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MenuPanel : BasePanel
{public void OpenNest(){UIManager.Instance.OpenPanel(UIConst.OtherPop);}public void Close(){UIManager.Instance.ClosePanel(UIConst.Menu);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87516.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87516.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87516.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入解析 OPC UA:工業自動化與物聯網的關鍵技術

在當今快速發展的工業自動化和物聯網&#xff08;IoT&#xff09;領域&#xff0c;數據的無縫交換和集成變得至關重要。OPC UA&#xff08;Open Platform Communications Unified Architecture&#xff09;作為一種開放的、跨平臺的工業通信協議&#xff0c;正在成為這一領域的…

MCP 協議的未來發展趨勢與學習路徑

MCP 協議的未來發展趨勢 6.1 MCP 技術演進與更新 MCP 協議正在快速發展&#xff0c;不斷引入新的功能和改進。根據 2025 年 3 月 26 日發布的協議規范&#xff0c;MCP 的最新版本已經引入了多項重要更新&#xff1a; 1.HTTP Transport 正式轉正&#xff1a;引入 Streamable …

硬件嵌入式學習路線大總結(一):C語言與linux。內功心法——從入門到精通,徹底打通你的任督二脈!

嵌入式工程師學習路線大總結&#xff08;一&#xff09; 引言&#xff1a;C語言——嵌入式領域的“屠龍寶刀”&#xff01; 兄弟們&#xff0c;如果你想在嵌入式領域闖出一片天地&#xff0c;C語言就是你手里那把最鋒利的“屠龍寶刀”&#xff01;它不像Python那樣優雅&#xf…

MCP server資源網站去哪找?國內MCP服務合集平臺有哪些?

在人工智能飛速發展的今天&#xff0c;AI模型與外部世界的交互變得愈發重要。一個好的工具不僅能提升開發效率&#xff0c;還能激發更多的創意。今天&#xff0c;我要給大家介紹一個寶藏平臺——AIbase&#xff08;<https://mcp.aibase.cn/>&#xff09;&#xff0c;一個…

修改Spatial-MLLM項目,使其專注于無人機航拍視頻的空間理解

修改Spatial-MLLM項目&#xff0c;使其專注于無人機航拍視頻的空間理解。以下是修改方案和關鍵代碼實現&#xff1a; 修改思路 輸入處理&#xff1a;將原項目的視頻文本輸入改為單一無人機航拍視頻/圖像輸入問題生成&#xff1a;自動生成空間理解相關的問題&#xff08;無需用戶…

攻防世界-Reverse-insanity

知識點 1.ELF文件逆向 2.IDApro的使用 3.strings的使用 步驟 方法一&#xff1a;IDA 使用exeinfo打開&#xff0c;發現是32位ELF文件&#xff0c;然后用ida32打開。 找到main函數&#xff0c;然后F5反編譯&#xff0c;得到flag。 tip&#xff1a;該程序是根據隨機函數生成…

【openp2p】 學習1:P2PApp和優秀的go跨平臺項目

P2PApp下面給出一個基于 RESTful 風格的 P2PApp 管理方案示例,供二次開發或 API 對接參考。核心思路就是把每個 P2PApp 當成一個可創建、查詢、修改、啟動/停止、刪除的資源來管理。 一、P2PApp 資源模型 P2PApp:id: string # 唯一標識name: string # …

邊緣設備上部署模型的限制之一——顯存占用:模型的參數量只是冰山一角

邊緣設備上部署模型的限制之一——顯存占用&#xff1a;模型的參數量只是冰山一角 在邊緣設備上部署深度學習模型已成為趨勢&#xff0c;但資源限制是其核心挑戰之一。其中&#xff0c;顯存&#xff08;或更廣義的內存&#xff09;占用是開發者們必須仔細考量的重要因素。許多…

腦機新手指南(二十一)基于 Brainstorm 的 MEG/EEG 數據分析(上篇)

一、腦機接口與神經電生理技術概述 腦機接口&#xff08;Brain-Computer Interface, BCI&#xff09;是一種在大腦與外部設備之間建立直接通信通道的技術&#xff0c;它通過采集和分析大腦信號來實現對設備的控制或信息的輸出。神經電生理信號作為腦機接口的重要數據來源&…

[Linux]內核態與用戶態詳解

內核態和用戶態是針對CPU狀態的描述。在內核態可以執行一切特權代碼&#xff0c;在用戶態只能執行那些受限級別的代碼。如果需要調用特權代碼需要進行內核態切換。 一、內核態和用戶態概況 內核態&#xff1a; 系統中既有操作系統的程序&#xff0c;也有普通用戶程序。為了安…

如何查看每個磁盤都安裝了哪些軟件或程序并卸載?

步驟如下&#xff1a; 1、點擊電腦桌面左下角&#xff1a; 2、選擇【應用和功能】 3、點擊下拉框&#xff0c;選擇想要查看的磁盤&#xff0c;下方顯示的就是所有C磁盤下安裝的軟件和程序 卸載方法&#xff1a; 點擊對應的應用&#xff0c;然后點擊卸載即可&#xff1a;

記錄一次莫名奇妙的跨域502(badgateway)錯誤

這里圖片加載不了&#xff0c;原文請訪問&#xff1a;原文鏈接 公司的項目&#xff0c;這幾天添加了一個統計功能&#xff0c; 本地測試沒太大問題&#xff0c;上線后有一個問題&#xff0c;具體現象描述如下&#xff1a; 統計首頁接口大約有5-6個&#xff0c;也就是同時需要…

Linux之線程

Linux之線程 線程之形線程接口線程安全互斥鎖條件變量&信號量生產者與消費者模型線程池 線程之形 進程是資源分配的基本單位&#xff0c;而線程是進程內部的一個執行單元&#xff0c;也是 CPU 調度的基本單位。 線程之間共享進程地址空間、文件描述符與信號處理&#xff0…

snail-job的oracle sql(oracle 11g)

官網版本的oracle sql中有自增主鍵&#xff0c;oracle 11g并不支持&#xff0c;所以改成新建索引和觸發器的方式自增主鍵。&#xff08;tip&#xff1a;snail-job的最新版本1.0.0必須使用JDK17&#xff0c; jdk8會報錯&#xff0c;所以最后沒用起來&#xff09; /*SnailJob Dat…

Windows VMWare Centos Docker部署Nginx并配置對Springboot應用的訪問代理

前置博文 Windows VMWare Centos環境下安裝Docker并配置MySqlhttps://blog.csdn.net/u013224722/article/details/148928081 Windows VMWare Centos Docker部署Springboot應用https://blog.csdn.net/u013224722/article/details/148958480 # 將已存在的容器設置為宿主機重啟后…

暑期數據結構第一天

暑期數據結構第一天 數據元素與數據對象 數據元素--組成數據的基本單位 與數據的關系&#xff1a;是集合的個體 數據對象--性質相同的數據元素的集合 與數據的關系&#xff1a;集合的子集 邏輯結構 &#xff08;1&#xff09;線性結構&#xff0c;所有結點都最多有一個直…

vsCode 擴展中 package.nls.json 文件的作用國際化支持

package.nls.json 代表英文語言文件 {"command.favourite.addtofavourite": "Add to Favourite","command.favourite.deletefavourite": "Remove from Favourite","command.favourite.moveup": "Move Up" } 在 …

結構型智能科技的關鍵可行性——信息型智能向結構型智能的轉換(提綱)

結構型智能科技的關鍵可行性 ——信息型智能向結構型智能的轉換 1.信息型智能科技概述 1.1傳統計算機科技的信息型繼承者 1.2 信息型智能環境 1.3信息型智能主體 1.4機器學習創造的智能 1.5信息型智能科技的問題 2.結構型智能科技概述 2.1傳統計算機科技向真實生命結構…

Excel 數據合并助手SheetDataMerge智能識別同類數據,銷售報表處理提升效率

各位Excel小能手們&#xff01;今天給大家介紹個超厲害的玩意兒——SheetDataMerge&#xff0c;這可是專注Excel數據處理的實用工具&#xff01;它就像個數據小管家&#xff0c;核心功能就是智能合并工作表里的同類數據。 軟件下載地址安裝包 它有多牛呢&#xff1f;能自動識別…

AIStarter平臺使用指南:如何一鍵卸載已下載的AI項目(最新版操作教程)

如果你正在使用 AIStarter 平臺&#xff0c;但不知道如何卸載不再需要的 AI 項目&#xff0c;那么這篇簡明教程將為你提供清晰的操作指引。 AIStarter 是由知名創作者“熊哥”打造的一款 AI 工具啟動器平臺&#xff0c;旨在幫助用戶快速部署和運行各類 AI 項目。隨著平臺不斷更…