using UnityEngine; using System.Collections.Generic; using TableConfig; public class SFXPlayUtility : SingletonMonobehaviour { private Dictionary> m_PoolDict; public void Initialize() { m_PoolDict = new Dictionary>(); } public SFXController PlayBattleEffect(int id, Transform parent, float scale = 1f) { if (parent == null) { return null; } SFXController _controller = Play(id, parent, scale); if (_controller != null) { _controller.gameObject.SetLayer(LayerUtility.BattleEffect, true); } return _controller; } public SFXController PlayBattleEffect(int id, GActor actor, float scale = 1f) { EffectConfig _effectModel = Config.Instance.Get(id); if (_effectModel == null) { return null; } Transform _parent = null; if (!string.IsNullOrEmpty(_effectModel.nodeName)) { _parent = actor.Root.GetChildTransformDeeply(_effectModel.nodeName); } if (!_parent) { if (_effectModel.setParent == 2) { _parent = actor.MP_Name; } else if (_effectModel.setParent == 3) { _parent = actor.MP_Hit; } else if (_effectModel.setParent == 4) { if (actor.MP_Weapon) { _parent = actor.MP_Weapon; } else { _parent = actor.Root; } } else if (_effectModel.setParent == 1 || _effectModel.setParent == 0) { _parent = actor.Root; } } return PlayBattleEffect(id, _parent, scale); } public SFXController PlayBattleEffect(int id, Vector3 position, Vector3 forward, float scale = 1f) { SFXController _controller = Play(id, position, forward, scale); if (_controller != null) { _controller.gameObject.SetLayer(LayerUtility.BattleEffect, true); } return _controller; } 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 = Config.Instance.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 = Config.Instance.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 = Config.Instance.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) { DebugEx.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 = Config.Instance.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); } _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) { GameObject _prefab = InstanceResourcesLoader.LoadEffect(id); if (_prefab == null) { return null; } GameObject _sfx = GameObjectPoolManager.Instance.RequestGameObject(_prefab); SFXController _controller = _sfx.AddMissingComponent(); _controller.config = Config.Instance.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(); } }