Commit e8170cdb authored by Senator John's avatar Senator John 💬

Merge branch 'patch' into 'master'

Bug Fix: Fix appearance frame bundle race on duel start

See merge request !33
parents d20b6d9e ec3a1096
...@@ -19,7 +19,9 @@ namespace MDPro3 ...@@ -19,7 +19,9 @@ namespace MDPro3
public static Dictionary<string, GameObject> cachedAB = new(); public static Dictionary<string, GameObject> cachedAB = new();
public static Dictionary<string, GameObject> cachedABFolder = new(); public static Dictionary<string, GameObject> cachedABFolder = new();
public static Dictionary<string, Material> cachedPMat = new(); public static Dictionary<string, Material> cachedPMat = new();
public static Dictionary<string, Material> cachedFrameMat = new();
private static readonly SemaphoreSlim protectorSemaphoreSlim = new(1, 1); private static readonly SemaphoreSlim protectorSemaphoreSlim = new(1, 1);
private static readonly SemaphoreSlim frameSemaphoreSlim = new(1, 1);
public static async UniTask<AssetBundle> CacheFromFileAsync(string path) public static async UniTask<AssetBundle> CacheFromFileAsync(string path)
{ {
...@@ -386,11 +388,41 @@ namespace MDPro3 ...@@ -386,11 +388,41 @@ namespace MDPro3
if (code == Items.CODE_RANDOM.ToString()) if (code == Items.CODE_RANDOM.ToString())
code = Items.lastRandomFrameID; code = Items.lastRandomFrameID;
var ab = await AssetBundle.LoadFromFileAsync(Program.root + "MasterDuel/Frame/ProfileFrameMat" + code); await frameSemaphoreSlim.WaitAsync();
var material = ab.LoadAsset<Material>("ProfileFrameMat" + code);
ab.Unload(false); try
TextureManager.ChangeProfileFrameMaterialWrapMode(material); {
return material; if (cachedFrameMat.TryGetValue(code, out var cachedMaterial))
if (cachedMaterial != null)
return new Material(cachedMaterial);
var ab = await AssetBundle.LoadFromFileAsync(Program.root + "MasterDuel/Frame/ProfileFrameMat" + code);
if (ab == null)
return null;
try
{
var material = ab.LoadAsset<Material>("ProfileFrameMat" + code);
if (material == null)
return null;
TextureManager.ChangeProfileFrameMaterialWrapMode(material);
if (cachedFrameMat.TryGetValue(code, out cachedMaterial) && cachedMaterial != null)
return new Material(cachedMaterial);
cachedFrameMat[code] = material;
return new Material(material);
}
finally
{
ab.Unload(false);
}
}
finally
{
frameSemaphoreSlim.Release();
}
} }
public static async UniTask<Material> LoadMaterialAsync(string path, CancellationToken token) public static async UniTask<Material> LoadMaterialAsync(string path, CancellationToken token)
......
...@@ -9,6 +9,7 @@ using MDPro3.UI; ...@@ -9,6 +9,7 @@ using MDPro3.UI;
using TMPro; using TMPro;
using UnityEngine.EventSystems; using UnityEngine.EventSystems;
using System.IO; using System.IO;
using System.Threading.Tasks;
using MDPro3.Duel.YGOSharp; using MDPro3.Duel.YGOSharp;
using MDPro3.UI.ServantUI; using MDPro3.UI.ServantUI;
using Cysharp.Threading.Tasks; using Cysharp.Threading.Tasks;
...@@ -74,6 +75,10 @@ namespace MDPro3.Servant ...@@ -74,6 +75,10 @@ namespace MDPro3.Servant
#endregion #endregion
private const string FaceFrameMaterialCode = "1030001";
private static readonly object loadSettingAssetsLock = new();
private static Task loadSettingAssetsTask;
public enum Condition public enum Condition
{ {
Duel, Duel,
...@@ -182,11 +187,30 @@ namespace MDPro3.Servant ...@@ -182,11 +187,30 @@ namespace MDPro3.Servant
public static bool loaded; public static bool loaded;
public async UniTask LoadSettingAssets() public async UniTask LoadSettingAssets()
{ {
loaded = false; Task taskToAwait;
lock (loadSettingAssetsLock)
{
if (loadSettingAssetsTask == null || loadSettingAssetsTask.IsCompleted)
{
loaded = false;
loadSettingAssetsTask = LoadSettingAssetsCore().AsTask();
}
taskToAwait = loadSettingAssetsTask;
}
await taskToAwait;
}
private static void ApplyFrameTexture(Material material, Sprite sprite)
{
if (material != null && sprite != null)
material.SetTexture("_ProfileFrameTex", sprite.texture);
}
var ab = await AssetBundle.LoadFromFileAsync(Program.root + "MasterDuel/Frame/ProfileFrameMat1030001"); private async UniTask LoadSettingAssetsCore()
matForFace = ab.LoadAsset<Material>("ProfileFrameMat1030001"); {
ab.Unload(false); matForFace = await ABLoader.LoadFrameMaterial(FaceFrameMaterialCode);
#region Face #region Face
duelFace0 = await Program.items.LoadConcreteItemIconAsync(Config.Get("DuelFace0", Program.items.faces[0].id.ToString()), Items.ItemType.Face, 0); duelFace0 = await Program.items.LoadConcreteItemIconAsync(Config.Get("DuelFace0", Program.items.faces[0].id.ToString()), Items.ItemType.Face, 0);
...@@ -210,51 +234,51 @@ namespace MDPro3.Servant ...@@ -210,51 +234,51 @@ namespace MDPro3.Servant
var duelFrame0 = await Program.items.LoadConcreteItemIconAsync(Config.Get("DuelFrame0", Program.items.frames[0].id.ToString()), Items.ItemType.Frame); var duelFrame0 = await Program.items.LoadConcreteItemIconAsync(Config.Get("DuelFrame0", Program.items.frames[0].id.ToString()), Items.ItemType.Frame);
duelFrameMat0 = await ABLoader.LoadFrameMaterial(Config.Get("DuelFrame0", Program.items.frames[0].id.ToString())); duelFrameMat0 = await ABLoader.LoadFrameMaterial(Config.Get("DuelFrame0", Program.items.frames[0].id.ToString()));
duelFrameMat0.SetTexture("_ProfileFrameTex", duelFrame0.texture); ApplyFrameTexture(duelFrameMat0, duelFrame0);
var duelFrame1 = await Program.items.LoadConcreteItemIconAsync(Config.Get("DuelFrame1", Program.items.frames[0].id.ToString()), Items.ItemType.Frame); var duelFrame1 = await Program.items.LoadConcreteItemIconAsync(Config.Get("DuelFrame1", Program.items.frames[0].id.ToString()), Items.ItemType.Frame);
duelFrameMat1 = await ABLoader.LoadFrameMaterial(Config.Get("DuelFrame1", Program.items.frames[0].id.ToString())); duelFrameMat1 = await ABLoader.LoadFrameMaterial(Config.Get("DuelFrame1", Program.items.frames[0].id.ToString()));
duelFrameMat1.SetTexture("_ProfileFrameTex", duelFrame1.texture); ApplyFrameTexture(duelFrameMat1, duelFrame1);
var duelFrame0Tag = await Program.items.LoadConcreteItemIconAsync(Config.Get("DuelFrame0Tag", Program.items.frames[0].id.ToString()), Items.ItemType.Frame); var duelFrame0Tag = await Program.items.LoadConcreteItemIconAsync(Config.Get("DuelFrame0Tag", Program.items.frames[0].id.ToString()), Items.ItemType.Frame);
duelFrameMat0Tag = await ABLoader.LoadFrameMaterial(Config.Get("DuelFrame0Tag", Program.items.frames[0].id.ToString())); duelFrameMat0Tag = await ABLoader.LoadFrameMaterial(Config.Get("DuelFrame0Tag", Program.items.frames[0].id.ToString()));
duelFrameMat0Tag.SetTexture("_ProfileFrameTex", duelFrame0Tag.texture); ApplyFrameTexture(duelFrameMat0Tag, duelFrame0Tag);
var duelFrame1Tag = await Program.items.LoadConcreteItemIconAsync(Config.Get("DuelFrame1Tag", Program.items.frames[0].id.ToString()), Items.ItemType.Frame); var duelFrame1Tag = await Program.items.LoadConcreteItemIconAsync(Config.Get("DuelFrame1Tag", Program.items.frames[0].id.ToString()), Items.ItemType.Frame);
duelFrameMat1Tag = await ABLoader.LoadFrameMaterial(Config.Get("DuelFrame1Tag", Program.items.frames[0].id.ToString())); duelFrameMat1Tag = await ABLoader.LoadFrameMaterial(Config.Get("DuelFrame1Tag", Program.items.frames[0].id.ToString()));
duelFrameMat1Tag.SetTexture("_ProfileFrameTex", duelFrame1Tag.texture); ApplyFrameTexture(duelFrameMat1Tag, duelFrame1Tag);
var watchFrame0 = await Program.items.LoadConcreteItemIconAsync(Config.Get("WatchFrame0", Program.items.frames[0].id.ToString()), Items.ItemType.Frame); var watchFrame0 = await Program.items.LoadConcreteItemIconAsync(Config.Get("WatchFrame0", Program.items.frames[0].id.ToString()), Items.ItemType.Frame);
watchFrameMat0 = await ABLoader.LoadFrameMaterial(Config.Get("WatchFrame0", Program.items.frames[0].id.ToString())); watchFrameMat0 = await ABLoader.LoadFrameMaterial(Config.Get("WatchFrame0", Program.items.frames[0].id.ToString()));
watchFrameMat0.SetTexture("_ProfileFrameTex", watchFrame0.texture); ApplyFrameTexture(watchFrameMat0, watchFrame0);
var watchFrame1 = await Program.items.LoadConcreteItemIconAsync(Config.Get("WatchFrame1", Program.items.frames[0].id.ToString()), Items.ItemType.Frame); var watchFrame1 = await Program.items.LoadConcreteItemIconAsync(Config.Get("WatchFrame1", Program.items.frames[0].id.ToString()), Items.ItemType.Frame);
watchFrameMat1 = await ABLoader.LoadFrameMaterial(Config.Get("WatchFrame1", Program.items.frames[0].id.ToString())); watchFrameMat1 = await ABLoader.LoadFrameMaterial(Config.Get("WatchFrame1", Program.items.frames[0].id.ToString()));
watchFrameMat1.SetTexture("_ProfileFrameTex", watchFrame1.texture); ApplyFrameTexture(watchFrameMat1, watchFrame1);
var watchFrame0Tag = await Program.items.LoadConcreteItemIconAsync(Config.Get("WatchFrame0Tag", Program.items.frames[0].id.ToString()), Items.ItemType.Frame); var watchFrame0Tag = await Program.items.LoadConcreteItemIconAsync(Config.Get("WatchFrame0Tag", Program.items.frames[0].id.ToString()), Items.ItemType.Frame);
watchFrameMat0Tag = await ABLoader.LoadFrameMaterial(Config.Get("WatchFrame0Tag", Program.items.frames[0].id.ToString())); watchFrameMat0Tag = await ABLoader.LoadFrameMaterial(Config.Get("WatchFrame0Tag", Program.items.frames[0].id.ToString()));
watchFrameMat0Tag.SetTexture("_ProfileFrameTex", watchFrame0Tag.texture); ApplyFrameTexture(watchFrameMat0Tag, watchFrame0Tag);
var watchFrame1Tag = await Program.items.LoadConcreteItemIconAsync(Config.Get("WatchFrame1Tag", Program.items.frames[0].id.ToString()), Items.ItemType.Frame); var watchFrame1Tag = await Program.items.LoadConcreteItemIconAsync(Config.Get("WatchFrame1Tag", Program.items.frames[0].id.ToString()), Items.ItemType.Frame);
watchFrameMat1Tag = await ABLoader.LoadFrameMaterial(Config.Get("WatchFrame1Tag", Program.items.frames[0].id.ToString())); watchFrameMat1Tag = await ABLoader.LoadFrameMaterial(Config.Get("WatchFrame1Tag", Program.items.frames[0].id.ToString()));
watchFrameMat1Tag.SetTexture("_ProfileFrameTex", watchFrame1Tag.texture); ApplyFrameTexture(watchFrameMat1Tag, watchFrame1Tag);
var replayFrame0 = await Program.items.LoadConcreteItemIconAsync(Config.Get("ReplayFrame0", Program.items.frames[0].id.ToString()), Items.ItemType.Frame); var replayFrame0 = await Program.items.LoadConcreteItemIconAsync(Config.Get("ReplayFrame0", Program.items.frames[0].id.ToString()), Items.ItemType.Frame);
replayFrameMat0 = await ABLoader.LoadFrameMaterial(Config.Get("ReplayFrame0", Program.items.frames[0].id.ToString())); replayFrameMat0 = await ABLoader.LoadFrameMaterial(Config.Get("ReplayFrame0", Program.items.frames[0].id.ToString()));
replayFrameMat0.SetTexture("_ProfileFrameTex", replayFrame0.texture); ApplyFrameTexture(replayFrameMat0, replayFrame0);
var replayFrame1 = await Program.items.LoadConcreteItemIconAsync(Config.Get("ReplayFrame1", Program.items.frames[0].id.ToString()), Items.ItemType.Frame); var replayFrame1 = await Program.items.LoadConcreteItemIconAsync(Config.Get("ReplayFrame1", Program.items.frames[0].id.ToString()), Items.ItemType.Frame);
replayFrameMat1 = await ABLoader.LoadFrameMaterial(Config.Get("ReplayFrame1", Program.items.frames[0].id.ToString())); replayFrameMat1 = await ABLoader.LoadFrameMaterial(Config.Get("ReplayFrame1", Program.items.frames[0].id.ToString()));
replayFrameMat1.SetTexture("_ProfileFrameTex", replayFrame1.texture); ApplyFrameTexture(replayFrameMat1, replayFrame1);
var replayFrame0Tag = await Program.items.LoadConcreteItemIconAsync(Config.Get("ReplayFrame0Tag", Program.items.frames[0].id.ToString()), Items.ItemType.Frame); var replayFrame0Tag = await Program.items.LoadConcreteItemIconAsync(Config.Get("ReplayFrame0Tag", Program.items.frames[0].id.ToString()), Items.ItemType.Frame);
replayFrameMat0Tag = await ABLoader.LoadFrameMaterial(Config.Get("ReplayFrame0Tag", Program.items.frames[0].id.ToString())); replayFrameMat0Tag = await ABLoader.LoadFrameMaterial(Config.Get("ReplayFrame0Tag", Program.items.frames[0].id.ToString()));
replayFrameMat0Tag.SetTexture("_ProfileFrameTex", replayFrame0Tag.texture); ApplyFrameTexture(replayFrameMat0Tag, replayFrame0Tag);
var replayFrame1Tag = await Program.items.LoadConcreteItemIconAsync(Config.Get("ReplayFrame1Tag", Program.items.frames[0].id.ToString()), Items.ItemType.Frame); var replayFrame1Tag = await Program.items.LoadConcreteItemIconAsync(Config.Get("ReplayFrame1Tag", Program.items.frames[0].id.ToString()), Items.ItemType.Frame);
replayFrameMat1Tag = await ABLoader.LoadFrameMaterial(Config.Get("ReplayFrame1Tag", Program.items.frames[0].id.ToString())); replayFrameMat1Tag = await ABLoader.LoadFrameMaterial(Config.Get("ReplayFrame1Tag", Program.items.frames[0].id.ToString()));
replayFrameMat1Tag.SetTexture("_ProfileFrameTex", replayFrame1Tag.texture); ApplyFrameTexture(replayFrameMat1Tag, replayFrame1Tag);
#endregion #endregion
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment