将变量设置为磁盘上的实例,而不调用AssetDatabase.LoadAssetPath

本文关键字:调用 LoadAssetPath AssetDatabase 实例 设置 变量 磁盘 | 更新日期: 2023-09-27 18:26:35

假设我有两个类,它们都继承自UnityEngine.ScriptableObject:

-剪切场景
-动画收藏

CutScene类包含对话树、摄影机剪切,并有一个公共的AnimationCollection字段。"动画集合"保存给定剪切场景中使用的动画的实际动画数据。

在我们的管道中,CutScene实例由导出过程生成,导出过程将它们保存为unity.asset文件。

动画师使用unity编辑器工具将动画放入AnimationCollection,然后将其保存为unity.asset文件。然后,使用统一编辑器,动画师将AnimationCollection的资源文件拖动到使用它的CutScene的AnimationCollection字段中。

更改并导出CutScene时,导出代码将用新的文件覆盖该CutScene的现有.asset文件。我们确实希望保留对动画师设置的AnimationCollection的引用。目前,这是用这样的代码完成的:

cutScene.AnimationCollection = AssetDatabase.LoadAssetAtPath(pathToAnimCollection, typeof(AnimationCollection)) as AnimationCollection;

问题是加载AnimationCollection可能需要很长时间(对于一些较大的剪切场景,需要12秒)。如果我知道动画集合的路径,我可以以某种方式设置CutScene的动画集合字段,而不必实际将动画集合加载到内存中吗?AssetDatabase.AssetPathToGUID看起来很有前途,但我不确定我能用GUID字符串做什么?

将变量设置为磁盘上的实例,而不调用AssetDatabase.LoadAssetPath

在C#中,当您设置字段的值时,会发生以下两种情况之一。

如果它是一个引用类型(即类),则会在内存中存储对它的引用。这是一个小数字,指向内存中加载该项的唯一位置。

如果是值类型(即structs、int、float等),则存储实际值。

在您的情况下,您正在从Unity加载的资源中设置动画集合(引用类型)。为了让你的系统正常工作,你必须先将整个资产加载到内存中,这样你才能引用它。这意味着你不能在不更改过场系统的情况下使用GUID或文件路径。

要使系统在不加载文件的情况下工作,请考虑将动画集合的文件路径存储在过场中,而不是动画集合本身。然后在加载整个过场时加载该路径。