123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Threading;
- using UnityEditor.PackageManager.Requests;
- using UnityEditor.PackageManager.UI;
- using UnityEngine;
-
- namespace UnityEditor.Tilemaps
- {
- internal static class TilePaletteWhiteboxSamplesUtility
- {
- private static readonly String whiteboxFilterText = "Whitebox";
- private static readonly List<String> m_WhiteboxSamplesPackages = new List<String>(new[] {"com.unity.2d.tilemap", "com.unity.2d.tilemap.extras"});
-
- private static ListRequest m_WhiteboxPackageRequest;
- private static List<Sample> m_WhiteboxSamples;
- private static List<String> m_WhiteboxSampleNames;
- private static String[] m_WhiteboxSampleNamesArray;
- private static int m_LongestNameIndex = -1;
-
- public static List<Sample> whiteboxSamples
- {
- get
- {
- if (m_WhiteboxSamples == null)
- GetWhiteboxSamples();
- return m_WhiteboxSamples;
- }
- }
-
- public static List<String> whiteboxSampleNames
- {
- get
- {
- if (m_WhiteboxSampleNames == null)
- GetWhiteboxSamples();
- return m_WhiteboxSampleNames;
- }
- }
-
- public static String[] whiteboxSampleNamesArray
- {
- get
- {
- if (m_WhiteboxSampleNamesArray == null)
- GetWhiteboxSamples();
- return m_WhiteboxSampleNamesArray;
- }
- }
-
- public static String longestName
- {
- get
- {
- if (m_LongestNameIndex >= 0 && m_LongestNameIndex < m_WhiteboxSampleNames.Count)
- return m_WhiteboxSampleNames[m_LongestNameIndex];
- return null;
- }
- }
-
- private static void GetWhiteboxSamples()
- {
- m_WhiteboxSamples = new List<Sample>();
- m_WhiteboxSampleNames = new List<String>();
- m_LongestNameIndex = -1;
-
- var packages = PackageManager.PackageInfo.GetAllRegisteredPackages();
- foreach (var packageInfo in packages)
- {
- if (!m_WhiteboxSamplesPackages.Contains(packageInfo.name))
- continue;
-
- var samples = Sample.FindByPackage(packageInfo.name, packageInfo.version);
- foreach (var sample in samples)
- {
- if (!sample.displayName.Contains(whiteboxFilterText, StringComparison.CurrentCultureIgnoreCase))
- continue;
-
- m_WhiteboxSamples.Add(sample);
- m_WhiteboxSampleNames.Add(sample.displayName);
-
- if (m_LongestNameIndex == -1 || longestName.Length < sample.displayName.Length)
- m_LongestNameIndex = m_WhiteboxSampleNames.Count - 1;
- }
- }
- m_WhiteboxSampleNamesArray = m_WhiteboxSampleNames.ToArray();
- }
-
- internal static void ImportWhiteboxSample(int index)
- {
- if (index >= whiteboxSamples.Count)
- return;
-
- var sample = whiteboxSamples[index];
- ImportWhiteboxSample(sample);
- }
-
- internal static void ImportWhiteboxSample(Sample sample)
- {
- sample.Import(Sample.ImportOptions.HideImportWindow);
-
- GridPalettes.CleanCache();
-
- // Try to select the new palette as the current palette
- var directoryInfo = new DirectoryInfo(sample.importPath);
- var fileInfos = directoryInfo.GetFiles("*.prefab");
- foreach (var file in fileInfos)
- {
- var dataPath = FileUtil.NiceWinPath(Application.dataPath);
- var absolutePath = FileUtil.NiceWinPath(file.FullName);
- if (!absolutePath.StartsWith(dataPath))
- return;
-
- var relativePath= FileUtil.CombinePaths("Assets", absolutePath.Substring(dataPath.Length));
- var gridPalette = AssetDatabase.LoadAssetAtPath(relativePath, typeof(GridPalette)) as GridPalette;
- if (gridPalette != null)
- {
- var go = AssetDatabase.LoadAssetAtPath(relativePath, typeof(GameObject)) as GameObject;
- GridPaintingState.palette = go;
- return;
- }
- }
- }
-
- internal static void DuplicateWhiteboxSample(int index)
- {
- if (index >= whiteboxSamples.Count)
- return;
-
- var sample = whiteboxSamples[index];
- DuplicateWhiteboxSample(sample);
- }
-
- internal static void DuplicateWhiteboxSample(Sample sample)
- {
- var path = ProjectBrowser.s_LastInteractedProjectBrowser != null
- ? ProjectBrowser.s_LastInteractedProjectBrowser.GetActiveFolderPath()
- : "Assets";
-
- path = EditorUtility.SaveFilePanelInProject("Generate Whitebox Palette Asset", sample.displayName, "prefab",
- "Generate Whitebox Palette Asset", path);
- if (String.IsNullOrWhiteSpace(path))
- return;
-
- var dirPath = FileUtil.UnityGetDirectoryName(path);
- var fileName = FileUtil.UnityGetFileNameWithoutExtension(path);
- DuplicateWhiteboxSample(sample, dirPath, fileName);
- }
-
- private static void ReplaceGuidInMetaFile(FileInfo fileInfo, out string oldGuid, out string newGuid)
- {
- const string kGuidLine = "guid: ";
-
- var reader = fileInfo.OpenText();
- reader.ReadLine();
- var guidLine = reader.ReadLine();
- if (!guidLine.StartsWith(kGuidLine))
- {
- reader.Close();
- throw new FormatException("Meta File does not have a valid GUID.");
- }
-
- oldGuid = guidLine.Remove(0, kGuidLine.Length);
- oldGuid.TrimEnd(Environment.NewLine.ToCharArray());
-
- newGuid = GUID.Generate().ToString();
- reader.Close();
-
- var absolutePath = FileUtil.NiceWinPath(fileInfo.FullName);
- var readAllText = File.ReadAllText(absolutePath);
- var replace = readAllText.Replace(oldGuid, newGuid);
- File.WriteAllText(absolutePath, replace);
- }
-
- internal static void DuplicateWhiteboxSample(Sample sample, string path, string paletteName = null)
- {
- AssetDatabase.DisallowAutoRefresh();
- AssetDatabase.StartAssetEditing();
-
- var sampleDirectoryInfo = new DirectoryInfo(sample.resolvedPath);
- var sampleMetaFileInfos = sampleDirectoryInfo.GetFiles("*.meta");
- var sampleMetaNames = new HashSet<string>();
- foreach (var sampleMetaFileInfo in sampleMetaFileInfos)
- sampleMetaNames.Add(sampleMetaFileInfo.Name);
-
- var tempPath = AssetDatabase.GetUniquePathNameAtSelectedPath("Temp");
- FileUtil.CreateOrCleanDirectory(tempPath);
- FileUtil.CopyDirectoryRecursiveFiltered(sample.resolvedPath, tempPath, true, @"\.sample\.json$");
-
- // Fix meta references for copied files
- var textureIdMap = new Dictionary<string, string>();
- var textureDirectoryInfo = new DirectoryInfo(FileUtil.CombinePaths(tempPath, "Textures"));
- var textureMetaFileInfos = textureDirectoryInfo.GetFiles("*.meta");
- foreach (var metaFileInfo in textureMetaFileInfos)
- {
- ReplaceGuidInMetaFile(metaFileInfo, out var oldGuid, out var newGuid);
- textureIdMap.Add(oldGuid, newGuid);
- }
-
- var tileIdMap = new Dictionary<string, string>();
- var tileDirectoryInfo = new DirectoryInfo(FileUtil.CombinePaths(tempPath, "Tiles"));
- var tileMetaFileInfos = tileDirectoryInfo.GetFiles("*.meta");
- foreach (var metaFileInfo in tileMetaFileInfos)
- {
- ReplaceGuidInMetaFile(metaFileInfo, out var oldGuid, out var newGuid);
- tileIdMap.Add(oldGuid, newGuid);
- }
-
- var tempBaseDirectoryInfo = new DirectoryInfo(tempPath);
- var baseMetaFileInfos = tempBaseDirectoryInfo.GetFiles("*.meta");
- foreach (var metaFileInfo in baseMetaFileInfos)
- {
- if (sampleMetaNames.Contains(metaFileInfo.Name))
- ReplaceGuidInMetaFile(metaFileInfo, out var oldGuid, out var newGuid);
- }
-
- var tileAssetFileInfos = tileDirectoryInfo.GetFiles("*.asset");
- var textureIdReplaceArray = new string[textureIdMap.Count * 2];
- {
- var i = 0;
- foreach (var pair in textureIdMap)
- {
- textureIdReplaceArray[i++] = pair.Key;
- textureIdReplaceArray[i++] = pair.Value;
- }
- }
- foreach (var tileAssetFileInfo in tileAssetFileInfos)
- {
- var absolutePath = FileUtil.NiceWinPath(tileAssetFileInfo.FullName);
- FileUtil.ReplaceTextRegex(absolutePath, textureIdReplaceArray);
- }
-
- var prefabFileInfos = tempBaseDirectoryInfo.GetFiles("*.prefab");
- var tileIdReplaceArray = new string[tileIdMap.Count * 2];
- {
- var i = 0;
- foreach (var pair in tileIdMap)
- {
- tileIdReplaceArray[i++] = pair.Key;
- tileIdReplaceArray[i++] = pair.Value;
- }
- }
- foreach (var prefabFileInfo in prefabFileInfos)
- {
- var prefabPath = FileUtil.NiceWinPath(prefabFileInfo.FullName);
- FileUtil.ReplaceTextRegex(prefabPath, tileIdReplaceArray);
-
- // Rename Palette if user has changed the name
- if (!String.IsNullOrEmpty(paletteName))
- {
- var paletteNameWithExtension = $"{paletteName}.prefab";
- if (!String.Equals(paletteNameWithExtension, prefabFileInfo.Name))
- {
- var prefabName = FileUtil.CombinePaths(prefabFileInfo.DirectoryName, paletteNameWithExtension);
- FileUtil.MoveFileIfExists(prefabPath, prefabName);
- FileUtil.MoveFileIfExists($"{prefabPath}.meta", FileUtil.CombinePaths(prefabFileInfo.DirectoryName, $"{paletteNameWithExtension}.meta"));
- }
- }
- }
-
- FileUtil.CopyDirectoryRecursive(tempPath, path, true);
- FileUtil.DeleteFileOrDirectory(tempPath);
-
- AssetDatabase.StopAssetEditing();
- AssetDatabase.AllowAutoRefresh();
-
- AssetDatabase.Refresh();
-
- GridPalettes.CleanCache();
-
- // Try to select the new palette as the current palette
- var baseDirectoryInfo = new DirectoryInfo(path);
- prefabFileInfos = baseDirectoryInfo.GetFiles("*.prefab");
- foreach (var prefabFileInfo in prefabFileInfos)
- {
- var dataPath = FileUtil.NiceWinPath(Application.dataPath);
- var absolutePath = FileUtil.NiceWinPath(prefabFileInfo.FullName);
- if (!absolutePath.StartsWith(dataPath))
- return;
-
- var relativePath= FileUtil.CombinePaths("Assets", absolutePath.Substring(dataPath.Length));
- var gridPalette = AssetDatabase.LoadAssetAtPath(relativePath, typeof(GridPalette)) as GridPalette;
- if (gridPalette != null)
- {
- var go = AssetDatabase.LoadAssetAtPath(relativePath, typeof(GameObject)) as GameObject;
- GridPaintingState.palette = go;
- return;
- }
- }
- }
- }
- }
|