Unity 中实例化预制体的完整过程
1.资源加载(Load Asset to Memory)
- Unity 的资源加载是指将各种资源(如模型、纹理、音频、预制体 等)从存储介质(如磁盘、AssetBundle、远程服务器)到运行时内存的过程,使其成为可用的资源(Asset),加载后的预制体是内存中的只读资源(Asset),无法直接修改
1.1直接引用
-
在Inspector面板中直接将资源拖拽到脚本的公共变量上
特点:
简单易用:适合小型项目或固定资源
静态加载:资源会被直接打包到场景或预制体中,无法动态加载
内存占用:资源会随场景加载自动加载,可能导致内存浪费
1.2Resources文件夹
-
将资源放在 Assets/Resources 文件夹中,通过 Resources.Load() 加载
特点:
动态加载:支持按需加载资源
局限性:所有资源会打包到最终构建中,增大包体、不支持热更新
1.3AssetBundle
-
将资源打包成独立的 .assetbundle 文件,支持动态下载和加载
特点:
灵活:支持热更新、按需加载、减小初始包体。
复杂:需手动管理依赖、版本和内存卸载。
内存管理:需调用 AssetBundle.Unload(true) 释放资源。
1.4Addressables
-
Unity官方推荐的资源管理系统,基于AssetBundle但更高级
特点:
自动化:自动处理依赖、打包和加载
动态加载:支持本地和远程资源(如CDN)
内存优化:提供缓存和引用计数管理
1.5Scene 加载
-
通过 SceneManager.LoadScene 加载场景,场景内的资源会一并加载
场景切换:使用 SceneManager 加载场景资源。
2.实例化(Instantiate GameObject)
- 基于内存中的预制体资源(Asset),生成一个独立的、可操作的 GameObject 实例
2.1Prefab 和 Gameobject
📚️ Prefab : Prefab 是一个模板,用于保存一个或多个的Gameobject的完整结构和配置(包括组件、子物体、脚本参数),不直接存在于场景中,需要通过实例化具体生成对象, 在编辑器中直接拖拽Prefab到场景中(自动生成实例)
📚️ Gameobject: Gameobject是通过Prefab生成的具体对象,存在于场景中,仅存在于场景或运行时内存中,不会作为独立文件保存,若需保存到场景中,需手动拖拽到场景并保存场景文件
📚️ 实例化预制体:实例化预制体Instantiate方法其实就是一种序列化过程,Instantiate方法的内部首先将参数original所引用的游戏对象序列化,得到序列化流(序列化内容包括GameObject 的所有组件Component、属性值、子对象层级结构等),通过反序列化机制将序列化流生成新的Gameobject对象,确保了克隆对象与原始对象完全独立(深拷贝),为克隆对象生成新的实例 ID并且自动在对象名称后添加 “Clone” 标记