mirror of
https://github.com/All-Of-Us-Mods/MiraAPI.git
synced 2026-10-20 01:46:15 +00:00
Add BundleSubAssetHolder for packed spritesheets
This commit is contained in:
1 parent
535967475d
commit
6f61a75bb7
4 files changed
+125
-3
No files matched your search
@@ -550,7 +550,6 @@ public static class RoleSettingMenuPatches
|
|||||||
new Rect(0, 0, 370, 230),
|
new Rect(0, 0, 370, 230),
|
||||||
Vector2.one / 2,
|
Vector2.one / 2,
|
||||||
100);
|
100);
|
||||||
__instance.roleScreenshot.drawMode = SpriteDrawMode.Sliced;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
__instance.roleHeaderSprite.color = customRole.OptionsMenuColor;
|
__instance.roleHeaderSprite.color = customRole.OptionsMenuColor;
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace MiraAPI.Utilities.Assets;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A utility class for loading multiple assets from an <see cref="LoadableBundleSubAssetHolder"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the asset.</param>
|
||||||
|
/// <param name="assetHolder">The <see cref="LoadableBundleSubAssetHolder"/> that contains the asset.</param>
|
||||||
|
public class LoadableBundleSubAsset(string name, LoadableBundleSubAssetHolder assetHolder) : LoadableAsset<Sprite>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Loads the asset from the <see cref="LoadableBundleSubAssetHolder"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>The asset.</returns>
|
||||||
|
/// <exception cref="Exception">The asset did not load properly.</exception>
|
||||||
|
public override Sprite LoadAsset()
|
||||||
|
{
|
||||||
|
if (LoadedAsset != null)
|
||||||
|
{
|
||||||
|
return LoadedAsset;
|
||||||
|
}
|
||||||
|
|
||||||
|
assetHolder.TryInit();
|
||||||
|
|
||||||
|
var loadedAsset = assetHolder.SubSprites.FirstOrDefault(x => x.name == name);
|
||||||
|
|
||||||
|
if (loadedAsset == null)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"INVALID ASSETS: {name}");
|
||||||
|
}
|
||||||
|
LoadedAsset = loadedAsset;
|
||||||
|
return LoadedAsset;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using HarmonyLib;
|
||||||
|
using Il2CppInterop.Runtime;
|
||||||
|
using Reactor.Utilities.Extensions;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace MiraAPI.Utilities.Assets;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A utility class for loading multiple assets from an <see cref="AssetBundle"/>.
|
||||||
|
/// </summary>
|
||||||
|
public class LoadableBundleSubAssetHolder
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="LoadableBundleSubAssetHolder"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="names">The name of the assets to pull from.</param>
|
||||||
|
/// <param name="bundle">The <see cref="AssetBundle"/> that contains the assets.</param>
|
||||||
|
public LoadableBundleSubAssetHolder(string[] names, AssetBundle bundle)
|
||||||
|
{
|
||||||
|
Bundle = bundle;
|
||||||
|
SpriteNames = names;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="LoadableBundleSubAssetHolder"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the asset.</param>
|
||||||
|
/// <param name="bundle">The <see cref="AssetBundle"/> that contains the assets.</param>
|
||||||
|
public LoadableBundleSubAssetHolder(string name, AssetBundle bundle)
|
||||||
|
{
|
||||||
|
Bundle = bundle;
|
||||||
|
SpriteNames = [name];
|
||||||
|
}
|
||||||
|
internal string[] SpriteNames = [];
|
||||||
|
internal AssetBundle Bundle;
|
||||||
|
public Sprite[] SubSprites = [];
|
||||||
|
|
||||||
|
public virtual void TryInit()
|
||||||
|
{
|
||||||
|
if (SubSprites.Length == 0)
|
||||||
|
{
|
||||||
|
var newSprites = Array.Empty<Sprite>();
|
||||||
|
foreach (var name in SpriteNames)
|
||||||
|
{
|
||||||
|
var loadedAssets = Bundle.LoadAssetWithSubAssets(name, Il2CppType.From(typeof(Sprite))).ToArray();
|
||||||
|
|
||||||
|
if (loadedAssets == null)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"INVALID ASSETS: {name}");
|
||||||
|
}
|
||||||
|
foreach (var obj in loadedAssets)
|
||||||
|
{
|
||||||
|
var img = obj.TryCast<Sprite>();
|
||||||
|
if (img != null)
|
||||||
|
{
|
||||||
|
img.DontDestroy().DontUnload();
|
||||||
|
newSprites = newSprites.AddToArray(img);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SubSprites = newSprites;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unloads an asset.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True if the asset was unloaded, false otherwise.</returns>
|
||||||
|
public bool UnloadAsset()
|
||||||
|
{
|
||||||
|
if (SubSprites.Length == 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var sprite in SubSprites)
|
||||||
|
{
|
||||||
|
sprite.DestroyImmediate();
|
||||||
|
}
|
||||||
|
SubSprites = [];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -71,8 +71,8 @@ public static class TmpSpriteUtils
|
|||||||
{
|
{
|
||||||
name = spriteName,
|
name = spriteName,
|
||||||
hashCode = TMP_TextUtilities.GetSimpleHashCode(spriteName),
|
hashCode = TMP_TextUtilities.GetSimpleHashCode(spriteName),
|
||||||
x = 0,
|
x = rect.x,
|
||||||
y = 0,
|
y = rect.y,
|
||||||
width = rect.width,
|
width = rect.width,
|
||||||
height = rect.height,
|
height = rect.height,
|
||||||
xOffset = -(rect.width / 3) + (scale - 1) * (rect.width / 2),
|
xOffset = -(rect.width / 3) + (scale - 1) * (rect.width / 2),
|
||||||
|
|||||||
Reference in new issue
Block a user