Объявление
public static void ForceReserializeAssets();Параметры
assetPaths | Пути к активам, которые должны быть повторно сериализованы. Если опущено, будут повторно сериализованы все активы в проекте.. |
options | Укажите, хотите ли вы повторно сериализовать сами активы, их метафайлы или и то, и другое. Если опущено, по умолчанию используются оба. |
Описание
Принудительно загрузить и повторно сериализовать заданные ресурсы, сбрасывая на диск все незавершенные изменения данных.
Когда Unity загружает старые данные из ресурса или файла сцены, данные динамически обновляются в памяти, но не записываются обратно на диск, если только пользователь не сделает что-то, что явно испортит объект (например, изменит его значение). Этот метод позволяет заблаговременно загружать, обновлять и записывать на диск любые активы или файлы сцен в проекте без необходимости вручную загрязнять их.
Обычное поведение Unity имеет ряд преимуществ, особенно для проектов с системами контроля версий, где упреждающее обновление всех ресурсов после перехода на новую версию 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();
}
}