版本:Unity 6 (6000.0)
语言English
  • C#

AssetDatabase.ForceReserializeAssets

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们确实会阅读用户提出的每个建议更改,并在适用的情况下进行更新。

关闭

提交失败

由于某种原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public static void ForceReserializeAssets();

声明

public static void ForceReserializeAssets(IEnumerable<string> assetPaths, ForceReserializeAssetsOptions options);

参数

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();

} }