尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

揭秘 Unity ScriptableObjectCollection 核心机制:CollectionsRegistry 注册中心与自动加载策略

揭秘 Unity ScriptableObjectCollection 核心机制:CollectionsRegistry 注册中心与自动加载策略 揭秘 Unity ScriptableObjectCollection 核心机制CollectionsRegistry 注册中心与自动加载策略【免费下载链接】ScriptableObjectCollectionA library to help improve the usability of Unity3D Scriptable Objects by grouping them into a collection and providing easy access through code or user-friendly inspectors!项目地址: https://gitcode.com/gh_mirrors/sc/ScriptableObjectCollectionScriptableObjectCollection 是一款面向 Unity3D 的开源工具库它把零散的 ScriptableObject 归类为集合Collection并通过 CollectionsRegistry 注册中心实现统一注册、自动加载与快速查找。本文带你深入这套核心机制看看它如何用「注册 自动发现 构建裁剪」三板斧解决大型项目中数据资产管理的痛点 为什么需要一个注册中心在 Unity 项目中武器、道具、消耗品往往都是成百上千个 ScriptableObject 资产。传统做法要么靠手动拖引用要么靠Resources.Load硬编码路径项目一长大就容易失控。ScriptableObjectCollection 的思路是所有集合资产向一个全局注册中心登记业务代码只通过注册中心查询而不关心资产的具体路径。注册中心的实现单例 Resources注册中心的核心实现位于 CollectionsRegistry.cs它继承自 ResourceScriptableObjectSingleton.cs 提供的 Resources 单例基类设计上有三个关键点存放于 Resources注册中心资产位于Assets/Resources/CollectionsRegistry.asset运行时通过Resources.Load即可拿到不需要任何场景物体或启动脚本惰性创建编辑器下若发现资产缺失会自动在 Resources 中创建全程无感执行顺序靠前类上标注了[DefaultExecutionOrder(-1000)]并配合[RuntimeInitializeOnLoadMethod(BeforeSceneLoad)]保证在任何业务逻辑之前完成初始化[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] private static void Initialize() { LoadOrCreateInstanceCollectionsRegistry(); }注册中心内部维护一张LongGuid - Collection的查找字典见 CollectionsRegistry.cs 的RebuildGuidLookup配合TryGetCollectionByGUID、TryGetCollectionByName、TryGetCollectionFromItemType等查询接口做到 O(1) 级别的集合定位。其中「按物品类型查找」还会计算继承距离优先返回最精确匹配的集合非常贴心。自动发现新集合如何自动入册注册中心最妙的设计是编辑器侧的自动搜索Auto Search For Collections。核心逻辑在 CollectionsAssetsPostProcessor.cs每当有资产导入OnPostprocessAllAssets处理器会检查其中是否包含新的集合资产若注册中心不认识它就触发一次全库扫描ReloadCollections()用AssetDatabase.FindAssets找出所有集合并重新登记如果此时 Unity 正在编译扫描会被延迟到脚本重载完成后执行避免时机冲突。与此同时删除集合资产时CollectionAssetsModificationProcessor.cs 会拦截删除事件并自动调用UnregisterCollection保证注册表与项目资产始终同步——你只管在 Project 面板里增删集合注册中心自己跟上。自动加载策略让构建产物保持精简注册中心放在 Resources 意味着它引用的集合都会打进 Resources 包集合太多会拖慢启动。为此库提供了一套「自动加载裁剪」策略每个集合都有一个AutomaticallyLoaded开关默认开启见 ScriptableObjectCollection.cs构建前CollectionPreprocessBuild.cs 触发PreBuildProcess先把没有勾选自动加载的集合从注册表中移除并把它们的路径暂存到 EditorPrefs构建后PostBuildProcess立即重新扫描恢复编辑器中的注册状态。也就是说只有你标记为「自动加载」的集合才会随 Resources 打包进游戏其余大体积集合比如游戏实体引用可以在运行时按需手动注册、用完即注销CollectionsRegistry.Instance.RegisterCollection(myHeavyCollection); // ... 使用阶段 ... CollectionsRegistry.Instance.UnregisterCollection(myHeavyCollection);此外注册中心还提供ValidateCollections自检能力见 CollectionsRegistry.cs会自动清理空引用、修复无效或重复的 GUID保证注册表长期健康。注册中心如何让代码访问变得优雅配合代码生成器注册中心最终会产出优雅的静态访问入口。以示例工程生成的 CarIdCollection.g.cs 为例每个道具都对应一个静态属性底层就是通过CollectionsRegistry.Instance.TryGetCollectionByGUID(...)按 GUID 精确定位——资产改名、移动目录都不会影响引用这正是 LongGuid 方案的精髓。小结机制解决的问题关键文件Resources 单例注册中心零配置全局访问CollectionsRegistry.cs资产导入自动扫描新集合自动入册CollectionsAssetsPostProcessor.cs删除拦截自动注销注册表与资产同步CollectionAssetsModificationProcessor.cs构建前后裁剪/恢复控制打包体积CollectionPreprocessBuild.csGUID 查找字典高性能精确定位CollectionsRegistry.cs一句话总结CollectionsRegistry 用「注册 自动发现 构建裁剪」三招把 ScriptableObject 从一堆散落的资产变成了可查询、可裁剪、可安全引用的数据资产库。对于追求数据驱动开发的 Unity 团队这套机制值得借鉴 【免费下载链接】ScriptableObjectCollectionA library to help improve the usability of Unity3D Scriptable Objects by grouping them into a collection and providing easy access through code or user-friendly inspectors!项目地址: https://gitcode.com/gh_mirrors/sc/ScriptableObjectCollection创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表