Untiy基礎學習(三)Untiy中編寫腳本的基本規則

一、怎么創建腳本

在Project窗口下,右鍵Create C#Script 即可創建腳本

創建腳本的注意事項 :

1)類名和文件名必須一致,不然不能掛載(因為反射機制創建對象,會通過文件名去找Type)

2)沒有特殊需求 不用管命名空間

3)創建的腳本默認繼承MonoBehavior

4)可以放在Assets文件夾下的任何位置(建議同一文件夾管理)

二、關于MonoBehavior的介紹

? ? ? ? 首先它是一個基類,任何生命周期函數的執行都需要直接或者間接繼承這個類,至于生命周期函數是是什么,我們后面講。所有 Unity 腳本若需要與引擎生命周期事件(如初始化、更新、銷毀等)交互,必須直接或間接繼承?MonoBehaviour。這是 Unity 設計的基礎規則,只有繼承此類的腳本才能被引擎識別為“組件”,從而掛載到?GameObject?上并參與游戲邏輯的驅動。它有以下特點:

????????①創建的腳本基本都默認繼承MonoBehavior 繼承了它才能夠掛載在GameObject上。因為Unity 通過繼承?MonoBehavior 的類來標記其為“可掛載組件”。Unity 編輯器會掃描腳本是否繼承自?MonoBehavior ,只有符合條件的腳本才會出現在“Add Component”菜單中。
????????②繼承了MonoBehavior的腳本不能new 只能掛!!!!!!!!繼承?MonoBehaviour?的腳本?不能手動實例化如?MyScript script = new MyScript();)。因為Unity 要求組件必須依附于?GameObject而?new?創建的實例未綁定任何對象,無法被引擎管理。生命周期函數(如?AwakeUpdate)由引擎自動觸發,未掛載的腳本不會執行這些邏輯。

????????③繼承了MonoBehavior的腳本不要去寫構造函數,因為我們不會去new它,寫構造函數沒有任何意義。Unity 不會調用?MonoBehaviour?的構造函數,初始化邏輯應由?Awake?或?Start?實現。構造函數可能在非預期時機執行(如編輯器加載時),導致不可控行為。等后面學習了生命周期函數,就知道一般是使用Awake和Start進行初始化了。

????????④繼承了MonoBehavior的腳本可以在一個對象上掛多個(如果沒有加DisallowMultipleComponent特性)例如,為敵人掛載多個“攻擊效果”腳本,每個腳本控制不同的攻擊邏輯。或為 UI 元素掛載多個“動畫控制器”腳本,分別處理不同狀態的動畫。

????????⑤繼承MonoBehavior的類也可以再次被繼承,遵循面向對象繼承多態的規則。MonoBehaviour?的子類可以進一步被繼承,遵循面向對象的基本原則。子類可以重寫父類的生命周期方法(如?Update),并通過?base.Method()?調用父類邏輯。當然這些都是后話。

了解小知識:為什么會這樣設計呢?

組件化開發

????????每個腳本代表一個獨立功能模塊,通過組合不同組件構建復雜對象(如角色 = 移動組件 + 動畫組件 + 攻擊組件)。

????????避免“上帝腳本”(一個腳本處理所有邏輯),提升代碼可維護性。

引擎控制權

????????Unity 引擎完全掌控組件的生命周期(如創建、更新、銷毀),開發者只需填充邏輯,無需手動管理內存或執行順序。

事件驅動模型

????????通過生命周期方法和事件回調(如?OnCollisionEnter)響應游戲狀態變化,而非傳統的主循環控制。

三、關于不繼承Mono的類

????????①不繼承MonoBehavior的類 不能掛載在GameObject上。因為上面提到了,Unity 編輯器通過反射檢查腳本是否繼承?MonoBehaviour,只有符合條件的類才會出現在“Add Component”菜單中,只有繼承了的才有組件成為權!
????????②不繼承MonoBehavior的類 想怎么寫就怎么寫 如果要使用需要自己new。非?MonoBehaviour?類本質是普通的 C# 類,不依賴 Unity 的組件系統,因此:

  • 無需遵循 Unity 的約束:可以隨意定義構造函數、靜態方法或字段。

  • 實例化方式:必須通過?new?關鍵字手動創建對象(如?MyClass obj = new MyClass();)。

????????③不繼承MonoBehavior的類一般是單例模式的類(用于管理模塊,全局管理游戲狀態、資源、配置等。)或者數據結構類(用于存儲數據,純粹用于存儲和操作數據。)
????????④不繼承MonoBehavior的類 不用保留默認出現的那幾個函數。因為Unity 的生命周期方法(如?AwakeUpdate)是?MonoBehaviour?提供的特性。非?MonoBehaviour?類不具備這些功能,因此:無需保留默認函數:如?Start?或?Update?不會被 Unity 調用,定義它們無意義。

四、關于腳本的執行先后順序

五、默認腳本內容

? ? ? ? 你有沒有每次發現我們創建的腳本都長得一樣,這是因為Untiy自己配置了模版,當然,這模版它Untiy配的,我們就配不得嗎,走,我們去看看在哪里配置。?

首先:先得來到這個Untiy hub中,點擊這個在資源管理器中查看

然后走這個路徑:就可以看到很多很多的txt文件,這些就是模版文件

?不建議自己隨意修改?

來來來,做幾道題目練練手!!

問題一:MonoBehaviour 的構造函數問題

????????在 Unity 中,為什么繼承?MonoBehaviour?的腳本不應定義構造函數?如果在構造函數中初始化變量,可能會導致什么問題?

? ? ? ? 參考答案:Unity?不會調用?MonoBehaviour?的構造函數,初始化邏輯應由?Awake?或?Start?完成。構造函數可能在編輯器模式下意外觸發(如腳本重新編譯時),導致不可控行為。

? ? ? ? 可能存在的問題:若在構造函數中初始化組件引用(如?GetComponent<T>()),此時?GameObject?可能未完全初始化,導致空引用異常。構造函數中的邏輯可能破壞 Unity 的組件依賴鏈,引發初始化順序混亂。

問題二:單例模式的選擇

????????在 Unity 中,實現單例模式時,為何通常選擇不繼承?MonoBehaviour?的普通類,而不是通過掛載到?GameObject?的?MonoBehaviour?腳本實現?請比較兩種方式的優缺點。

? ? ? ? 參考答案:

普通類單例(非 MonoBehaviour)

  • 優點

    無需依賴?GameObject,內存占用更低。

    生命周期完全由代碼控制,跨場景時更穩定。

  • 缺點

    無法直接使用 Unity 的生命周期方法(如?Update)。

    需要手動管理初始化和銷毀邏輯

MonoBehaviour 單例

  • 優點

    可方便使用 Unity 生命周期方法(如?Awake?初始化)。

    可在 Inspector 中配置公開變量。

  • 缺點

    依賴?GameObject,跨場景時需通過?DontDestroyOnLoad?防止銷毀。

    可能因場景切換或對象失活導致單例失效。

????????結論:若單例需要與 Unity 生命周期或場景對象交互(如 UI 管理),使用?MonoBehaviour;若僅需全局邏輯管理(如配置讀取),優先使用普通類單例。

問題三:數據類的設計選擇

????????假設需要設計一個?PlayerData?類,用于存儲玩家的血量、等級和裝備信息。為什么這個類不應繼承?MonoBehaviour?如果需要在 Inspector 中編輯該類的數據,如何實現?

? ? ? ? 參考答案:

不繼承 MonoBehaviour 的原因

PlayerData?是純粹的數據容器,無需與?GameObject?綁定或參與 Unity 生命周期。

繼承?MonoBehaviour?會引入不必要的開銷(如組件內存占用),破壞代碼簡潔性。

在 Inspector 中編輯數據

????????將?PlayerData?聲明為可序列化的普通類:

[System.Serializable]  
public class PlayerData {  public int health;  public int level;  public List<string> equipment;  
}  

????????在某個?MonoBehaviour?腳本中聲明?PlayerData?的字段,即可在 Inspector 中編輯:

public class Player : MonoBehaviour {  public PlayerData data;  
}  

這樣子就可以了

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

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

相關文章

VBA宏即根據第一列的內容和第二列的數字,按照數字數量生成對應內容并依次放在第三列、第四列等

打開你的 Excel 工作表。按下 Alt F11 組合鍵&#xff0c;打開 VBA 編輯器。在 VBA 編輯器中&#xff0c;點擊 插入 -> 模塊。在模塊窗口中&#xff0c;輸入以下 VBA 代碼&#xff1a; Sub GenerateItems()Dim lastRow As LongDim i As Long, j As LongDim item As String…

深度學習系統學習系列【1】之基本知識

文章目錄 說明基礎知識人工智能、機器學習、深度學習的關系機器學習傳統機器學習的缺陷選擇深度學習的原因深度學習的關鍵問題深度學習的應用深度學習的加速硬件GPU環境搭建主流深度學習框架對比 說明 文章屬于個人學習筆記內容&#xff0c;僅供學習和交流。內容參考深度學習原…

論文筆記-基于多層感知器(MLP)的多變量橋式起重機自適應安全制動與距離預測

《IET Cyber-Systems and Robotics》出版山東大學 Tenglong Zhang 和 Guoliang Liu 團隊的研究成果&#xff0c;文章題為“Adaptive Safe Braking and Distance Prediction for Overhead Cranes With Multivariation Using MLP”。 摘要 橋式起重機的緊急制動及其制動距離預測是…

DeepSeek實戰--各版本對比

1.對比 版本參數量優勢劣勢使用場景競品DeepSeek-V36710億&#xff08;MoE架構&#xff0c;激活370億&#xff09;開源、高效推理&#xff08;60 TPS&#xff09;、低成本&#xff08;API費用低&#xff09;、中文處理能力突出&#xff08;90%準確率多模態能力有限通用任務&am…

從0開始建立Github個人博客(hugoPaperMod)

從0開始建立Github個人博客(hugo&PaperMod) github提供給每個用戶一個網址&#xff0c;用戶可以建立自己的靜態網站。 一、Hugo hugo是一個快速搭建網站的工具&#xff0c;由go語言編寫。 1.安裝hugo 到hugo的github標簽頁Tags gohugoio/hugo選擇一個版本&#xff0c…

【AI論文】WebThinker:賦予大型推理模型深度研究能力

摘要&#xff1a;大型推理模型&#xff08;LRMs&#xff09;&#xff0c;如OpenAI-o1和DeepSeek-R1&#xff0c;展示了令人印象深刻的長期推理能力。 然而&#xff0c;他們對靜態內部知識的依賴限制了他們在復雜的知識密集型任務上的表現&#xff0c;并阻礙了他們生成需要綜合各…

Linux_sudo命令的使用與機制

1、sudo命令的作用 sudo&#xff08;全稱 superuser do&#xff09;是 Linux/Unix 系統中權限管理的核心工具。 允許普通用戶在授權下以其他用戶&#xff08;默認是 root&#xff09;的權限執行命令&#xff0c;而無需直接登錄賬戶。 2、sudo命令的典型使用場景 sudo 覆蓋了系…

Scrapy框架之 中間件的使用

爬蟲中間件 特點&#xff1a;主要處理蜘蛛&#xff08;Spider&#xff09;和下載器&#xff08;Downloader&#xff09;之間的請求和響應。可以對蜘蛛生成的請求進行攔截、修改或過濾&#xff0c;也可以對下載器返回給蜘蛛的響應進行處理。適用場景&#xff1a; 請求過濾與修改…

供應鏈算法整理(一)--- 銷量預估

在供應鏈管理領域有較多的預估場景&#xff0c;例如送達時長預估、銷量預估、用電量預估。特別的在智能供應鏈領域&#xff0c;銷量和庫存的管理的智能化也依賴銷量預估&#xff0c;因此在本文我們整理了 銷量預估的算法詳細的技術方案。 時間序列預測在最近兩年內發生了巨大的…

第4篇:服務層抽象與復用邏輯

在業務系統復雜度指數級增長的今天&#xff0c;服務層&#xff08;Service Layer&#xff09;的合理設計直接影響著系統的可維護性和擴展性。本文將深入剖析 Egg.js 框架中的服務層架構設計&#xff0c;從基礎實現到高級封裝&#xff0c;全方位講解企業級應用的開發實踐。 一、…

Java學習手冊:Spring 數據訪問

一、Spring JDBC JdbcTemplate &#xff1a;Spring JDBC 提供了 JdbcTemplate 類&#xff0c;它簡化了數據庫操作&#xff0c;提供了豐富的 API 來執行數據庫訪問任務。JdbcTemplate 可以自動處理數據庫連接的獲取、釋放&#xff0c;SQL 語句的執行&#xff0c;結果集的處理等…

遞歸、搜索和回溯算法《遞歸》

在之前的優選算法當中我們已經學習了一些基本的算法&#xff0c;那么接下來我們就要來學習算法當中的一大重要章節——遞歸、搜索和回溯算法&#xff0c;其實也就是大家常常聽到的dfs、bfs&#xff1b;其實本質就是遞歸&#xff0c;在學習搜索、回溯等算法的過程當中我們會先來…

Java進階--設計模式

設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設計模式使代碼編制真正工程化&#xff0c;設計模式是軟件工程的基石&#xff0c;如同大廈的一塊塊磚石一樣&#xff0…

如何禁止AutoCAD這類軟件聯網

推薦二、三方法&#xff0c;對其他軟件影響最小 一、修改Hosts文件 Hosts文件是一個存儲域名與IP地址映射關系的文本文件&#xff0c;通過修改Hosts文件可以將AutoCAD的域名指向本地回環地址&#xff08;127.0.0.1&#xff09;&#xff0c;從而實現禁止聯網的目的。具體步驟如…

深度學習框架搭建(Vscode/Anaconda/CUDA/Pytroch)

目錄 ??????一 Vscode安裝 二、Anaconda安裝 三、更新顯卡驅動 四、安裝CUDA 五、安裝Pytorch 六、Vscode配置 七、出現的問題匯總 ??????一 Vscode安裝 在 Windows 上安裝 訪問 VS Code 官網 https://code.visualstudio.com/&#xff0c;點擊 "Downl…

結構模式識別理論與方法

我們在前文《模式識別的基本概念與理論體系》中就已經提及“模式分類”。 具體內容看我的CSDN文章&#xff1a;模式識別的基本概念與理論體系-CSDN博客 模式的識別方法主要有統計模式識別方法和結構模式識別方法兩大類。統計模式識別方法提出得較早&#xff0c;理論也較成熟…

12.多邊形的三角剖分 (Triangulation) : Fisk‘s proof

目錄 1.Fisks proof Trangulation Coloring Domination Pigeon-Hold Principle Generation 2.Orthogonal Polygons (正交多邊形) Necessity of floor(n4) Sufficiency by convex Quadrilateralization Generalization 1.Fisks proof Trangulation 引入內對角線&…

面經-計算機網絡——OSI七層模型與TCP/IP四層模型的對比詳解

OSI七層模型與TCP/IP四層模型的對比詳解 一、圖示解析&#xff1a;分層封裝結構 你提供的圖清晰展示了網絡通信中從應用層到物理層的封裝過程&#xff0c;每一層都會對上層的數據加上自己的頭部信息&#xff08;Header&#xff09;&#xff1a; 應用層&#xff1a; 應用…

React Native本地存儲方案總結

1. AsyncStorage&#xff08;鍵值對存儲&#xff09; 適用場景&#xff1a;簡單鍵值對存儲&#xff08;如用戶配置、Token、緩存數據&#xff09;。特點&#xff1a;異步、輕量、API 簡單&#xff0c;但性能一般&#xff0c;不推薦存儲大量數據。安裝&#xff1a;npm install …

Arduino程序函數詳解與實際案例

一、Arduino程序的核心架構與函數解析 Arduino程序的核心由兩個函數構成:setup() 和 loop()。這兩個函數是所有Arduino代碼的骨架,它們的合理使用決定了程序的結構和功能。 1.1 setup() 函數:初始化階段 setup() 函數在程序啟動時僅執行一次,用于完成初始化配置,例如設置…