在不调用AssetDatabase.LoadAssetAtPath的情况下将变量设置为磁盘上的实例

时间:2013-08-05 21:04:42

标签: c# unity3d

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

-CutScene
-AnimationCollection

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

如果它是值类型(即结构,整数,浮点数等),则存储实际值。

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

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