161 lines
4.8 KiB
C#
161 lines
4.8 KiB
C#
using System;
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
using System.IO;
|
|
using UnityEditor.SceneManagement;
|
|
using UnityEngine.SceneManagement;
|
|
using static UnityEditor.Rendering.AnimationClipUpgrader;
|
|
|
|
internal static class URP2DConverterUtility
|
|
{
|
|
public static bool IsPSB(string path)
|
|
{
|
|
if (string.IsNullOrEmpty(path))
|
|
throw new ArgumentNullException(nameof(path));
|
|
|
|
if (path.StartsWith("Packages"))
|
|
return false;
|
|
|
|
return path.EndsWith(".psb") || path.EndsWith(".psd");
|
|
}
|
|
|
|
|
|
public static bool IsMaterialPath(string path, string id)
|
|
{
|
|
if (string.IsNullOrEmpty(path))
|
|
throw new ArgumentNullException(nameof(path));
|
|
|
|
if (path.StartsWith("Packages"))
|
|
return false;
|
|
|
|
if (path.EndsWith(".mat"))
|
|
return URP2DConverterUtility.DoesFileContainString(path, new string[] { id });
|
|
|
|
return false;
|
|
}
|
|
|
|
public static bool IsPrefabOrScenePath(string path, string[] ids)
|
|
{
|
|
if (string.IsNullOrEmpty(path))
|
|
throw new ArgumentNullException(nameof(path));
|
|
|
|
if (path.StartsWith("Packages"))
|
|
return false;
|
|
|
|
if (path.EndsWith(".prefab", StringComparison.OrdinalIgnoreCase) || path.EndsWith(".unity", StringComparison.OrdinalIgnoreCase))
|
|
return URP2DConverterUtility.DoesFileContainString(path, ids);
|
|
|
|
return false;
|
|
}
|
|
|
|
public static bool IsPrefabOrScenePath(string path, string id)
|
|
{
|
|
return IsPrefabOrScenePath(path, new string[] { id });
|
|
}
|
|
|
|
public static bool DoesFileContainString(string path, string[] strs)
|
|
{
|
|
if (strs != null && strs.Length > 0)
|
|
{
|
|
using (StreamReader file = File.OpenText(path))
|
|
{
|
|
string line;
|
|
while ((line = file.ReadLine()) != null)
|
|
{
|
|
for (int i = 0; i < strs.Length; i++)
|
|
{
|
|
if (line.Contains(strs[i]))
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static string UpgradePSB(string path)
|
|
{
|
|
AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceSynchronousImport | ImportAssetOptions.ForceUpdate);
|
|
return string.Empty;
|
|
}
|
|
|
|
public static string UpgradePrefab(string path, Action<GameObject> objectUpgrader)
|
|
{
|
|
UnityEngine.Object[] objects = AssetDatabase.LoadAllAssetsAtPath(path);
|
|
|
|
int firstIndex = 0;
|
|
for (int i = 0; i < objects.Length; i++)
|
|
{
|
|
if (objects[i] as GameObject)
|
|
{
|
|
firstIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// There should be no need to check this as we have already determined that there is something that needs upgrading
|
|
if (!PrefabUtility.IsPartOfImmutablePrefab(objects[firstIndex]))
|
|
{
|
|
for (int objIndex = 0; objIndex < objects.Length; objIndex++)
|
|
{
|
|
GameObject go = objects[objIndex] as GameObject;
|
|
if (go != null)
|
|
{
|
|
objectUpgrader(go);
|
|
}
|
|
}
|
|
|
|
GameObject asset = objects[firstIndex] as GameObject;
|
|
PrefabUtility.SavePrefabAsset(asset.transform.root.gameObject);
|
|
|
|
return string.Empty;
|
|
}
|
|
|
|
return "Unable to modify an immutable prefab";
|
|
}
|
|
|
|
public static void UpgradeScene(string path, Action<GameObject> objectUpgrader)
|
|
{
|
|
Scene scene = new Scene();
|
|
bool openedByUser = false;
|
|
for (int i = 0; i < SceneManager.sceneCount && !openedByUser; i++)
|
|
{
|
|
scene = SceneManager.GetSceneAt(i);
|
|
if (path == scene.path)
|
|
openedByUser = true;
|
|
}
|
|
|
|
if (!openedByUser)
|
|
scene = EditorSceneManager.OpenScene(path, OpenSceneMode.Additive);
|
|
|
|
GameObject[] gameObjects = scene.GetRootGameObjects();
|
|
foreach (GameObject go in gameObjects)
|
|
objectUpgrader(go);
|
|
|
|
EditorSceneManager.SaveScene(scene);
|
|
if (!openedByUser)
|
|
EditorSceneManager.CloseScene(scene, true);
|
|
}
|
|
|
|
public static void UpgradeMaterial(string path, Shader oldShader, Shader newShader)
|
|
{
|
|
Material material = AssetDatabase.LoadAssetAtPath<Material>(path);
|
|
if (material.shader == oldShader)
|
|
material.shader = newShader;
|
|
|
|
GUID guid = AssetDatabase.GUIDFromAssetPath(path);
|
|
AssetDatabase.SaveAssetIfDirty(guid);
|
|
}
|
|
|
|
public static string GetObjectIDString(UnityEngine.Object obj)
|
|
{
|
|
string guid;
|
|
long localId;
|
|
if (AssetDatabase.TryGetGUIDAndLocalFileIdentifier(obj.GetInstanceID(), out guid, out localId))
|
|
return "fileID: " + localId + ", guid: " + guid;
|
|
|
|
return null;
|
|
}
|
|
}
|