Unity 基础——脚本管理与序列化详解:从入门到高级
创作时间:
作者:
@小白创作中心
Unity 基础——脚本管理与序列化详解:从入门到高级
引用
CSDN
1.
https://blog.csdn.net/MY_future_/article/details/145935183
在Unity开发中,脚本管理和序列化是两个非常重要的概念。脚本管理涉及如何组织、加载和运行脚本,而序列化则是Unity将对象状态保存和加载的核心机制。本文将基于《Unity3D游戏开发》(宣雨松 第3版)的内容,结合Unity的最新特性,详细解析脚本管理和序列化的相关知识,帮助你编写更高效、更可维护的Unity项目。
脚本管理
1. 脚本的组织与加载
在Unity中,脚本通常以C#类的形式存在,并附加到GameObject上。以下是一些脚本管理的最佳实践:
- 模块化设计:将功能拆分为独立的脚本,例如
PlayerController、EnemyAI等。 - 命名空间:使用命名空间避免命名冲突,例如:
namespace Game.Player {
public class PlayerController : MonoBehaviour { ... }
}
- 动态加载脚本:通过
Resources.Load或Addressables动态加载脚本。
MonoBehaviour script = gameObject.AddComponent<MyScript>();
2. 脚本的执行顺序
Unity允许开发者自定义脚本的执行顺序,以确保某些脚本在其他脚本之前运行。
- 设置执行顺序
- 在Unity编辑器中,选择Edit → Project Settings → Script Execution Order。
- 添加脚本并调整其执行顺序。
- 代码控制执行顺序
- 使用
[DefaultExecutionOrder]属性设置脚本的执行顺序。
[DefaultExecutionOrder(-100)]
public class EarlyScript : MonoBehaviour { ... }
3. 脚本的启用与禁用
通过enabled属性可以控制脚本的启用与禁用。
public class MyScript : MonoBehaviour {
void Start() {
enabled = false; // 禁用脚本
}
void Update() {
if (Input.GetKeyDown(KeyCode.Space)) {
enabled = true; // 启用脚本
}
}
}
序列化
1. 序列化的概念
序列化是将对象的状态转换为可存储或传输的格式的过程。Unity使用序列化来保存场景、预制体和脚本数据。
- 序列化的作用
- 保存场景和预制体的状态。
- 在编辑器和运行时之间传递数据。
- 序列化的类型
- 隐式序列化:Unity自动序列化公共字段和标记为
[SerializeField]的私有字段。 - 显式序列化:通过实现
ISerializationCallbackReceiver接口自定义序列化逻辑。
2. Unity的序列化机制
可序列化的字段
公共字段:默认会被序列化。
public int health = 100;私有字段:需要添加
[SerializeField]属性。[SerializeField] private int ammo = 10;不可序列化的字段
静态字段:不会被序列化。
标记为
[NonSerialized]的字段:显式禁止序列化。[NonSerialized] public int tempValue;
3. 自定义序列化
通过实现ISerializationCallbackReceiver接口,可以自定义序列化和反序列化的逻辑。
using UnityEngine;
public class CustomSerialization : MonoBehaviour, ISerializationCallbackReceiver {
public int health;
[SerializeField] private int serializedHealth;
public void OnBeforeSerialize() {
serializedHealth = health; // 序列化前保存数据
}
public void OnAfterDeserialize() {
health = serializedHealth; // 反序列化后加载数据
}
}
4. ScriptableObject的序列化
ScriptableObject是Unity中用于存储数据的特殊对象,支持序列化。
创建ScriptableObject
using UnityEngine; [CreateAssetMenu(fileName = "NewData", menuName = "Game/Data")] public class GameData : ScriptableObject { public int score; public string playerName; }使用ScriptableObject
public class GameManager : MonoBehaviour { public GameData gameData; void Start() { Debug.Log($"Player: {gameData.playerName}, Score: {gameData.score}"); } }
实际应用案例
案例1:动态加载脚本
public class ScriptLoader : MonoBehaviour {
void Start() {
// 动态加载脚本并附加到GameObject

MonoBehaviour script = gameObject.AddComponent<MyScript>();
}
}
案例2:自定义序列化
using UnityEngine;
public class PlayerData : MonoBehaviour, ISerializationCallbackReceiver {
public int health;
[SerializeField] private int serializedHealth;
public void OnBeforeSerialize() {
serializedHealth = health;
}
public void OnAfterDeserialize() {
health = serializedHealth;
}
}
案例3:使用ScriptableObject存储游戏数据
using UnityEngine;
[CreateAssetMenu(fileName = "NewLevelData", menuName = "Game/LevelData")]
public class LevelData : ScriptableObject {
public string levelName;
public int difficulty;
}
public class LevelManager : MonoBehaviour {
public LevelData levelData;
void Start() {
Debug.Log($"Level: {levelData.levelName}, Difficulty: {levelData.difficulty}");
}
}
总结
脚本管理和序列化是Unity开发中的核心概念。通过合理组织脚本、控制执行顺序以及掌握序列化机制,你可以编写出高效、可维护的游戏项目。希望本文能帮助你更好地理解这些知识,并在实际开发中灵活运用。
热门推荐
跟着稻鸭鱼蟹 解锁高邮湖里的生态“密码”
全面指南:计划云南之旅时如何选择合适的团队游及注意事项
掌握方向盘操作技巧:从基础到实战的全面指南
心衰居家管理全攻略:从饮食到运动的全方位指南
老板欠工资怎么办最快解决方法
《肥胖症诊疗指南(2024年版)》发布啦!如何判断自己是否肥胖?
千年一遇的2025年---从星象学角度分析
刀塔自走棋新阵容分析:从双神阵容到6地精阵容的全面对比!
胸口及肩膀出现小红点是何原因
什么是“211饮食法”?
手足口病科普:症状、传播途径与预防措施全解析
“夜宵顶流”小龙虾降价 怎样食用更健康?
亲戚贷款合同书写指南与法律风险防范
JS图片资源模糊怎么办?全方位解决方案
图像增强算法详解
不同阶段的抑郁症怎么治疗
办理护照和签证流程-签证办理
元宵节的传统习俗与现代庆祝方式的融合与传承探讨
滚筒洗衣机洗羽绒服,怎么才能洗干净?照这5步来,又蓬松又干净
银行储蓄卡账户被锁定怎么办?多种激活方式全攻略
开挂人生从口诀开始:《西游记》里的修仙秘籍全解锁
常见视频接口汇总,选购时,合适的才最重要
黑马股投资指南:从定义到实战策略
几种常见的去除白色背景的方式详解
万和燃气热水器水不热是什么故障(如何解决万和燃气热水器水不热的问题)
【GIS教程】ArcGIS做日照分析(附练习数据下载)
熟地黄的几种实用搭配
髋关节经常咔咔响?3个简单的动作,帮助改善髋弹响
造血干细胞移植肿瘤治疗成功案例有哪些?
纳抗偶联化疗药物:靶向化疗的新方向