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.
 
 
 
 
 
 

570 lines
18 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 등에서 사용하는 경로 모음.
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("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;
}
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 type, int code)
{
switch (type)
{
case cGoods.TCurrency:
return GetGoodsIcon(code);
case cGoods.TBagWeapon:
{
var gear = DataHandler.GetGearEquip(type, code);
return GetBagIcon(FormatString.CombineAllString(PBagWeapon, gear.rarity, "_", gear.grade));
}
case cGoods.TBagArmorCape:
{
var gear = DataHandler.GetGearEquip(type, code);
return GetBagIcon(FormatString.CombineAllString(PBagCape, gear.rarity, "_", gear.grade));
}
case cGoods.TBagArmorHat:
{
var gear = DataHandler.GetGearEquip(type, code);
return GetBagIcon(FormatString.CombineAllString(PBagHat, gear.rarity, "_", gear.grade));
}
case cGoods.TBagArmorShoes:
{
var gear = DataHandler.GetGearEquip(type, code);
return GetBagIcon(FormatString.CombineAllString(PBagShoes, gear.rarity, "_", gear.grade));
}
case cGoods.TBagAcceEar:
{
var gear = DataHandler.GetGearEquip(type, code);
return GetBagIcon(FormatString.CombineAllString(PBagEar, gear.rarity, "_", gear.grade));
}
case cGoods.TBagAcceNeck:
{
var gear = DataHandler.GetGearEquip(type, code);
return GetBagIcon(FormatString.CombineAllString(PBagNeck, gear.rarity, "_", gear.grade));
}
case cGoods.TBagAcceRing:
{
var gear = DataHandler.GetGearEquip(type, code);
return GetBagIcon(FormatString.CombineAllString(PBagRing, gear.rarity, "_", gear.grade));
}
case cGoods.TBagTreasure:
return GetBagIcon(FormatString.CombineAllString(PBagTreasure, code.ToString()));
case cGoods.TSkillActive:
return GetSkillActiveIcon(code);
case cGoods.TSkillPassive:
return GetSkillPassiveIcon(code);
case cGoods.TCosCloth:
return GetCosClothIcon(code);
case cGoods.TCosWeapon:
return GetCosWeaponIcon(code);
case cGoods.TPet:
return GetPetIcon(code);
case cGoods.TPetSpirit:
if (code < 0)
return GetGoodsIcon(1000000 + type);
return GetPetIcon(code);
case cGoods.TBox:
if (code < 0)
return GetGoodsIcon(1000000 + type);
return GetBagIcon(DataHandler.SysBoxes[code].path);
case cGoods.TProfileIcon:
return GetPlayerIcon(code);
}
return GetGoodsIcon(1000000 + type);
}
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 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
}