assetPaths | 要重新序列化的资源的路径。 |
options | 指定您是想重新序列化资源本身、它们的 .meta 文件,还是两者兼而有之。如果省略,则默认为两者。 |
强制加载并重新序列化给定的资源,并将任何未完成的数据更改刷新到磁盘。
当 Unity 从资源或场景文件加载旧数据时,数据会在内存中动态升级,但除非用户执行某些明确弄脏对象的操作(例如更改其上的值),否则不会写回磁盘。此方法允许您主动加载、升级并将任何项目中的资源或场景文件写回磁盘,而无需手动将其弄脏。
Unity 的常用行为有很多好处,特别是对于使用版本控制系统的项目,在迁移到新 Unity 版本后主动升级所有资源会导致大量更改文件的列表需要提交。但是,它也存在升级与用户继续处理项目时进行的故意更改“混合”的缺点。此方法允许您以受控的方式主动进行,准确地决定要升级哪些资源以及何时升级。
注意:您应该只从直接的用户操作(例如菜单项)调用此方法。您不应从 Unity 回调(例如 OnEnable)调用 ForceReserializeAssets,因为它可能在修改场景时被调用。如果这样做,Unity 会抛出异常。
using UnityEditor; using UnityEngine;
public class AssetDatabaseExamples : MonoBehaviour { [MenuItem("AssetDatabase/Force Reserialize Assets Example")] static void UpdateGroundMaterials() { for (var i = 0; i < 10; i++) { var matPath = $"Assets/Materials/GroundMaterial{i}.mat"; var mat = (Material)AssetDatabase.LoadMainAssetAtPath(matPath); AssetImporter.GetAtPath(matPath).SetAssetBundleNameAndVariant("GroundBundle", ""); mat.shader = Shader.Find("Standard"); mat.color = Color.white; mat.mainTexture = (Texture)AssetDatabase.LoadMainAssetAtPath($"Assets/Textures/GroundTexture{i}.jpg"); } AssetDatabase.ForceReserializeAssets();
} }