//实例化 protected void InstantiateEffectPrefab(UEffectPrefabParam _effectParam) { if (_effectParam.EffectRes == null) { Trace.LogWarning("实例化UI效果类型:" + _effectParam.AttachEffectType + " 失败,资源没加载"); return; } //异步没加载完 if (!_effectParam.EffectRes.isLoadFinish) { return; } GameObject newEffect = _effectParam.EffectRes.InstanceMainRes(); if (newEffect == null) { Trace.LogWarning("UI特效资源:" + _effectParam.AttachEffectType + " 实例化失败?"); return; } UEffectNode uen = newEffect.GetComponent <UEffectNode>(); if (!uen) { uen = newEffect.AddComponent <UEffectNode>(); uen.EffectType = UEffectType.UET_EffectPrefab; } uen.NodeParam = _effectParam; _effectParam.EffectGameObject = newEffect; RegisterEffectPrefabNode(uen, _effectParam.AttachEffectType); }
//同步加载 protected ResNode LoadEffectPrefab(UEffectPrefabParam _effectParam) { if (!m_dicEffectDataTable.ContainsKey(_effectParam.AttachEffectType)) { Trace.LogWarning("UI效果资源数据容器 没有类型:" + _effectParam.AttachEffectType + " 的数据"); return(null); } UEffectDataLoadParam data = null; { ResNodeHandleParamBase param = new ResNodeHandleParam_Path(AssetType.Asset_Prefab, UPath.UArtistEffectPath + m_dicEffectDataTable[_effectParam.AttachEffectType].EffectPath); var resNode = AssetBundleManager.GetResNode(this, param); if (resNode == null) { Trace.LogError("无法取资源:" + UPath.UArtistEffectPath + m_dicEffectDataTable[_effectParam.AttachEffectType].EffectPath); return(null); } //AssetBundleManager.SaveMemory(resNode); //当前使用的效果类型超出了限定值,先移除下无效的记录 if (m_dicEffectPrefabTypeUsed.Count >= MaxEffectPrefabTypeCount) { ClearUnusedEffectPrefabType(); } data = new UEffectDataLoadParam(resNode); m_dicEffectPrefabTypeUsed.Add(_effectParam.AttachEffectType, data); } _effectParam.EffectRes = data.RefferencePrefabResNode; return(data.RefferencePrefabResNode); }
protected bool DestroyPrefabEffect(UEffectPrefabParam _effectParam) { //删实例 if (_effectParam.EffectGameObject != null) { UEffectNode tmpNode = _effectParam.EffectGameObject.GetComponent <UEffectNode>(); if (tmpNode != null) { tmpNode.To <UEffectNodeData_Prefab>().StopEffect(); UnRegisterEffectPrefabNode(tmpNode, _effectParam.AttachEffectType); } _effectParam.EffectRes.DestroyInstanceRes(ref _effectParam.EffectGameObject); } //删资源 UEffectDataLoadParam loadParam = null; if (m_dicEffectPrefabTypeUsed.TryGetValue(_effectParam.AttachEffectType, out loadParam) && _effectParam.IsDestroyRes) { if (_effectParam is UEffectPrefabAsyncParam) { AssetBundleManager.ReleaseResNodeAsync(this, loadParam.RefferencePrefabResNode, this, true); } else { AssetBundleManager.ReleaseResNode(this, loadParam.RefferencePrefabResNode, true); } m_dicEffectPrefabTypeUsed.Remove(_effectParam.AttachEffectType); } return(true); }
protected bool CreatePrefabEffect(UEffectPrefabParam _effectParam) { UEffectDataLoadParam data = null; //已经加载过的直接实例化 if (m_dicEffectPrefabTypeUsed.TryGetValue(_effectParam.AttachEffectType, out data)) { _effectParam.EffectRes = data.RefferencePrefabResNode; } else { if (_effectParam is UEffectPrefabAsyncParam) { AsyncLoadEffectPrefab(_effectParam); return(true); } else { if (LoadEffectPrefab(_effectParam) == null) { return(false); } } } InstantiateEffectPrefab(_effectParam); InitEffectPrefabRefParam(_effectParam); return(true); }
protected void InitEffectPrefabRefParam(UEffectPrefabParam _effectParam) { if (_effectParam.EffectRes == null) { Trace.LogWarning("实例化UI效果类型:" + _effectParam.AttachEffectType + " 失败,资源没加载"); return; } //异步没加载完 if (!_effectParam.EffectRes.isLoadFinish) { return; } //实例化失败,已报错 if (_effectParam.EffectGameObject == null) { return; } GameObject _goEffect = _effectParam.EffectGameObject; Transform EffectTrans = _goEffect.transform; EffectTrans.SetParent(_effectParam.AttachParent, false); //初始化坐标 if (_effectParam.AttachPosition != null) { EffectTrans.localPosition = (Vector3)_effectParam.AttachPosition; } //初始化角度 if (_effectParam.AttachRotation != null) { EffectTrans.GetComponentsInChildren <ParticleSystem>().ToList() .ForEach(x => { x.startRotation = (float)_effectParam.AttachRotation * Mathf.Deg2Rad; }); } //初始化延迟 if (_effectParam.AttachDelay != null) { int timerID = (int)EEffectTimer.EET_Delay * MaxTimerIDCount + _goEffect.GetComponent <UEffectNode>().To <UEffectNodeData_Prefab>().EffectPrefabTypeID; TimerManager.SetTimer(this, timerID, (float)_effectParam.AttachDelay, 1); _goEffect.SetActive(false); m_dicTimerIDObject.Add(timerID, _goEffect); } ////////粒子相关 UEffectNodeData_Prefab prefab = _goEffect.GetComponent <UEffectNode>().To <UEffectNodeData_Prefab>(); prefab.InitParticles(); //是否需要播放完后自动移除 if (_effectParam.AutoDestroy) { //检测是否有循环播放的粒子系统,有的话不能自动移除 if (prefab.IsLoopEffect()) { Trace.LogWarning("UI效果:" + EffectTrans.name + "不能用于自动移除,因为用到循环粒子系统"); } else { prefab = _goEffect.GetComponent <UEffectNode>().To <UEffectNodeData_Prefab>(); prefab.SetAutoDestroy(); } } //if(_effectParam.AttachEffectType == UEffectPrefabType.UEPT_HeroPreviewFrame_GradeFrame4) //{ // Debug.Log("begin InitEffectPrefabRefParam"); // UParticleMask mask = _goEffect.GetComponent<UParticleMask>(); // if (mask == null) // mask = _goEffect.AddComponent<UParticleMask>(); // RectTransform rectTrans = (EffectTrans as RectTransform); // rectTrans.sizeDelta = new Vector2(152f, 190f); // Debug.Log(rectTrans.gameObject.name + "..InitEffectPrefabRefParam.." + rectTrans.position); // Debug.Log("end InitEffectPrefabRefParam"); //} //最后播放粒子 prefab.ReplayEffect(); //异步资源回调 if (_effectParam is UEffectPrefabAsyncParam) { if ((_effectParam as UEffectPrefabAsyncParam).onResLoadFinished != null) { (_effectParam as UEffectPrefabAsyncParam).onResLoadFinished.Invoke(_effectParam as UEffectPrefabAsyncParam); } } }