public VFXAsyncResult(VFXConfig.VFXType vfxType, GameObject result, string errorMessge) { VFXType = vfxType; Result = result; ErrorMessage = errorMessge; Success = Result && string.IsNullOrEmpty(errorMessge); }
public void InstantiateEffectAsync(VFXConfig.VFXType vfxType, Action <VFXAsyncResult> completedAction) { int vfxTypeIndex = (int)vfxType; m_EffectStates[vfxTypeIndex].InstantiateCompletedActions.Enqueue(completedAction); Addressables.InstantiateAsync(VFXConfig.ITEM_CONFIGS[(int)vfxType].AssetKey).Completed += m_EffectStates[vfxTypeIndex]._OnInstantiateAsyncCompleted; }
/// <summary> /// 异步创建Effect /// <see cref="GetEffectCountInPool(VFXConfig.VFXType)"/>大于0的话从池中拿 /// 异步实例化 /// </summary> public void PopEffectAsync(VFXConfig.VFXType vfxType, Action <VFXEffectInstance> completedAction) { int vfxTypeIndex = (int)vfxType; if (m_EffectStates[vfxTypeIndex].InstantiatePool.Count > 0) { VFXEffectInstance effectInstance = m_EffectStates[vfxTypeIndex].InstantiatePool.Pop(); effectInstance.Instance.SetActive(true); completedAction?.Invoke(effectInstance); } else { m_EffectStates[vfxTypeIndex].PopCompletedActions.Enqueue(completedAction); m_AssetHelper.InstantiateEffectAsync(vfxType, OnInstantiateEffectCompleted); } }
/// <summary> /// 同步创建Effect /// <see cref="GetEffectCountInPool(VFXConfig.VFXType)"/>大于0的话从池中拿 /// <see cref="IsLoadedEffect(VFXConfig.VFXType)"/>的话,通过Loaded出来的Effect实例化 /// </summary> public VFXEffectInstance PopEffect(VFXConfig.VFXType vfxType) { if (GetEffectCountInPool(vfxType) > 0) { VFXEffectInstance effectInstance = m_EffectStates[(int)vfxType].InstantiatePool.Pop(); effectInstance.Instance.SetActive(true); return(effectInstance); } else if (IsLoadedEffect(vfxType)) { m_EffectStates[(int)vfxType].InstantiateCount++; return(new VFXEffectInstance(vfxType, Instantiate(m_AssetHelper.GetEffect(vfxType)), false)); } else { throw new Exception(string.Format("effect ({0}) not loaded", vfxType)); } }
public void LoadEffectAsync(VFXConfig.VFXType vfxType, Action <VFXAsyncResult> completedAction) { int vfxTypeIndex = (int)vfxType; if (m_EffectStates[vfxTypeIndex].EffectAsset != null) { completedAction?.Invoke(new VFXAsyncResult(vfxType, m_EffectStates[vfxTypeIndex].EffectAsset, string.Empty)); } else if (m_EffectStates[vfxTypeIndex].IsLoading) { m_EffectStates[vfxTypeIndex].CompletedAction += completedAction; } else { m_EffectStates[vfxTypeIndex].IsLoading = true; m_EffectStates[vfxTypeIndex].CompletedAction += completedAction; Addressables.LoadAssetAsync <GameObject>(VFXConfig.ITEM_CONFIGS[(int)vfxType].AssetKey).Completed += m_EffectStates[vfxTypeIndex]._OnLoadAsyncCompleted; } }
public VFXEffectInstance(VFXConfig.VFXType vfxType, GameObject instance, bool isInstantiatedAsync) { VFXType = vfxType; Instance = instance; IsInstantiatedAsync = isInstantiatedAsync; }
/// <summary> /// 实例化中的Effect数量 /// </summary> public int GetInstantiatingEffectCount(VFXConfig.VFXType vfxType) { return(m_EffectStates[(int)vfxType].PopCompletedActions.Count); }
/// <summary> /// Effect在池中的剩余数量 /// </summary> public int GetEffectCountInPool(VFXConfig.VFXType vfxType) { return(m_EffectStates[(int)vfxType].InstantiatePool.Count); }
/// <summary> /// Effect是否加载 /// </summary> public bool IsLoadedEffect(VFXConfig.VFXType vfxType) { return(m_AssetHelper.IsLoadedEffect(vfxType)); }
/// <summary> /// 异步加载Effect /// </summary> public void LoadEffectAsync(VFXConfig.VFXType vfxType, Action <VFXAsyncResult> completedAction) { m_AssetHelper.LoadEffectAsync(vfxType, completedAction); }
public GameObject GetEffect(VFXConfig.VFXType vfxType) { return(m_EffectStates[(int)vfxType].EffectAsset); }
public bool IsLoadedEffect(VFXConfig.VFXType vfxType) { return(m_EffectStates[(int)vfxType].EffectAsset != null); }