Unity3D 序列化機制:引擎內的應用場景和基本原理

前言

Unity3D 的序列化機制是其核心功能之一,用于在編輯器和運行時之間持久化數據、管理場景狀態、處理預制體(Prefab)以及實現跨平臺兼容性。以下是其應用場景和基本原理的詳細解析:

對惹,這里有一個游戲開發交流小組,希望大家可以點擊進來一起交流一下開發經驗呀!

一、應用場景

  1. 場景(Scene)與預制體(Prefab)的保存與加載
  • Unity 使用序列化將場景中的 GameObject、組件(Component)及其屬性保存為文本或二進制格式(如?.unity?場景文件或?.prefab?文件)。
  • 預制體的實例化和修改(如覆蓋屬性)依賴序列化機制。
  • Inspector 面板的編輯
  • 在編輯器中,組件的公有字段(或標記了?[SerializeField]?的私有字段)通過序列化機制暴露到 Inspector 面板,修改后的值會被序列化保存。
  • ScriptableObject 數據持久化
  • ScriptableObject 的數據通過序列化存儲為?.asset?文件,適用于游戲配置(如技能、物品屬性)。
  • 資源熱更新與跨平臺兼容
  • AssetBundle 中的資源(如材質、動畫)通過序列化實現跨平臺兼容,確保不同平臺加載時數據格式正確。
  • 運行時狀態持久化
  • 游戲存檔(如玩家進度、物品欄)可通過序列化(如?JsonUtility?或?BinaryFormatter)保存到本地文件。

二、基本原理

1. 序列化的條件

Unity 的序列化遵循以下規則:

  • 自動序列化的字段
    • public?字段(除非標記?[NonSerialized])。
    • 標記了?[SerializeField]?的私有/受保護字段。
  • 不序列化的字段
    • 屬性(Property)、靜態字段、未標記?[SerializeField]?的私有字段。
    • 標記了?[NonSerialized]?的字段。

2. 序列化流程

  • 編輯器序列化
    • 當場景或預制體保存時,Unity 將 GameObject 的層級結構和組件屬性轉換為 YAML 格式文本(可讀性高)。
    • 示例:一個 Transform 組件的序列化結果:
Transform:m_ObjectHideFlags: 0m_Position: {x: 0, y: 0, z: 0}m_Rotation: {x: 0, y: 0, z: 0, w: 1}
  • 運行時序列化
    • 使用?JsonUtility.ToJson()?或?BinaryFormatter?將對象轉換為字符串或二進制數據。

3. 序列化深度

  • Unity 支持深度序列化,遞歸處理對象及其子屬性。
  • 例外
    • 引用類型(如?UnityEngine.Object?派生類)會被序列化為元數據(如 GUID 和文件ID),而非完整對象。
    • 循環引用可能導致序列化失敗。

4. 自定義序列化

通過接口?ISerializationCallbackReceiver,開發者可以在序列化前后執行邏輯:

public class CustomData : MonoBehaviour, ISerializationCallbackReceiver
{public Dictionary<string, int> stats = new Dictionary<string, int>();// 序列化前將 Dictionary 轉換為 List[SerializeField] private List<string> _keys;[SerializeField] private List<int> _values;public void OnBeforeSerialize(){_keys = new List<string>(stats.Keys);_values = new List<int>(stats.Values);}public void OnAfterDeserialize(){stats = new Dictionary<string, int>();for (int i = 0; i < _keys.Count; i++)stats.Add(_keys[i], _values[i]);}
}

三、技術細節與注意事項

  1. 版本兼容性
  • 修改類結構(如刪除字段)可能導致反序列化失敗,舊數據可能丟失。
  • 通過?[FormerlySerializedAs("oldFieldName")]?標記字段重命名,兼容舊數據。
  • 性能優化
  • 避免頻繁序列化大型數據結構(如長列表),尤其在移動端。
  • 使用?[Serializable]?標記自定義結構體或類以支持序列化。
  • 不可序列化的類型
  • Unity 無法序列化接口(interface)、委托(delegate)或非?UnityEngine.Object?派生類。
  • 解決方法:將接口轉換為具體類,或使用?ScriptableObject?封裝。
  • Prefab 差異序列化
  • 預制體實例的屬性覆蓋(如修改 Transform 的位置)通過序列化差異實現,保存為“覆蓋”數據而非完整副本。

四、調試與工具

  1. 查看序列化數據
  • 在 Unity 編輯器中選擇?Assets > Open C# Project,查看?.meta?文件或 YAML 格式的預制體/場景文件。
  • 序列化檢查工具
  • 使用?UnityEditor.Serialization?命名空間中的工具(如?SerializedObject?和?SerializedProperty)在 Editor 腳本中調試序列化數據。

五、總結

Unity 的序列化機制是其數據驅動的核心,理解其規則和限制能幫助開發者:

  • 避免數據丟失(如字段未正確序列化)。
  • 優化資源管理(如合理使用 ScriptableObject)。
  • 實現靈活的自定義數據持久化方案。

更多教學視頻

Unity3D?www.bycwedu.com/promotion_channels/2146264125

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

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

相關文章

Python 字典鍵 “三變一” 之謎

開頭&#xff1a;讀者的“玄學”字典謎題 上周&#xff0c;朋友發來了一段讓他抓耳撓腮的代碼&#xff1a; >>> {True: foo, 1: bar, 1.0: baz} {True: baz} “我明明定義了布爾True、整數1、浮點數1.0三個鍵&#xff0c;結果字典里只剩True一個鍵&#xff0c;值…

如何選擇 RabbitMQ、Redis 隊列等消息中間件?—— 深度解析與實戰評估

如何選擇 RabbitMQ、Redis 隊列等消息中間件?—— 深度解析與實戰評估 1. 引言 在現代分布式系統架構中,消息隊列(Message Queue,MQ) 作為解耦服務、異步處理和高效通信的關鍵組件,被廣泛應用于高并發、微服務和數據流處理場景。選擇合適的消息中間件不僅能提高系統的穩…

特征工程四:數據特征提取TfidfVectorizer的使用

TfidfVectorizer 深度解析 TfidfVectorizer 是 scikit-learn 中用于文本特征提取的核心工具&#xff0c;它將原始文本轉換為 TF-IDF 特征矩陣&#xff0c;是自然語言處理(NLP)和文本挖掘的基礎組件。 一、核心原理 1. TF-IDF 計算 TF (Term Frequency)&#xff1a;詞頻&…

c/c++爬蟲總結

GitHub 開源 C/C 網頁爬蟲探究&#xff1a;協議、實現與測試 網頁爬蟲&#xff0c;作為一種自動化獲取網絡信息的強大工具&#xff0c;在搜索引擎、數據挖掘、市場分析等領域扮演著至關重要的角色。對于希望深入理解網絡工作原理和數據提取技術的 C/C 開發者&#xff0c;尤其是…

PostgreSQL 的表連接方法

PostgreSQL 的表連接方法 PostgreSQL 提供了多種高效的連接算法&#xff0c;每種方法適用于不同的查詢場景。以下是 PostgreSQL 支持的四種主要表連接方法及其特點&#xff1a; 1 Nested Loop Join&#xff08;嵌套循環連接&#xff09; 工作原理 對外表的每一行&#xff0…

【Qt】qss語法詳解

QSS (Qt Style Sheets) 語法格式詳解 QSS 是 Qt 的樣式表語言&#xff0c;類似于 CSS&#xff0c;用于自定義 Qt 應用程序的外觀。以下是 QSS 的完整語法格式說明&#xff1a; 基本語法結構 selector {property: value;property: value;... }1. 選擇器 (Selectors) 基本選擇…

Azure資源創建與部署指南

本文將指導您如何在Azure平臺上創建和配置必要的資源,以部署基于OpenAI的應用程序。 資源組創建 資源組是管理和組織Azure資源的邏輯容器。 在Azure門戶頂端的查詢框中輸入"Resource groups"(英文環境)或"資源組"(中文環境)在搜索結果中點擊"資…

Java后端快速生成驗證碼

Hutool是一個小而全的Java工具類庫&#xff0c;它提供了很多實用的工具類&#xff0c;包括但不限于日期處理、加密解密、文件操作、反射操作、HTTP客戶端等。 核心工具類&#xff1a;CaptchaUtil&#xff0c;CaptchaUtil 是 Hutool 提供的一個工具類&#xff0c;用于創建各種類…

sql 備份表a數據到表b

備份表a數據到表b mysql CREATE TABLE sys_dict_240702 LIKE sys_dict;INSERT INTO sys_dict_240702 SELECT * FROM sys_dict;mssql select * into t_Dict_240702 from t_Dict

2.4GHz無線通信芯片選型指南:集成SOC與低功耗方案解析

今天給大家分享幾款2.4GHz無線通信芯片方案&#xff1a; 一、集成SOC芯片方案 XL2407P&#xff08;芯嶺技術&#xff09; 集成射頻收發機和微控制器&#xff08;如九齊NY8A054E&#xff09; 支持一對多組網和自動重傳 發射功率8dBm&#xff0c;接收靈敏度-96.5dBm&#xff08…

Tomcat與純 Java Socket 實現遠程通信的區別

Servlet 容器??&#xff08;如 Tomcat&#xff09; 是一個管理 Servlet 生命周期的運行環境&#xff0c;主要功能包括&#xff1a; ??協議解析??&#xff1a;自動處理 HTTP 請求/響應的底層協議&#xff08;如報文頭解析、狀態碼生成&#xff09;&#xff1b; ??線程…

[超級簡單]講解如何用PHP實現LINE Pay API!

在 PHP 中實現 LINE Pay API 之前我應該??做哪些準備&#xff1f;如何在 PHP 中實現 LINE Pay API&#xff1f; 目錄 [前提] 環境使用 PHP 實現 LINE Pay API 的準備工作使用 PHP 實現 LINE Pay API概括 [前提] 環境 這次我們將使用SandBox環境&#xff08;測試環境&a…

centos7.x下,使用寶塔進行主從復制的原理和實踐

操作原理&#xff1a; 一、主庫配置 1.修改 MySQL 配置文件 # 編輯主庫配置文件&#xff08;路徑根據實際系統可能不同&#xff09; vim /etc/my.cnf # 添加以下配置 [mysqld] server-id 1 # 唯一 ID&#xff0c;主庫設置為 1 log-bin mysql-bin …

從零實現基于Transformer的英譯漢任務

1. model.py&#xff08;用的是上一篇文章的代碼&#xff1a;從0搭建Transformer-CSDN博客&#xff09; import torch import torch.nn as nn import mathclass PositionalEncoding(nn.Module):def __init__ (self, d_model, dropout, max_len5000):super(PositionalEncoding,…

c#建筑行業財務流水賬系統軟件可上傳記賬憑證財務管理系統簽核功能

# financial_建筑行業 建筑行業財務流水賬系統軟件可上傳記賬憑證財務管理系統簽核功能 # 開發背景 軟件是給岳陽客戶定制開發一款建筑行業流水賬財務軟件。提供工程簽證單、施工日志、人員出勤表等信息記錄。 # 財務管理系統功能描述 1.可以自行設置記賬科目&#xff0c;做憑…

MySQL 8.0 OCP 1Z0-908 題目解析(2)

題目005 Choose two. Which two actions can obtain information about deadlocks? □ A) Run the SHOW ENGINE INNODB MUTEX command from the mysql client. □ B) Enable the innodb_status_output_locks global parameter. □ C) Enable the innodb_print_all_deadlock…

XA協議和Tcc

基于 XA 協議的兩階段提交 (2PC)。這是一種分布式事務協議&#xff0c;旨在保證在多個參與者&#xff08;通常是不同的數據庫或資源管理器&#xff09;共同參與的事務中&#xff0c;所有參與者要么都提交事務&#xff0c;要么都回滾事務&#xff0c;從而維護數據的一致性。 你…

數據分析-圖2-圖像對象設置參數與子圖

from matplotlib import pyplot as mp mp.figure(A figure,facecolorgray) mp.plot([0,1],[1,2]) mp.figure(B figure,facecolorlightgray) mp.plot([1,2],[2,1]) #如果figure中標題已創建&#xff0c;則不會新建窗口&#xff0c; #而是將舊窗口設置為當前窗口 mp.figure(A fig…

跳轉語句:break、continue、goto -《Go語言實戰指南》

在控制流程中&#xff0c;我們有時需要跳出當前循環或跳過當前步驟&#xff0c;甚至直接跳轉到指定位置。Go 提供了三種基本跳轉語句&#xff1a; ? break&#xff1a;跳出當前 for、switch 或 select。? continue&#xff1a;跳過本輪循環&#xff0c;進入下一輪。? goto&a…

Linux中find命令用法核心要點提煉

大家好&#xff0c;歡迎來到程序視點&#xff01;我是你們的老朋友.小二&#xff01; 以下是針對Linux中find命令用法的核心要點提煉&#xff1a; 基礎語法結構 find [路徑] [選項] [操作]路徑&#xff1a;查找目錄&#xff08;.表當前目錄&#xff0c;/表根目錄&#xff09;…