using UnityEngine; using System.Collections.Generic; using System; using System.Collections; public class SFXPlayUtility : SingletonMonobehaviour { private Dictionary> m_PoolDict = new Dictionary>(); public SFXController PlayEffectAsync(int id, Transform parent, float scale = 1) { var config = EffectConfig.Get(id); var bundleName = StringUtility.Contact(ResourcesPath.EFFECT_Folder_Name, config.packageName); if (!AssetSource.isUseAssetBundle || AssetBundleUtility.Instance.JudgeExistAsset(bundleName, config.fxName)) { return PlayBattleEffect(id, parent, scale); } else { AssetBundleUtility.Instance.Co_LoadAsset(bundleName, config.fxName, OnEffectLoaded); return null; } } private void OnEffectLoaded(bool result, UnityEngine.Object obj) { if (result) { var _prefab = obj as GameObject; if (_prefab) { //Debug.LogFormat("异步加载... {0} ....成功.", obj.name); GameObjectPoolManager.Instance.CacheGameObject(_prefab, 1, false); } } } public SFXController PlayBattleEffect(int id, Transform parent, float scale = 1f) { if (parent == null) { return null; } SFXController _controller = Play(id, parent, scale); return _controller; } public SFXController PlayBattleEffect(int id, Vector3 position, Vector3 forward, float scale = 1f) { SFXController _controller = Play(id, position, forward, scale); return _controller; } public SFXController PlayEffectAsync(int id, Vector3 position, Vector3 forward, float scale = 1) { var config = EffectConfig.Get(id); var bundleName = StringUtility.Contact(ResourcesPath.EFFECT_Folder_Name, config.packageName); if (!AssetSource.isUseAssetBundle || AssetBundleUtility.Instance.JudgeExistAsset(bundleName, config.fxName)) { return PlayBattleEffect(id, position, forward, scale); } else { // Debug.LogFormat("[{0}] 开始异步加载: {1}", System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), config.fxName); AssetBundleUtility.Instance.Co_LoadAsset(bundleName, config.fxName, OnEffectLoaded); return null; } } public SFXController Play(int id, Transform parent, float scale = 1f) { if (parent == null) return null; SFXController _controller = Request(id); if (_controller == null) { return null; } EffectConfig _effectModel = EffectConfig.Get(id); if (_effectModel.setParent > 0) { _controller.transform.SetParent(parent); _controller.transform.localPosition = Vector3.zero; _controller.transform.localRotation = Quaternion.identity; _controller.transform.localScale = Vector3.one * scale; } else { _controller.transform.position = parent.position; _controller.transform.forward = parent.forward; _controller.transform.localScale = Vector3.one * scale; } _controller.startTime = 0; _controller.effectId = id; _controller.gameObject.SetActive(true); var config = EffectConfig.Get(id); if (config != null) { SoundPlayer.Instance.PlayUIAudio(config.audio); } return _controller; } public SFXController Play(int id, Vector3 position, Vector3 forward, float scale = 1f) { SFXController _controller = Request(id); if (_controller == null) { return null; } _controller.startTime = 0; _controller.effectId = id; _controller.transform.position = position; if (forward != Vector3.zero) { _controller.transform.forward = forward; } _controller.transform.localScale = Vector3.one * scale; _controller.gameObject.SetActive(true); var config = EffectConfig.Get(id); if (config != null) { SoundPlayer.Instance.PlayUIAudio(config.audio); } return _controller; } public SFXController PlayWithEulerAngle(int id, Vector3 position, Vector3 eulerAngle, float scale = 1f) { SFXController _controller = Request(id); if (_controller == null) { return null; } if (1044 == id) { Debug.Log("PlayWithEulerAngle: " + 1044); } _controller.startTime = 0; _controller.effectId = id; _controller.transform.position = position; _controller.transform.eulerAngles = eulerAngle; _controller.transform.localScale = Vector3.one * scale; _controller.gameObject.SetActive(true); var config = EffectConfig.Get(id); if (config != null) { SoundPlayer.Instance.PlayUIAudio(config.audio); } return _controller; } public SFXController Request(int id) { ObjectPool _pool = null; if (m_PoolDict.TryGetValue(id, out _pool) == false) { _pool = new ObjectPool(OnGetSFX, OnReleaseSFX); m_PoolDict.Add(id, _pool); } SFXController _controller = null; if (_pool.inactivedCount == 0) { _controller = Create(id); } else { _controller = _pool.Get(); } if (_controller != null) { _controller.transform.SetParent(null); } return _controller; } public void Release(SFXController sfx) { if (sfx == null) { return; } ObjectPool _pool = null; if (m_PoolDict.TryGetValue(sfx.effectId, out _pool) == false) { _pool = new ObjectPool(OnGetSFX, OnReleaseSFX); m_PoolDict.Add(sfx.effectId, _pool); } sfx.SetAnimatorSpeed(1); sfx.SetPaticleSystemSpeed(1); _pool.Release(sfx); } public void ReleaseAndDestroy(SFXController sfx) { if (sfx == null) { return; } ObjectPool _pool = null; if (m_PoolDict.TryGetValue(sfx.effectId, out _pool)) { _pool.Clear(); } } private SFXController Create(int id) { EffectConfig effectCfg = EffectConfig.Get(id); if (null == effectCfg) { return null; } var _prefab = ResManager.Instance.LoadAsset("UIEffect/" + effectCfg.packageName, effectCfg.fxName); if (_prefab == null) { return null; } GameObject _sfx = GameObjectPoolManager.Instance.RequestGameObject(_prefab); SFXController _controller = _sfx.AddMissingComponent(); _controller.config = EffectConfig.Get(id); return _controller; } private void OnGetSFX(SFXController controller) { controller.enabled = true; controller.SetActive(true); controller.DelayFrameCount = 0; controller.startTime = 0; } private void OnReleaseSFX(SFXController controller) { controller.SetActive(false); controller.DelayFrameCount = 0; controller.transform.SetParent(transform); controller.transform.position = Constants.Special_Hide_Position; controller.enabled = false; } public void Unitialize() { //foreach (var _pool in m_PoolDict.Values) //{ // _pool.Clear(); //} //m_PoolDict.Clear(); } }