SharedVRCStuff/Editor/TexturePlatformSync.cs
2026-01-07 17:07:15 -05:00

157 lines
6.2 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
public class TexturePlatformSync
{
[MenuItem("LillithRosePup/Sync Texture Platforms (Android -> iOS)")]
public static void SyncTexturePlatforms()
{
var proceed = EditorUtility.DisplayDialog(
"Sync Texture Platforms",
"This will find all textures in the project and copy Android import settings to iOS if they differ.\n\nThis may take a while for large projects. Continue?",
"Continue",
"Cancel"
);
if (!proceed)
{
return;
}
SyncAllTextures();
}
private static void SyncAllTextures()
{
// Find all texture assets in the project
string[] textureGuids = AssetDatabase.FindAssets("t:Texture2D");
int totalTextures = textureGuids.Length;
int syncedCount = 0;
int skippedCount = 0;
int errorCount = 0;
bool wasCancelled = false;
Debug.Log($"Found {totalTextures} textures. Starting sync...");
// Start batching asset imports to pause reimporting until complete
AssetDatabase.StartAssetEditing();
try
{
for (int i = 0; i < textureGuids.Length; i++)
{
string guid = textureGuids[i];
string path = AssetDatabase.GUIDToAssetPath(guid);
// Update progress bar
if (EditorUtility.DisplayCancelableProgressBar(
"Syncing Texture Platforms",
$"Processing: {System.IO.Path.GetFileName(path)} ({i + 1}/{totalTextures})",
(float)i / totalTextures))
{
wasCancelled = true;
Debug.LogWarning("Texture platform sync cancelled by user.");
break;
}
try
{
TextureImporter importer = AssetImporter.GetAtPath(path) as TextureImporter;
if (importer == null)
{
skippedCount++;
continue;
}
// Get Android and iOS platform settings
TextureImporterPlatformSettings androidSettings = importer.GetPlatformTextureSettings("Android");
TextureImporterPlatformSettings iosSettings = importer.GetPlatformTextureSettings("iOS");
// Check if settings differ
if (SettingsDiffer(androidSettings, iosSettings))
{
// Copy Android settings to iOS
TextureImporterPlatformSettings newIosSettings = new TextureImporterPlatformSettings
{
name = "iOS",
overridden = androidSettings.overridden,
maxTextureSize = androidSettings.maxTextureSize,
textureCompression = androidSettings.textureCompression,
compressionQuality = androidSettings.compressionQuality,
allowsAlphaSplitting = androidSettings.allowsAlphaSplitting,
format = androidSettings.format,
crunchedCompression = androidSettings.crunchedCompression
};
importer.SetPlatformTextureSettings(newIosSettings);
// Import within the batch session - imports will be queued until StopAssetEditing
AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate);
syncedCount++;
Debug.Log($"Synced: {path}");
}
else
{
skippedCount++;
}
}
catch (System.Exception ex)
{
errorCount++;
Debug.LogError($"Error processing {path}: {ex.Message}");
}
}
}
finally
{
// Stop batching - this will trigger all queued imports at once
AssetDatabase.StopAssetEditing();
}
EditorUtility.ClearProgressBar();
AssetDatabase.Refresh();
// Show completion dialog with statistics (even if cancelled)
string title = wasCancelled ? "Sync Cancelled" : "Sync Complete";
string message = wasCancelled
? $"Texture platform sync was cancelled.\n\n" +
$"Total textures: {totalTextures}\n" +
$"Processed: {syncedCount + skippedCount + errorCount}\n" +
$"Synced: {syncedCount}\n" +
$"Skipped (already matching): {skippedCount}\n" +
$"Errors: {errorCount}"
: $"Texture platform sync completed!\n\n" +
$"Total textures: {totalTextures}\n" +
$"Synced: {syncedCount}\n" +
$"Skipped (already matching): {skippedCount}\n" +
$"Errors: {errorCount}";
EditorUtility.DisplayDialog(title, message, "OK");
string logMessage = wasCancelled
? $"Texture platform sync cancelled. Processed: {syncedCount + skippedCount + errorCount}, Synced: {syncedCount}, Skipped: {skippedCount}, Errors: {errorCount}"
: $"Texture platform sync complete. Synced: {syncedCount}, Skipped: {skippedCount}, Errors: {errorCount}";
Debug.Log(logMessage);
}
private static bool SettingsDiffer(TextureImporterPlatformSettings android, TextureImporterPlatformSettings ios)
{
// If Android settings are not overridden, they match by default
if (!android.overridden)
{
return false;
}
// Compare all relevant settings
return android.maxTextureSize != ios.maxTextureSize ||
android.textureCompression != ios.textureCompression ||
android.compressionQuality != ios.compressionQuality ||
android.allowsAlphaSplitting != ios.allowsAlphaSplitting ||
android.format != ios.format ||
android.crunchedCompression != ios.crunchedCompression ||
android.overridden != ios.overridden;
}
}