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开发中的核心概念。通过合理组织脚本、控制执行顺序以及掌握序列化机制,你可以编写出高效、可维护的游戏项目。希望本文能帮助你更好地理解这些知识,并在实际开发中灵活运用。
热门推荐
薏米山药粥:中医食疗界的网红养生方
饮食不节引发胃热?专家教你科学调理
中国高空腹血糖相关心血管疾病负担研究发布:2018年约49.86万人因此死亡
《斗罗大陆2》引热议,2024年男频剧正集体破局
如何保护公民隐私的方法
详解国债逆回购:特点、规则及注意事项
国债逆回购怎么买收益高
过年走亲戚要记住的九件事,终于整理好了,不知道的收藏!
退休警务人员待遇该如何保障?
大白菜这样做着吃,美味又营养
一棵白菜做四道菜,荤素搭配营养全,去火降压效果,天越冷越明显
比肉还好吃的素菜,一盘成本几块钱,下酒又下饭,太棒了
如何正确设置车载导航系统?这种设置操作对导航功能有哪些影响和注意事项?
什么是车辆导航系统
鸽子蛋食用安全指南
鸽子蛋PK鸡蛋,谁才是真正的“超级食物”?
鸽子蛋真的能让你聪明又健康?
鸽子蛋美容养颜,你get了吗?
防静电手环选购指南:有线还是无线?材质和阻值如何选?
电子厂必备:防静电手环的正确使用法
防静电手环:游戏设备的隐形护盾
孕期产检,需要每个月都按时去做吗?
中国写意画入门轻松学:鲤鱼画法步骤
西红柿炒白菜:一道营养丰富、口感独特的家常美味
高蛋白质高热量食物推荐:晚期癌症患者的营养支持指南
冬季静电狂魔,无线手环来救场
中外学界重大发现:华龙洞人揭示东亚地区智人演化的奥秘
公安系统薪资与警衔等级有什么关系?
大陆身份证在香港银行存港币全解析:流程、条件及注意事项
五一商圈商铺投资:如何规避风险?