【Unity知識點詳解】Unity中泛型單例的使用,兼容WebGL

? ? ? ? 今天來講下Unity中泛型單例的使用,包含普通單例和繼承MonoBehaviour的單例。重點是需要兩種泛型單例兼容WebGL平臺,話不多說直接開始。

泛型單例的設計目標

? ? ? ? ?作為泛型單例,需要實現以下幾個目標:

  • 全局唯一,在程序的整個運行周期內有且只有一個實例。
  • 全局調用,這屬于單例的特性,方便任意調用。
  • 繼承即用,通過繼承泛型單基類例即可實現單例特性

WebGL兼容問題

? ? ? ?由于泛型單例要防止外部創建,構造函數會被定義為private或protected,因而對象需要通過反射的方式來創建。由于WebGL采用的是AOT的編譯方式(Ahead-of-Time Compilation,提前編譯),所以對反射的使用有很多的限制。

泛型單例的實現方式

? ? ? ? 普通泛型單例的實現,示例代碼如下:

public abstract class Singleton<T> where T : Singleton<T>
{private static readonly Lazy<T> mLazyInstance = new Lazy<T>(Constructor, LazyThreadSafetyMode.ExecutionAndPublication);public static T Instance => mLazyInstance.Value;private static T Constructor(){ConstructorInfo constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic,null, Type.EmptyTypes, null);if (constructor == null){throw new Exception($"No private/protected constructor found for {typeof(T).Name}");}return (T)constructor.Invoke(null);}
}

????????MonoBehaviour泛型單例的實現,示例代碼如下:

public abstract class SingletonMonoBehaviour<T> : MonoBehaviourwhere T : SingletonMonoBehaviour<T>
{private static readonly Lazy<T> mLazyInstance = new Lazy<T>(Constructor, LazyThreadSafetyMode.ExecutionAndPublication);public static T Instance => mLazyInstance.Value;private static T Constructor(){string path = SingletonPath;GameObject aimGameObject = UtilCollection.GameObjectUtil.FindOrCreateGameObject(path);T instance = aimGameObject.GetComponent<T>();if (instance == null)instance = aimGameObject.AddComponent<T>();return instance;}/// <summary>防止重復動態創建</summary>private void Awake(){StartCoroutine(CheckRepeatCreate());}/// <summary>防止重復掛接腳本</summary>private void Reset(){StartCoroutine(CheckRepeatCreate());}private IEnumerator CheckRepeatCreate(){GameObject aimGameObject = GameObject.Find(SingletonPath);if (this.gameObject != aimGameObject){yield return null;if (this != null)DestroyImmediate(this);}else if (this.gameObject == aimGameObject){T[] components = aimGameObject.GetComponents<T>();if (components.Length > 1){yield return null;if (this != null)DestroyImmediate(this);}}}
}

? ? ? ? 示例中用Lazy<T>類型作為實例類型,Lazy<T>可以通過ExecutionAndPublication參數確保多線程安全,在多線程情況下同樣只會有一個實例。雖然WebGL是單線程,但為了保持代碼一致性,所以不做區分。

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

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

相關文章

Python進程與線程的深度對比

一、核心概念對比 1. 進程&#xff08;Process&#xff09; 操作系統級獨立單元&#xff1a;每個進程擁有獨立的內存空間&#xff08;堆、棧、代碼段&#xff09; 資源隔離性&#xff1a;崩潰不影響其他進程 多核并行&#xff1a;可充分利用多核CPU資源 2. 線程&#xff0…

Django 入門指南:構建強大的 Web 應用程序

什么是 Django&#xff1f; Django 是一個開源的高層次 Python Web 框架&#xff0c;旨在快速開發安全且可維護的網站。它通過簡化常見的 Web 開發任務&#xff0c;幫助開發者專注于開發應用的核心功能。Django 實現了“快速開發”和“盡量少的重復”的理念&#xff0c;提供了…

ESP-ADF外設子系統深度解析:esp_peripherals組件架構與核心設計(顯示輸出類外設之IS31FL3216)

目錄 ESP-ADF外設子系統深度解析&#xff1a;esp_peripherals組件架構與核心設計&#xff08;顯示輸出類外設之IS31FL3216&#xff09;簡介模塊概述功能定義架構位置核心特性 IS31FL3216外設分析IS31FL3216外設概述IS31FL3216外設層次架構圖 IS31FL3216外設API和數據結構外設層…

【計算機網絡 | 第三篇】常見的網絡協議(二)

沒有看過我寫的關于網絡協議的第一篇博客可以看【計算機網絡 | 第二篇】常見的通信協議&#xff08;一&#xff09;-CSDN博客 TCP的三次握手和四次揮手 TCP三次握手 三次握手是TCP協議建立可靠連接的過程&#xff0c;目的是確保客戶端和服務端雙方的雙向通信能力正常&#x…

HAL庫(STM32CubeMX)——高級ADC學習、HRTIM(STM32G474RBT6)

系列文章目錄 文章目錄 系列文章目錄前言存在的問題HRTIMcubemx配置前言 對cubemx的ADC的設置進行補充 ADCs_Common_Settings Mode:ADC 模式 Independent mod 獨立 ADC 模式,當使用一個 ADC 時是獨立模式,使用兩個 ADC 時是雙模式,在雙模式下還有很多細分模式可選 ADC_Se…

Unity接入安卓SDK(3)厘清Gradle的版本

接入過程中&#xff0c;很多人遇到gradle的各種錯誤&#xff0c;由于對各種gradle版本的概念不甚了了&#xff0c;模模糊糊一頓操作猛如虎&#xff0c;糊弄的能編譯通過就萬事大吉&#xff0c;下次再遇到又是一臉懵逼。所以我們還是一起先厘清gradle的版本概念。 1 明晰概念 …

python-67-基于plotly的繪圖可視化和智能推薦圖表

文章目錄 1 各種圖表的適用場景1.1 面積圖1.2 餅圖1.3 散點圖1.3.1 散點1.3.2 散點加線1.4 折線圖1.5 箱線圖1.5.1 不同類別的箱線圖1.5.2 一個變量的箱線圖1.5.3 多個變量的箱線圖1.6 小提琴圖1.6.1 不同類別的小提琴圖1.6.2 一個變量的小提琴圖1.7 直方圖1.7.1 直方圖1.7.2 分…

Spring AI MCP

MCP是什么 MCP是模型上下文協議&#xff08;Model Context Protocol&#xff09;的簡稱&#xff0c;是一個開源協議&#xff0c;由Anthropic&#xff08;Claude開發公司&#xff09;開發&#xff0c;旨在讓大型語言模型&#xff08;LLM&#xff09;能夠以標準化的方式連接到外…

c++_csp-j算法 (3)

弗洛伊德算法&#xff08;Floyd&#xff09; Floyd算法又稱為插點法&#xff0c;是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的算法&#xff0c;與Dijkstra算法類似。該算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特弗洛伊…

QT常見輸入類控件及其屬性

Line Edit QLineEdit用來表示單行輸入框&#xff0c;可以輸入一段文本&#xff0c;但是不能換行 核心屬性&#xff1a; 核心信號 信號 說明 void cursorPositionChanged(int old,int new) 當鼠標移動時發出此型號&#xff0c;old為先前位置&#xff0c;new為新位置 void …

【k8s系列1】一主兩從結構的環境準備

環境準備 虛擬機軟件準備及安裝&#xff0c;這里就不詳細展開了&#xff0c;可以看文章:【一、虛擬機vmware安裝】 linux環境準備及下載&#xff0c;下載鏡像centOS7.9&#xff0c;以前也有寫過這個步驟的文章&#xff0c;可以看&#xff1a;【二、安裝centOS】 開始進入正題…

【C++類和數據抽象】類的作用域

目錄 一、類的作用域基本概念 1.1 什么是類的作用域 1.2 作用域層次體系 1.3 類作用域的特點 1.4 基本訪問規則 二、訪問控制三劍客 2.1 public&#xff1a;開放接口 2.2 private&#xff1a;數據封裝 2.3 protected&#xff1a;繼承通道 2.4 跨作用域訪問示例 三…

opencv圖片顏色識別,顏色的替換

圖片顏色識別 1. RGB顏色空間2. 顏色加法2.1使用numpy對圖像進行加法2.2使用opencv加法&#xff08;cv2.add&#xff09; 3 顏色加權加法&#xff08;cv2.addWeighted()&#xff09;4. HSV顏色空間5. 制作掩膜4. 與運算&#xff08;cv2.bitwise_and&#xff09;5.顏色的替換7 R…

ADC數據不穩定的解決方案

問題如圖&#xff1a; 解決方案&#xff1a;上圖第一個通道后來接入GND&#xff0c;就穩定了 上圖第一個通道后來接入VCC&#xff0c;就穩定了

Spark(18)Yarn-概述

Hadoop三大核心組件&#xff1a;HDFS、MapReduce和YARN 一&#xff09;Yarn的概念 YARN(Yet Another Resource Negotiator,另一種資源協調者)是一個通用資源管理系統和調度平臺&#xff0c;可為上層應用提供統一的資源管理和調度。它的引入為集群在利用率&#xff0c;資源統一管…

Flowith AI,解鎖下一代「知識交易市場」

前言 最近幾周自媒體號都在瘋狂推Manus&#xff0c;看了幾篇測評后&#xff0c;突然在某個時間節點&#xff0c;在特工的文章下&#xff0c;發現了很小眾的Flowith。 被這段評論給心動到&#xff0c;于是先去注冊了下賬號。一翻探索過后&#xff0c;發現比我想象中要有趣的多&…

Maxscript調用Newtonsoft.Json解析Json

Maxscript調用Newtonsoft.Json解析Json_newtonsoft.json maxscript-CSDN博客

搭建用友U9Cloud ERP及UAP IDE環境

應用環境 Microsoft Windows 10.0.19045.5487 x64 專業工作站版 22H2Internet Information Services - 10.0.19041.4522Microsoft SQL Server 2019 - 15.0.2130.3 (X64)Microsoft SQL Server Reporing Services 2019 - 15.0.9218.715SQL Server Management Studio -18.6 laster…

github新建一個遠程倉庫并添加了README.md,本地git倉庫無法push

1.本地git倉庫與遠程倉庫綁定 2.push時報錯&#xff0c;本地的 main 分支落后于遠程倉庫的 main 分支&#xff08;即遠程有更新&#xff0c;但你本地沒有&#xff09;&#xff0c;需要拉取遠程的倉庫--->在merge合并&#xff08;解決沖突&#xff09;--->push 3.但是git …

我用deepseek做了一個提取壓縮文件夾下pdf和word文件工具

由于最近需要把大量的壓縮文件的pdf和word文件統一復制到一個文件夾中。 我們一般正常操作方式的是把一個壓縮文件一個一個解壓&#xff0c;然后在把一個的解壓好的文件夾下文件復制到另外一個文件夾中。 這個也需太繁瑣了&#xff0c;從以往統計的需要花費兩個小時間&#x…