| | |
| | | using Spine; |
| | | using UnityEngine.UI; |
| | | using System.Linq; |
| | | using Cysharp.Threading.Tasks; |
| | | |
| | | // 特效播放器,对象池管理:unity特效和spine特效都是做好的预制体 |
| | | // unity特效预制体是特效师在制作的时候生成的,unity特效必须挂载设置播放时长脚本 EffectTime |
| | |
| | | } |
| | | |
| | | |
| | | protected void InitComponent(bool showLog = true) |
| | | protected async UniTask InitComponent(bool showLog = true) |
| | | { |
| | | Clear(); |
| | | if (effectId <= 0) |
| | |
| | | // 初始化spine组件 |
| | | if (effectConfig != null && effectConfig.isSpine != 0) |
| | | { |
| | | GameObject spineContainerPrefab = ResManager.Instance.LoadAsset<GameObject>("UIComp", "SpineAnimContainer"); |
| | | GameObject spineContainerPrefab = await ResManager.Instance.LoadAssetAsync<GameObject>("UIComp", "SpineAnimContainer"); |
| | | spineContainer = GameObject.Instantiate(spineContainerPrefab, transform, true); |
| | | spineContainer.transform.localPosition = Vector3.zero; |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | public virtual void Play(bool showLog = true) |
| | | public virtual async void Play(bool showLog = true) |
| | | { |
| | | if (!isInit) |
| | | { |
| | | InitComponent(showLog); |
| | | await InitComponent(showLog); |
| | | isInit = true; |
| | | } |
| | | else |
| | |
| | | { |
| | | if (effectConfig.isSpine != 0) |
| | | { |
| | | PlaySpineEffect(); |
| | | PlaySpineEffect().Forget(); |
| | | } |
| | | else |
| | | { |
| | | PlayUnityEffect(); |
| | | PlayUnityEffect().Forget(); |
| | | } |
| | | |
| | | battleField?.soundManager.PlayEffectSound(effectConfig.audio); |
| | | battleField?.soundManager.PlayEffectSound(effectConfig.audio).Forget(); |
| | | |
| | | OnAlphaChanged(); |
| | | } |
| | | |
| | | protected void PlaySpineEffect() |
| | | protected async UniTask PlaySpineEffect() |
| | | { |
| | | if (spineComp == null) |
| | | { |
| | |
| | | |
| | | // ===== 简化:直接从缓存获取,缓存内部会自动加载 ===== |
| | | string directory = "UIEffect/" + effectConfig.packageName; |
| | | SkeletonDataAsset skeletonDataAsset = BattleResManager.Instance.GetSpineResource( |
| | | SkeletonDataAsset skeletonDataAsset = await BattleResManager.Instance.GetSpineResource( |
| | | directory, |
| | | effectConfig.fxName, |
| | | battleField?.guid |
| | |
| | | if (skeletonDataAsset == null) |
| | | { |
| | | Debug.LogError($"BattleEffectPlayer: Failed to load effect spine {effectConfig.fxName}"); |
| | | return; |
| | | } |
| | | |
| | | if (this == null || spineComp == null) |
| | | { |
| | | return; |
| | | } |
| | | // ================================ |
| | |
| | | return false; |
| | | } |
| | | |
| | | protected void PlayUnityEffect() |
| | | protected async UniTask PlayUnityEffect() |
| | | { |
| | | // 这里是纯unity特效的逻辑 |
| | | |
| | | var effectPrefab = ResManager.Instance.LoadAsset<GameObject>("UIEffect/" + effectConfig.packageName, effectConfig.fxName); |
| | | var effectPrefab = await ResManager.Instance.LoadAssetAsync<GameObject>("UIEffect/" + effectConfig.packageName, effectConfig.fxName); |
| | | if (effectPrefab == null) |
| | | { |
| | | Debug.LogError($"加载UI特效失败: {effectConfig.packageName}"); |