Forest_Client/Forest/Assets/Scripts/Gameplay/Manager/GfxManager.cs

169 lines
4.5 KiB
C#

using System;
using PhxhSDK;
using UnityEngine;
using Framework.UI;
using System.Collections;
using Framework.Constants;
using Cysharp.Threading.Tasks;
using System.Collections.Generic;
public class GfxManager : SingletonMono<GfxManager>, IInitable
{
private Dictionary<string, GameObject> gfxDic;
public void Init()
{
gfxDic = new Dictionary<string, GameObject>();
}
public void ShowGfxOnce(ParticleSystem particle, GameObject gfx, Action callBack = null)
{
if (particle == null || gfx == null)
return;
gfx.SetActive(true);
particle.Play();
CoroutineHandler.Instance.StartCoroutine(CheckParticleSystem(particle, gfx, callBack));
}
private IEnumerator CheckParticleSystem(ParticleSystem particle, GameObject gfx, Action callBack)
{
while (particle && particle.isPlaying)
{
yield return null;
}
if (particle && gfx)
{
gfx.SetActive(false);
particle.Stop();
}
callBack?.Invoke();
}
public async UniTask<GameObject> LoadGfx(string gfxName, bool show = false)
{
try
{
if (gfxDic.TryGetValue(gfxName, out var gfx) && gfx != null)
{
gfx.SetActive(true);
return gfx;
}
await PreLoadGfx(gfxName, show);
return gfxDic[gfxName];
}
catch (Exception e)
{
DebugUtil.LogError("GfxManager.LoadGfx gfx:[{0}], Error: {1}", gfxName, e);
return null;
}
}
public async UniTask<GameObject> PreLoadGfx(string gfxName, bool show = false, bool inUI = false)
{
try
{
if (gfxDic == null)
gfxDic = new Dictionary<string, GameObject>();
if (!gfxDic.ContainsKey(gfxName))
{
var gfx = await AssetManager.Instance.LoadAssetAsync<GameObject>(string.Format(PathConstants.GfxPath,
gfxName));
var root = inUI ? UIRoot.Instance.root.transform : UIRoot.Instance.rootGfx.transform;
var gfxObj = Instantiate(gfx, root);
gfxObj.SetActive(show);
gfxObj.name = gfx.name;
gfxDic.Add(gfxName, gfxObj);
return gfxObj;
}
return null;
}
catch (Exception e)
{
DebugUtil.LogError("GfxManager.PreLoadGfx gfx:[{0}], Error: {1}", gfxName, e);
return null;
}
}
public void ReturnGfxObj(GameObject obj, bool onDestroy = false)
{
try
{
if (gfxDic == null)
return;
string objName = obj.name;
if (gfxDic.ContainsKey(objName))
{
obj.SetActive(false);
if (onDestroy)
{
UnloadGfx(objName);
Destroy(obj);
gfxDic.Remove(objName);
}
}
else
{
Destroy(obj);
DebugUtil.LogError("找不到对应的特效, 摧毁该物体: {0}", objName);
}
}
catch (Exception e)
{
DebugUtil.LogError("GfxManager.ReturnGfxObj gfx:[{0}], Error: {1}", obj.name, e);
}
}
public void ReturnGfxObj(string objName, bool onDestroy = false)
{
try
{
if (gfxDic == null)
return;
if (gfxDic.TryGetValue(objName, out var obj))
{
obj.SetActive(false);
if (onDestroy)
{
UnloadGfx(objName);
Destroy(obj);
gfxDic.Remove(objName);
}
}
else
{
DebugUtil.LogError("找不到对应的特效: {0}", objName);
}
}
catch (Exception e)
{
DebugUtil.LogError("GfxManager.ReturnGfxObj gfx:[{0}], Error: {1}", objName, e);
}
}
private void UnloadGfx(string gfxName)
{
if (gfxDic.TryGetValue(gfxName, out var gfx))
{
AssetManager.Instance.Unload(string.Format(PathConstants.GfxPath, gfxName));
}
}
public void Release()
{
foreach (var gfx in gfxDic)
{
if (gfx.Value != null)
{
DestroyImmediate(gfx.Value);
}
}
gfxDic = null;
}
}