2022-02-02 19:08:18 +03:00

349 lines
13 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace HeurekaGames.AssetHunterPRO
{
public static class AH_Utils
{
internal static string GetSizeAsString(ulong byteSize)
{
return GetSizeAsString((long)byteSize);
}
internal static string GetSizeAsString(long byteSize)
{
string sizeAsString = String.Empty;
float b = byteSize;
float kb = b / 1024f;
float mb = kb / 1024;
float gb = mb / 1024;
if (gb >= 1)
{
sizeAsString = String.Format(((float)Math.Round(gb, 1)).ToString(), "0.00") + " gb";
}
else if (mb >= 1)
{
sizeAsString = String.Format(((float)Math.Round(mb, 1)).ToString(), "0.00") + " mb";
}
else if (kb >= 1)
{
sizeAsString = String.Format(((float)Math.Round(kb, 1)).ToString(), "0.00") + " kb";
}
else if (byteSize >= 0)
{
sizeAsString = String.Format(((float)Math.Round(b, 1)).ToString(), "0.00") + " b";
}
return sizeAsString;
}
internal static void GetRelativePathAndAssetID(string absPath, out string relativePath, out string assetGuid)
{
relativePath = FileUtil.GetProjectRelativePath(absPath);
assetGuid = AssetDatabase.AssetPathToGUID(relativePath);
}
public static string[] GetEnabledSceneNamesInBuild()
{
return (from scene in EditorBuildSettings.scenes where scene.enabled select scene.path).ToArray();
}
public static string[] GetAllSceneNamesInBuild()
{
return (from scene in EditorBuildSettings.scenes select scene.path).ToArray();
}
public static string[] GetAllSceneNames()
{
return (from scene in AssetDatabase.GetAllAssetPaths() where scene.EndsWith(".unity") select scene).ToArray();
}
public static System.String BytesToString(long byteCount)
{
string[] suf = { "B", "KB", "MB", "GB", "TB", "PB", "EB" }; //Longs run out around EB
if (byteCount == 0)
return "0" + suf[0];
long bytes = Math.Abs(byteCount);
int place = Convert.ToInt32(Math.Floor(Math.Log(bytes, 1024)));
double num = Math.Round(bytes / Math.Pow(1024, place), 1);
return (Math.Sign(byteCount) * num).ToString() + suf[place];
}
internal static void PingObjectAtPath(string assetPath, bool select)
{
UnityEngine.Object loadObj = AssetDatabase.LoadAssetAtPath(assetPath, typeof(UnityEngine.Object));
EditorGUIUtility.PingObject(loadObj);
if (select)
Selection.activeObject = loadObj;
}
/// <summary>
/// A method to shorten file paths using ... delimiter
/// </summary>
/// <param name="absolutepath">The path to compress</param>
/// <param name="limit">The maximum length</param>
/// <returns></returns>
public static string ShrinkPathMiddle(string absolutepath, int limit)
{
//no path provided
if (string.IsNullOrEmpty(absolutepath))
{
return "";
}
var name = Path.GetFileName(absolutepath);
int namelen = name.Length;
int pathlen = absolutepath.Length;
var dir = absolutepath.Substring(0, pathlen - namelen);
string delimiter = "…";
int delimlen = delimiter.Length;
int idealminlen = namelen + delimlen;
var slash = (absolutepath.IndexOf("/") > -1 ? "/" : "\\");
//less than the minimum amt
if (limit < ((2 * delimlen) + 1))
{
return "";
}
//fullpath
if (limit >= pathlen)
{
return absolutepath;
}
//file name condensing
if (limit < idealminlen)
{
return delimiter + name.Substring(0, (limit - (2 * delimlen))) + delimiter;
}
//whole name only, no folder structure shown
if (limit == idealminlen)
{
return delimiter + name;
}
return dir.Substring(0, (limit - (idealminlen + 1))) + delimiter + slash + name;
}
internal static int BoolToInt(bool value)
{
return value ? 1 : 0;
}
internal static bool IntToBool(int value)
{
return (value != 0) ? true : false;
}
public static string ShrinkPathEnd(string absolutepath, int limit)
{
//no path provided
if (string.IsNullOrEmpty(absolutepath))
{
return "";
}
var name = Path.GetFileName(absolutepath);
int namelen = name.Length;
int pathlen = absolutepath.Length;
string delimiter = "…";
int delimlen = delimiter.Length;
var slash = (absolutepath.IndexOf("/") > -1 ? "/" : "\\");
//filesname longer than limit
if (namelen >= limit)
{
return name;
}
//fullpath
if (limit >= pathlen)
{
return absolutepath;
}
//Get substring within limit
var pathWithinLimit = absolutepath.Substring(pathlen - limit, limit);
int indexOfSlash = pathWithinLimit.IndexOf(slash);
return delimiter + pathWithinLimit.Substring(indexOfSlash, pathWithinLimit.Length - indexOfSlash);
}
internal static List<Texture> GetTargetGroupAssetDependencies(BuildTargetGroup targetGroup)
{
List<Texture> buildTargetAssetDependencies = new List<Texture>();
//Run through icons, splashscreens etc and include them as being used
Texture2D[] targetGroupIcons = PlayerSettings.GetIconsForTargetGroup(targetGroup);
List<Texture2D> additionalTargetGroupIcons = getAdditionalTargetAssets(targetGroup);
Texture2D[] unknownTargetGroupIcons = PlayerSettings.GetIconsForTargetGroup(BuildTargetGroup.Unknown);
PlayerSettings.SplashScreenLogo[] splashLogos = PlayerSettings.SplashScreen.logos;
//Loop default targetgroup icons
for (int i = 0; i < unknownTargetGroupIcons.Length; i++)
{
addTextureToPlayerSettingsList(ref buildTargetAssetDependencies, unknownTargetGroupIcons[i]);
}
//Loop targetgroup icons
for (int i = 0; i < targetGroupIcons.Length; i++)
{
addTextureToPlayerSettingsList(ref buildTargetAssetDependencies, targetGroupIcons[i]);
}
//Loop additional targetgroup icons
if (additionalTargetGroupIcons != null)
for (int i = 0; i < additionalTargetGroupIcons.Count; i++)
{
addTextureToPlayerSettingsList(ref buildTargetAssetDependencies, additionalTargetGroupIcons[i]);
}
//Loop splash
for (int i = 0; i < splashLogos.Length; i++)
{
addTextureToPlayerSettingsList(ref buildTargetAssetDependencies, splashLogos[i].logo);
}
//Get all the custom playersetting textures
addTextureToPlayerSettingsList(ref buildTargetAssetDependencies, PlayerSettings.defaultCursor);
addTextureToPlayerSettingsList(ref buildTargetAssetDependencies, PlayerSettings.virtualRealitySplashScreen);
addTextureToPlayerSettingsList(ref buildTargetAssetDependencies, PlayerSettings.SplashScreen.background);
addTextureToPlayerSettingsList(ref buildTargetAssetDependencies, PlayerSettings.SplashScreen.backgroundPortrait);
#if !UNITY_2019_1_OR_NEWER
addTextureToPlayerSettingsList(ref buildTargetAssetDependencies, PlayerSettings.resolutionDialogBanner);
#endif
return buildTargetAssetDependencies;
}
private static List<Texture2D> getAdditionalTargetAssets(BuildTargetGroup targetGroup)
{
switch (targetGroup)
{
#if !UNITY_2018_3_OR_NEWER
case BuildTargetGroup.N3DS:
{
break;
}
case BuildTargetGroup.PSP2:
{
break;
}
case BuildTargetGroup.Tizen:
{
break;
}
#endif
#if !UNITY_2019_3_OR_NEWER
case BuildTargetGroup.Facebook:
{
break;
}
#endif
case BuildTargetGroup.Android:
{
break;
}
case BuildTargetGroup.iOS:
{
break;
}
case BuildTargetGroup.PS4:
{
Debug.Log("AH: Need " + targetGroup + " documentation to add platform specific images and assets");
break;
}
case BuildTargetGroup.Standalone:
{
break;
}
case BuildTargetGroup.Switch:
{
return PlayerSettings.Switch.icons.ToList();
}
case BuildTargetGroup.tvOS:
{
break;
}
case BuildTargetGroup.WebGL:
{
break;
}
case BuildTargetGroup.WSA:
{
List<Texture2D> textures = new List<Texture2D>();
#if !UNITY_2021_1_OR_NEWER
//Obsolete at some point in 2021
textures.Add(AssetDatabase.LoadAssetAtPath<Texture2D>(PlayerSettings.WSA.packageLogo));
#endif
HashSet<PlayerSettings.WSAImageScale> exceptionScales = new HashSet<PlayerSettings.WSAImageScale>();
foreach (PlayerSettings.WSAImageType imageType in Enum.GetValues(typeof(PlayerSettings.WSAImageType)))
{
foreach (PlayerSettings.WSAImageScale imageScale in Enum.GetValues(typeof(PlayerSettings.WSAImageScale)))
{
try
{
string imagePath = PlayerSettings.WSA.GetVisualAssetsImage(imageType, imageScale);
textures.Add(AssetDatabase.LoadAssetAtPath<Texture2D>(imagePath));
}
catch (Exception)
{
exceptionScales.Add(imageScale);
//If that scale doesn't apply to the given WSA image type
}
}
}
if (exceptionScales.Count >= 1)
{
string scaleListString = "";
foreach (var item in exceptionScales)
{
scaleListString += item.ToString() + (exceptionScales.ElementAt(exceptionScales.Count - 1) == item ? "":", ");
}
Debug.Log("GetVisualAssetsImage method missing support for WSA image scale: " + scaleListString);
}
return textures;
}
case BuildTargetGroup.XboxOne:
{
Debug.Log("AH: Need " + targetGroup + " documentation to add platform specific images and assets");
break;
}
default:
{
Debug.LogWarning("AH: Targetgroup unknown: " + targetGroup);
break;
}
}
return null;
}
private static void addTextureToPlayerSettingsList(ref List<Texture> playerSettingsTextures, Sprite sprite)
{
if (sprite != null)
addTextureToPlayerSettingsList(ref playerSettingsTextures, sprite.texture);
}
private static void addTextureToPlayerSettingsList(ref List<Texture> playerSettingsTextures, Texture2D texture)
{
if ((texture != null) && AssetDatabase.IsMainAsset(texture))
playerSettingsTextures.Add(texture);
}
}
}