You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
816 lines
28 KiB
816 lines
28 KiB
using IVDataFormat;
|
|
using Spine;
|
|
using Spine.Unity.AttachmentTools;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.AddressableAssets;
|
|
using UnityEngine.ResourceManagement.AsyncOperations;
|
|
using UnityEngine.ResourceManagement.ResourceLocations;
|
|
using UnityEngine.U2D;
|
|
|
|
public class AddressableMgr
|
|
{
|
|
#region Path
|
|
// Resources, Adressable 등에서 사용하는 경로 모음.
|
|
private const string PathCosCloth = "coscloth/";
|
|
private const string PathCosWeapon = "cosweapon/";
|
|
|
|
public const string PathMon = "mon/{0}/{0}_SkeletonData.asset";
|
|
public const string PathBg = "bg/{0}";
|
|
public const string PathBgEffect = "bgefc/{0}";
|
|
public const string PathBgm = "bgm/{0}";
|
|
public const string PathBgmClip = "bgm/ac{0}.wav";
|
|
public const string PathPet = "pet/{0}/{0}_SkeletonData.asset";
|
|
public const string PathGuardian = "spine/Guardian/{0}/{0}_SkeletonData.asset";
|
|
|
|
private const string PBagWeapon = "wp";
|
|
private const string PBagCape = "cape";
|
|
private const string PBagHat = "hat";
|
|
private const string PBagShoes = "shoes";
|
|
private const string PBagEar = "ear";
|
|
private const string PBagNeck = "neck";
|
|
private const string PBagRing = "ring";
|
|
private const string PBagTreasure = "trs";
|
|
|
|
public const string PCosCloth = "c";
|
|
public const string PCosClothBase = "c1";
|
|
public const string PCosWeapon = "w";
|
|
public const string PCosWeaponBase = "w2";
|
|
|
|
public const string PPetInS = "in_s";
|
|
public const string PPetInL = "in_l";
|
|
public const string PPetOutlineS = "outline_s";
|
|
public const string PPetOutlineL = "outline_l";
|
|
#endregion Path
|
|
|
|
#region Init
|
|
private static bool bInit = false;
|
|
// [기본] atlasBagIcon, atlasCosIcon, atlasEnhanceIcon, atlasPetIcon, atlasPlayerIcon, atlasSkillIcon, goodsicon +
|
|
// [나머지] BASE, BG, BGM, CLOTH, IMG, EFFECT, EVENT, MON, PET, SPINE, WEAPON, AREA
|
|
// 기본 7개 나머지 12개. 어드레서블 추가시 +1
|
|
|
|
public static int I_LoadingCnt { get; private set; } = 19;
|
|
|
|
public static void Init()
|
|
{
|
|
if (bInit)
|
|
return;
|
|
bInit = true;
|
|
|
|
// 게임 전체에서 일반적으로 사용하는 리소스는 미리 다운로드.
|
|
// 추후 일부 항목은 별도 다운로드로 분리.
|
|
Addressables.DownloadDependenciesAsync("BASE").Completed += ADownBaseComp;
|
|
Addressables.DownloadDependenciesAsync("BG").Completed += ADownEtcComp;
|
|
Addressables.DownloadDependenciesAsync("BGM").Completed += ADownEtcComp;
|
|
Addressables.DownloadDependenciesAsync("CLOTH").Completed += ADownEtcComp;
|
|
Addressables.DownloadDependenciesAsync("EFFECT").Completed += ADownEtcComp;
|
|
Addressables.DownloadDependenciesAsync("EVENT").Completed += ADownEtcComp;
|
|
Addressables.DownloadDependenciesAsync("IMG").Completed += ADownEtcComp;
|
|
Addressables.DownloadDependenciesAsync("AREA").Completed += ADownEtcComp;
|
|
Addressables.DownloadDependenciesAsync("MON").Completed += ADownEtcComp;
|
|
Addressables.DownloadDependenciesAsync("PET").Completed += ADownEtcComp;
|
|
Addressables.DownloadDependenciesAsync("SPINE").Completed += ADownEtcComp;
|
|
Addressables.DownloadDependenciesAsync("WEAPON").Completed += ADownEtcComp;
|
|
}
|
|
|
|
public static bool AssetExists(object key)
|
|
{
|
|
if (Application.isPlaying)
|
|
{
|
|
foreach (var l in Addressables.ResourceLocators)
|
|
{
|
|
IList<IResourceLocation> locs;
|
|
if (l.Locate(key, null, out locs))
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
else if (Application.isEditor && !Application.isPlaying)
|
|
{
|
|
#if UNITY_EDITOR
|
|
// note: my keys are always asset file paths
|
|
return System.IO.File.Exists(System.IO.Path.Combine(Application.dataPath, (string)key));
|
|
#endif
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static bool LoadAssetAsync<T>(object key, out AsyncOperationHandle<T> op)
|
|
{
|
|
op = default;
|
|
if(bInit)
|
|
{
|
|
op = Addressables.LoadAssetAsync<T>(key);
|
|
}
|
|
return op.IsValid();
|
|
}
|
|
|
|
public static void ReleaseAsset<T>(T loadedObj) => Addressables.Release(loadedObj);
|
|
|
|
private static void ADownBaseComp(AsyncOperationHandle obj)
|
|
{
|
|
Addressables.LoadAssetAsync<SpriteAtlas>("atlasBagIcon").Completed += AInitBagIcon;
|
|
Addressables.LoadAssetAsync<SpriteAtlas>("atlasCosIcon").Completed += AInitCosIcon;
|
|
Addressables.LoadAssetAsync<SpriteAtlas>("atlasEnhanceIcon").Completed += AInitEnhanceIcon;
|
|
Addressables.LoadAssetAsync<SpriteAtlas>("atlasPetIcon").Completed += AInitPetIcon;
|
|
Addressables.LoadAssetAsync<SpriteAtlas>("atlasPlayerIcon").Completed += AInitPlayerIcon;
|
|
Addressables.LoadAssetAsync<SpriteAtlas>("atlasWeaponIcon").Completed += AInitWeaponIcon;
|
|
Addressables.LoadAssetAsync<SpriteAtlas>("atlasSkillIcon").Completed += AInitSkillIcon;
|
|
Addressables.LoadAssetAsync<SpriteAtlas>("atlasGradeIcon").Completed += AInitGradeIcon;
|
|
Addressables.LoadAssetAsync<SpriteAtlas>("atlasGradeLatterIcon").Completed += AInitGradeLatterIcon;
|
|
Addressables.LoadAssetAsync<SpriteAtlas>("atlasRelicIcon").Completed += AInitRelicIcon;
|
|
Addressables.LoadAssetAsync<SpriteAtlas>("atlasDungeonPanel").Completed += AInitDungeonPanel;
|
|
|
|
Addressables.LoadAssetAsync<StoIntSpr>("goodsicon").Completed += AInitGoodsIcon;
|
|
|
|
Addressables.Release(obj);
|
|
I_LoadingCnt--;
|
|
}
|
|
|
|
private static void ADownEtcComp(AsyncOperationHandle obj)
|
|
{
|
|
Addressables.Release(obj);
|
|
I_LoadingCnt--;
|
|
}
|
|
#endregion Init
|
|
|
|
#region General Icon
|
|
public static Sprite GetIcon(int itype, int icode)
|
|
{
|
|
int irarity = 0;
|
|
switch (itype)
|
|
{
|
|
case cGoods.TCurrency:
|
|
return GetGoodsIcon(icode);
|
|
case cGoods.TBagWeapon:
|
|
{
|
|
var gear = DataHandler.GetGearEquip(itype, icode);
|
|
return GetBagIcon(FormatString.CombineAllString(PBagWeapon, gear.rarity, "_", gear.grade));
|
|
}
|
|
case cGoods.TBagArmorCape:
|
|
{
|
|
var gear = DataHandler.GetGearEquip(itype, icode);
|
|
return GetBagIcon(FormatString.CombineAllString(PBagCape, gear.rarity, "_", gear.grade));
|
|
}
|
|
case cGoods.TBagArmorHat:
|
|
{
|
|
var gear = DataHandler.GetGearEquip(itype, icode);
|
|
return GetBagIcon(FormatString.CombineAllString(PBagHat, gear.rarity, "_", gear.grade));
|
|
}
|
|
case cGoods.TBagArmorShoes:
|
|
{
|
|
var gear = DataHandler.GetGearEquip(itype, icode);
|
|
return GetBagIcon(FormatString.CombineAllString(PBagShoes, gear.rarity, "_", gear.grade));
|
|
}
|
|
case cGoods.TBagAcceEar:
|
|
{
|
|
var gear = DataHandler.GetGearEquip(itype, icode);
|
|
return GetBagIcon(FormatString.CombineAllString(PBagEar, gear.rarity, "_", gear.grade));
|
|
}
|
|
case cGoods.TBagAcceNeck:
|
|
{
|
|
var gear = DataHandler.GetGearEquip(itype, icode);
|
|
return GetBagIcon(FormatString.CombineAllString(PBagNeck, gear.rarity, "_", gear.grade));
|
|
}
|
|
case cGoods.TBagAcceRing:
|
|
{
|
|
var gear = DataHandler.GetGearEquip(itype, icode);
|
|
return GetBagIcon(FormatString.CombineAllString(PBagRing, gear.rarity, "_", gear.grade));
|
|
}
|
|
case cGoods.TBagTreasure:
|
|
return GetBagIcon(FormatString.CombineAllString(PBagTreasure, icode.ToString()));
|
|
|
|
case cGoods.TSkillActive:
|
|
return GetSkillActiveIcon(icode);
|
|
case cGoods.TSkillPassive:
|
|
return GetSkillPassiveIcon(icode);
|
|
|
|
case cGoods.TCosCloth:
|
|
return GetCosClothIcon(icode);
|
|
case cGoods.TCosWeapon:
|
|
return GetCosWeaponIcon(icode);
|
|
|
|
case cGoods.TCosClrHair:
|
|
case cGoods.TCosClrTop:
|
|
case cGoods.TCosClrEye:
|
|
return null;
|
|
|
|
case cGoods.TPet:
|
|
return GetPetIcon(icode);
|
|
case cGoods.TPetSpirit:
|
|
if (icode < 0)
|
|
return GetGoodsIcon(1000000 + itype);
|
|
return GetPetIcon(icode);
|
|
|
|
case cGoods.TBox:
|
|
if (icode < 0)
|
|
return GetGoodsIcon(1000000 + itype);
|
|
return GetBagIcon(DataHandler.SysBoxes[icode].path);
|
|
|
|
case cGoods.TProfileIcon:
|
|
return GetPlayerIcon(icode);
|
|
}
|
|
return GetGoodsIcon(1000000 + itype);
|
|
}
|
|
|
|
public static Sprite GetIcon(int itype, int icode, int irarity)
|
|
{
|
|
switch (itype)
|
|
{
|
|
case cGoods.TCurrency:
|
|
return GetGoodsIcon(icode);
|
|
|
|
case cGoods.TBagWeapon:
|
|
return GetBagIcon(FormatString.CombineAllString(PBagWeapon, irarity.ToString()));
|
|
|
|
case cGoods.TBagArmorCape:
|
|
return GetBagIcon(FormatString.CombineAllString(PBagCape, irarity.ToString()));
|
|
|
|
case cGoods.TBagArmorHat:
|
|
return GetBagIcon(FormatString.CombineAllString(PBagHat, irarity.ToString()));
|
|
|
|
case cGoods.TBagArmorShoes:
|
|
return GetBagIcon(FormatString.CombineAllString(PBagShoes, irarity.ToString()));
|
|
|
|
case cGoods.TBagAcceEar:
|
|
return GetBagIcon(FormatString.CombineAllString(PBagEar, irarity.ToString()));
|
|
|
|
case cGoods.TBagAcceNeck:
|
|
return GetBagIcon(FormatString.CombineAllString(PBagNeck, irarity.ToString()));
|
|
|
|
case cGoods.TBagAcceRing:
|
|
return GetBagIcon(FormatString.CombineAllString(PBagRing, irarity.ToString()));
|
|
|
|
case cGoods.TBagTreasure:
|
|
return GetBagIcon(FormatString.CombineAllString(PBagTreasure, icode.ToString()));
|
|
|
|
case cGoods.TSkillActive:
|
|
return GetSkillActiveIcon(icode);
|
|
case cGoods.TSkillPassive:
|
|
return GetSkillPassiveIcon(icode);
|
|
|
|
case cGoods.TCosCloth:
|
|
return GetCosClothIcon(icode);
|
|
case cGoods.TCosWeapon:
|
|
return GetCosWeaponIcon(icode);
|
|
|
|
case cGoods.TCosClrHair:
|
|
case cGoods.TCosClrTop:
|
|
case cGoods.TCosClrEye:
|
|
return null;
|
|
|
|
case cGoods.TPet:
|
|
return GetPetIcon(icode);
|
|
case cGoods.TPetSpirit:
|
|
if (icode < 0)
|
|
return GetGoodsIcon(1000000 + itype);
|
|
return GetPetIcon(icode);
|
|
|
|
case cGoods.TBox:
|
|
if (icode < 0)
|
|
return GetGoodsIcon(1000000 + itype);
|
|
return GetBagIcon(DataHandler.SysBoxes[icode].path);
|
|
}
|
|
return GetGoodsIcon(1000000 + itype);
|
|
}
|
|
#endregion General Icon
|
|
|
|
#region Goods Icon
|
|
public static AsyncOperationHandle<StoIntSpr> handleGoodsIcons;
|
|
public static StoIntSpr goodsIcons = null;
|
|
|
|
private static void AInitGoodsIcon(AsyncOperationHandle<StoIntSpr> obj)
|
|
{
|
|
goodsIcons = obj.Result;
|
|
handleGoodsIcons = obj;
|
|
I_LoadingCnt--;
|
|
}
|
|
|
|
public static Sprite GetGoodsIcon(int key)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
if (key < 0)
|
|
return null;
|
|
if (goodsIcons.datas.ContainsKey(key))
|
|
return goodsIcons.datas[key];
|
|
return null;
|
|
}
|
|
#endregion Goods Icon
|
|
|
|
#region Bag Icon
|
|
public static AsyncOperationHandle<SpriteAtlas> handleBagIcons;
|
|
public static SpriteAtlas bagIcons = null;
|
|
|
|
private static void AInitBagIcon(AsyncOperationHandle<SpriteAtlas> obj)
|
|
{
|
|
bagIcons = obj.Result;
|
|
handleBagIcons = obj;
|
|
I_LoadingCnt--;
|
|
}
|
|
|
|
public static Sprite GetBagIcon(string strpath)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
return bagIcons.GetSprite(strpath);
|
|
}
|
|
#endregion Bag Icon
|
|
|
|
#region Pet Icon
|
|
public static AsyncOperationHandle<SpriteAtlas> handlePetIcons;
|
|
public static SpriteAtlas petIcons = null;
|
|
|
|
private static void AInitPetIcon(AsyncOperationHandle<SpriteAtlas> obj)
|
|
{
|
|
petIcons = obj.Result;
|
|
handlePetIcons = obj;
|
|
I_LoadingCnt--;
|
|
}
|
|
|
|
public static Sprite GetPetIcon(int key)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
return petIcons.GetSprite(key.ToString());
|
|
}
|
|
#endregion Pet Icon
|
|
|
|
#region GradeIcon
|
|
public static AsyncOperationHandle<SpriteAtlas> handleGradeIcons;
|
|
public static AsyncOperationHandle<SpriteAtlas> handleGradeLatterIcons;
|
|
public static SpriteAtlas GradeIcons = null;
|
|
public static SpriteAtlas GradeLatterIcons = null;
|
|
|
|
private static void AInitGradeIcon(AsyncOperationHandle<SpriteAtlas> obj)
|
|
{
|
|
GradeIcons = obj.Result;
|
|
handleGradeIcons = obj;
|
|
I_LoadingCnt--;
|
|
}
|
|
|
|
public static Sprite GetGradeIcon(int key)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
return GradeIcons.GetSprite(key.ToString());
|
|
}
|
|
|
|
private static void AInitGradeLatterIcon(AsyncOperationHandle<SpriteAtlas> obj)
|
|
{
|
|
GradeLatterIcons = obj.Result;
|
|
handleGradeLatterIcons = obj;
|
|
I_LoadingCnt--;
|
|
}
|
|
|
|
public static Sprite GetGradeLatterIcon(int key)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
return GradeLatterIcons.GetSprite(key.ToString());
|
|
}
|
|
#endregion
|
|
|
|
#region Costume Icon
|
|
public static AsyncOperationHandle<SpriteAtlas> handleCosIcons;
|
|
public static SpriteAtlas cosIcons = null;
|
|
|
|
private static void AInitCosIcon(AsyncOperationHandle<SpriteAtlas> obj)
|
|
{
|
|
cosIcons = obj.Result;
|
|
handleCosIcons = obj;
|
|
I_LoadingCnt--;
|
|
}
|
|
|
|
public static Sprite GetCosClothIcon(int key)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
return cosIcons.GetSprite(FormatString.CombineAllString(PCosCloth, key.ToString()));
|
|
}
|
|
|
|
public static Sprite GetCosWeaponIcon(int key)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
return cosIcons.GetSprite(FormatString.CombineAllString(PCosWeapon, key.ToString()));
|
|
}
|
|
#endregion Costume Icon
|
|
|
|
#region Enhance Icon
|
|
public static AsyncOperationHandle<SpriteAtlas> handleEnhanceIcons;
|
|
public static SpriteAtlas enhanceIcons = null;
|
|
|
|
private static void AInitEnhanceIcon(AsyncOperationHandle<SpriteAtlas> obj)
|
|
{
|
|
enhanceIcons = obj.Result;
|
|
handleEnhanceIcons = obj;
|
|
I_LoadingCnt--;
|
|
}
|
|
|
|
public static Sprite GetEnhanceIcon(int key)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
return enhanceIcons.GetSprite(key.ToString());
|
|
}
|
|
#endregion Enhance Icon
|
|
|
|
#region Skill Icon
|
|
public static AsyncOperationHandle<SpriteAtlas> handleSkillIcons;
|
|
public static SpriteAtlas skillIcons = null;
|
|
|
|
private static void AInitSkillIcon(AsyncOperationHandle<SpriteAtlas> obj)
|
|
{
|
|
skillIcons = obj.Result;
|
|
handleSkillIcons = obj;
|
|
I_LoadingCnt--;
|
|
}
|
|
|
|
public static Sprite GetSkillActiveIcon(int key)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
return skillIcons.GetSprite(key.ToString());
|
|
}
|
|
|
|
public static Sprite GetSkillPassiveIcon(int key)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
key += 1000;
|
|
return skillIcons.GetSprite(key.ToString());
|
|
}
|
|
|
|
public static Sprite GetSkillActiveIconS(int key)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
key += 500;
|
|
return skillIcons.GetSprite(key.ToString());
|
|
}
|
|
#endregion Skill Icon
|
|
|
|
#region Weapon Icon
|
|
public static AsyncOperationHandle<SpriteAtlas> handleWeaponIcons;
|
|
public static SpriteAtlas weaponIcons = null;
|
|
|
|
private static void AInitWeaponIcon(AsyncOperationHandle<SpriteAtlas> obj)
|
|
{
|
|
weaponIcons = obj.Result;
|
|
handleWeaponIcons = obj;
|
|
I_LoadingCnt--;
|
|
}
|
|
|
|
public static Sprite GetWeaponIcon(int key)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
return weaponIcons.GetSprite(key.ToString());
|
|
}
|
|
#endregion Weapon Icon
|
|
|
|
#region Player Icon
|
|
public static AsyncOperationHandle<SpriteAtlas> handlePlayerIcons;
|
|
public static SpriteAtlas playerIcons = null;
|
|
|
|
private static void AInitPlayerIcon(AsyncOperationHandle<SpriteAtlas> obj)
|
|
{
|
|
playerIcons = obj.Result;
|
|
handlePlayerIcons = obj;
|
|
I_LoadingCnt--;
|
|
}
|
|
|
|
public static Sprite GetPlayerIcon(int key)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
return playerIcons.GetSprite(key.ToString());
|
|
}
|
|
#endregion Player Icon
|
|
|
|
#region Costume Cloth
|
|
private static Dictionary<int, jAddrCnt<Texture2D>> dicClothSpine = new Dictionary<int, jAddrCnt<Texture2D>>();
|
|
private static List<KeyValuePair<int, System.Action<Texture2D>>> clothSpineCompList = new List<KeyValuePair<int, System.Action<Texture2D>>>();
|
|
|
|
public static string GetCosInfo(int key)
|
|
{
|
|
if (key < 0)
|
|
return "null";
|
|
if (!dicClothSpine.ContainsKey(key))
|
|
return "Not Contain";
|
|
return FormatString.CombineAllString("addr loading ", dicClothSpine[key].isLoading.ToString(), ", count ", dicClothSpine[key].loadCnt.ToString(), ", valid ", dicClothSpine[key].handle.IsValid().ToString());
|
|
}
|
|
|
|
// 의상 리소스 가져오기.
|
|
public static void LoadClothSpine(int key, System.Action<Texture2D> actioncomp)
|
|
{
|
|
if (key < 0) return;
|
|
if (key == 0) key = 1;
|
|
|
|
// 목록에 있는 항목.
|
|
if (dicClothSpine.ContainsKey(key))
|
|
{
|
|
// 로딩중일 경우. 로딩 완료 후 작업 목록에 추가.
|
|
if (dicClothSpine[key].isLoading)
|
|
{
|
|
clothSpineCompList.Add(new KeyValuePair<int, System.Action<Texture2D>>(key, actioncomp));
|
|
return;
|
|
}
|
|
|
|
// 로드 된 항목인 경우. 작업 실행.
|
|
dicClothSpine[key].loadCnt++;
|
|
actioncomp(dicClothSpine[key].handle.Result);
|
|
return;
|
|
}
|
|
|
|
// 목록에 없는 항목일 경우 추가.
|
|
dicClothSpine.Add(key, new jAddrCnt<Texture2D>());
|
|
clothSpineCompList.Add(new KeyValuePair<int, System.Action<Texture2D>>(key, actioncomp));
|
|
// 리소스 로드.
|
|
Addressables.LoadAssetAsync<Texture2D>(FormatString.CombineAllString(PathCosCloth, DataHandler.GetCosClothPath(key))).Completed += ALoadClothComp;
|
|
}
|
|
|
|
// 의상 리소스 가져오기. 로드 카운트 증가 안 시킴.
|
|
public static void LoadClothSpineSoon(int key, System.Action<Texture2D> actioncomp)
|
|
{
|
|
if (key < 0)
|
|
return;
|
|
//Debug.LogWarning("ADDR LoadClothSpine [" + key + "]");
|
|
|
|
// 목록에 있는 항목.
|
|
if (!dicClothSpine.ContainsKey(key))
|
|
return;
|
|
|
|
// 로딩중일 경우.
|
|
if (dicClothSpine[key].isLoading)
|
|
return;
|
|
|
|
// 로드 된 항목인 경우. 작업 실행.
|
|
actioncomp(dicClothSpine[key].handle.Result);
|
|
}
|
|
|
|
// 의상 리소스 로드 카운트 증가.
|
|
public static void LoadClothAdd(int key)
|
|
{
|
|
if (dicClothSpine.ContainsKey(key))
|
|
{
|
|
dicClothSpine[key].loadCnt++;
|
|
//GameUIMgr.SPrintTestLog(FormatString.CombineAllString("CountAdd [", key.ToString(), "] ", dicClothSpine[key].loadCnt.ToString()));
|
|
}
|
|
}
|
|
|
|
// 의상 리소스 로드 완료.
|
|
private static void ALoadClothComp(AsyncOperationHandle<Texture2D> obj)
|
|
{
|
|
int key = int.Parse(obj.Result.name.Replace("c", ""));
|
|
if (dicClothSpine.ContainsKey(key))
|
|
{
|
|
dicClothSpine[key].handle = obj;
|
|
dicClothSpine[key].isLoading = false;
|
|
|
|
// 작업 목록 확인하여 해당하는 항목의 작업 실행.
|
|
for (int k = clothSpineCompList.Count - 1; k >= 0; k--)
|
|
{
|
|
if (clothSpineCompList[k].Key == key)
|
|
{
|
|
dicClothSpine[key].loadCnt++;
|
|
clothSpineCompList[k].Value(obj.Result);
|
|
clothSpineCompList.RemoveAt(k);
|
|
}
|
|
}
|
|
//GameUIMgr.SPrintTestLog(FormatString.CombineAllString("Comp [", key.ToString(), "] ", dicClothSpine[key].loadCnt.ToString()));
|
|
}
|
|
|
|
}
|
|
|
|
// 의상 리소스 해제.
|
|
public static void ReleaseClothSpine(int key)
|
|
{
|
|
// 목록에 있는 항목.
|
|
if (dicClothSpine.ContainsKey(key))
|
|
{
|
|
dicClothSpine[key].loadCnt--;
|
|
//GameUIMgr.SPrintTestLog(FormatString.CombineAllString("Release [", key.ToString(), "] ", dicClothSpine[key].loadCnt.ToString(), " : ", dicClothSpine[key].handle.IsValid().ToString(), " :: ", dicClothSpine[key].isLoading.ToString()));
|
|
if (dicClothSpine[key].isLoading)
|
|
return;
|
|
if (dicClothSpine[key].loadCnt <= 0)
|
|
{
|
|
if (dicClothSpine[key].handle.IsValid())
|
|
Addressables.Release(dicClothSpine[key].handle);
|
|
dicClothSpine.Remove(key);
|
|
SAddUnload();
|
|
}
|
|
}
|
|
}
|
|
#endregion Costume Cloth
|
|
|
|
#region Costume Weapon
|
|
private const string SkinName = "default";
|
|
private const string SlotNameWeapon = "weapon";
|
|
private const string AtchNameWeapon = "weapon";
|
|
private static int iSlotIndexWeapon;
|
|
private static Material matWeaponBase = null;
|
|
private static Attachment atchWeaponBase = null;
|
|
|
|
private static Dictionary<int, jAddrCnt<Sprite>> dicWeaponSpine = new Dictionary<int, jAddrCnt<Sprite>>();
|
|
private static Dictionary<int, Skin> dicWeaponSkin = new Dictionary<int, Skin>();
|
|
private static List<KeyValuePair<int, System.Action<Skin>>> weaponSpineCompList = new List<KeyValuePair<int, System.Action<Skin>>>();
|
|
|
|
// 스킨 생성 필요 정보 세팅.
|
|
public static void InitWeaponSkin(Skeleton skeleton, Material mat)
|
|
{
|
|
matWeaponBase = mat;
|
|
Skin skintemp = skeleton.Data.FindSkin(SkinName);
|
|
iSlotIndexWeapon = skeleton.Data.FindSlot(SlotNameWeapon).Index;
|
|
atchWeaponBase = skintemp.GetAttachment(iSlotIndexWeapon, AtchNameWeapon);
|
|
}
|
|
|
|
// 무기 리소스 가져오기.
|
|
public static void LoadWeaponSpine(int key, System.Action<Skin> actioncomp)
|
|
{
|
|
if (key < 0) return;
|
|
if (key == 0) key = 1;
|
|
|
|
// 목록에 있는 항목.
|
|
if (dicWeaponSpine.ContainsKey(key))
|
|
{
|
|
// 로딩중일 경우. 로딩 완료 후 작업 목록에 추가.
|
|
if (dicWeaponSpine[key].isLoading)
|
|
{
|
|
weaponSpineCompList.Add(new KeyValuePair<int, System.Action<Skin>>(key, actioncomp));
|
|
return;
|
|
}
|
|
|
|
// 로드 된 항목인 경우. 작업 실행.
|
|
dicWeaponSpine[key].loadCnt++;
|
|
actioncomp(dicWeaponSkin[key]);
|
|
return;
|
|
}
|
|
|
|
// 목록에 없는 항목일 경우 추가.
|
|
dicWeaponSpine.Add(key, new jAddrCnt<Sprite>());
|
|
dicWeaponSkin.Add(key, null);
|
|
weaponSpineCompList.Add(new KeyValuePair<int, System.Action<Skin>>(key, actioncomp));
|
|
//리소스 로드.
|
|
Addressables.LoadAssetAsync<Sprite>(FormatString.CombineAllString(PathCosWeapon, DataHandler.GetCosWeaponPath(key))).Completed += ALoadWeaponComp;
|
|
}
|
|
|
|
// 무기 리소스 로드 카운트 증가.
|
|
public static void LoadWeaponAdd(int key)
|
|
{
|
|
if (dicWeaponSpine.ContainsKey(key))
|
|
{
|
|
dicWeaponSpine[key].loadCnt++;
|
|
//Debug.LogWarning("ADDR LoadWeaponAdd [" + key + "] " + dicWeaponSpine[key].loadCnt);
|
|
}
|
|
}
|
|
|
|
// 무기 리소스 로드 완료.
|
|
private static void ALoadWeaponComp(AsyncOperationHandle<Sprite> obj)
|
|
{
|
|
int key = int.Parse(obj.Result.name.Replace("w", ""));
|
|
if (dicWeaponSpine.ContainsKey(key))
|
|
{
|
|
dicWeaponSkin[key] = CreateWeaponSkin(obj.Result);
|
|
dicWeaponSpine[key].handle = obj;
|
|
dicWeaponSpine[key].isLoading = false;
|
|
|
|
// 작업 목록 확인하여 해당하는 항목의 작업 실행.
|
|
for (int k = weaponSpineCompList.Count - 1; k >= 0; k--)
|
|
{
|
|
if (weaponSpineCompList[k].Key == key)
|
|
{
|
|
dicWeaponSpine[key].loadCnt++;
|
|
weaponSpineCompList[k].Value(dicWeaponSkin[key]);
|
|
weaponSpineCompList.RemoveAt(k);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 무기 리소스 해제.
|
|
public static void ReleaseWeaponSpine(int key)
|
|
{
|
|
// 목록에 있는 항목.
|
|
if (dicWeaponSpine.ContainsKey(key))
|
|
{
|
|
dicWeaponSpine[key].loadCnt--;
|
|
Debug.LogWarning("ADDR ReleaseWeaponSpine [" + key + "] " + dicWeaponSpine[key].loadCnt);
|
|
if (dicWeaponSpine[key].isLoading)
|
|
return;
|
|
if (dicWeaponSpine[key].loadCnt <= 0)
|
|
{
|
|
dicWeaponSkin.Remove(key);
|
|
if (dicWeaponSpine[key].handle.IsValid())
|
|
Addressables.Release(dicWeaponSpine[key].handle);
|
|
dicWeaponSpine.Remove(key);
|
|
SAddUnload();
|
|
}
|
|
}
|
|
}
|
|
|
|
// 스킨 생성해서 리턴.
|
|
private static Skin CreateWeaponSkin(Sprite sprwp)
|
|
{
|
|
Skin skin = new Skin("customskin");
|
|
Attachment acthwp = atchWeaponBase.GetRemappedClone(sprwp, matWeaponBase, pivotShiftsMeshUVCoords: false);
|
|
if (acthwp != null)
|
|
skin.SetAttachment(iSlotIndexWeapon, AtchNameWeapon, acthwp);
|
|
else
|
|
skin.SetAttachment(iSlotIndexWeapon, AtchNameWeapon, atchWeaponBase);
|
|
AtlasUtilities.ClearCache();
|
|
return skin;
|
|
}
|
|
#endregion Costume Weapon
|
|
|
|
#region Relic
|
|
public static AsyncOperationHandle<SpriteAtlas> handleRelicIcons;
|
|
public static SpriteAtlas RelicIcons = null;
|
|
|
|
private static void AInitRelicIcon(AsyncOperationHandle<SpriteAtlas> obj)
|
|
{
|
|
RelicIcons = obj.Result;
|
|
handleRelicIcons = obj;
|
|
I_LoadingCnt--;
|
|
}
|
|
|
|
public static Sprite GetRelicIcon(int key)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
return RelicIcons.GetSprite(key.ToString());
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Relic
|
|
public static AsyncOperationHandle<SpriteAtlas> handleDungeonPanel;
|
|
public static SpriteAtlas DungeonPanel = null;
|
|
|
|
private static void AInitDungeonPanel(AsyncOperationHandle<SpriteAtlas> obj)
|
|
{
|
|
DungeonPanel = obj.Result;
|
|
handleDungeonPanel = obj;
|
|
I_LoadingCnt--;
|
|
}
|
|
|
|
public static Sprite GetDungeonPanel(int key)
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (I_LoadingCnt > 0)
|
|
return null;
|
|
#endif
|
|
return DungeonPanel.GetSprite(key.ToString());
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Unload
|
|
static readonly int _unloadMax = 30;
|
|
private static int I_UnloadCount = 0;
|
|
|
|
public static void SAddUnload()
|
|
{
|
|
if (I_UnloadCount++ >= _unloadMax)
|
|
{
|
|
I_UnloadCount = 0;
|
|
Resources.UnloadUnusedAssets();
|
|
}
|
|
}
|
|
|
|
public static void SForceUnload()
|
|
{
|
|
I_UnloadCount = 0;
|
|
Resources.UnloadUnusedAssets();
|
|
}
|
|
#endregion Unload
|
|
}
|