//实例化
        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);
                }
            }
        }