资源文件中包含的对 UnityEngine.Object 的可序列化延迟引用。
允许一个资源引用另一个资源,但会将被引用资源的加载延迟到使用之时,而不是在反序列化引用对象时加载它。
典型用例:
- 对于需要引用资源但从磁盘读取设置的导入器设置,无法加载被引用的资源,因为它们可能没有导入且尚无法访问。
- 为缩短打开场景所需的时间,仅在编辑模式下加载初始设置或显示所需的资源。
注意:
- 与直接引用相比,延迟引用具有轻微的性能开销。
- 在独立平台播放器中,当加载播放器或资源包时,将加载所有资源。
using UnityEditor.Experimental.AssetImporters; using UnityEngine;
[ScriptedImporter(1, "foo")] public class FooImporter : ScriptedImporter { public LazyLoadReference<Material> m_DefaultMaterial;
public override void OnImportAsset(AssetImportContext ctx) { // At this point, 'm_DefaultMaterial' may refer to a material that has yet to be loaded into memory
Material mat; if (!m_DefaultMaterial.isSet) // 'isSet' Does not load the referenced material even if not in memory. { mat = new Material(Shader.Find("Transparent/Diffuse")); ctx.AddObjectToAsset("mat", mat); } else { mat = m_DefaultMaterial.asset; // Will load referenced material if it is not already in memory. }
var obj = GameObject.CreatePrimitive(PrimitiveType.Cube); obj.transform.GetComponent<MeshRenderer>().material = mat;
ctx.AddObjectToAsset("main", obj); ctx.SetMainObject(obj); } }