IEnumerator LoadEffect(string effect_path, Vector3 hit_pos) { xc.ObjectWrapper game_object_wrapper = new xc.ObjectWrapper(); yield return(MainGame.HeartBehavior.StartCoroutine(ObjCachePoolMgr.Instance.LoadPrefab(effect_path, ObjCachePoolType.SMALL_PREFAB, effect_path, game_object_wrapper))); GameObject effect_object = game_object_wrapper.obj as GameObject; OnEffectResLoad(effect_object, hit_pos); }
/// <summary> /// 加载特效资源,加载完毕后根据配置设置不同的跟节点 /// </summary> /// <param name="setting"></param> /// <returns></returns> IEnumerator LoadEffect(StateTriggerSetting.TriggerSetting trigger_setting, StateTriggerSetting.StateType state_type) { var effect_path = trigger_setting.EffectPath; xc.ObjectWrapper game_object_wrapper = new xc.ObjectWrapper(); yield return(StartCoroutine(ObjCachePoolMgr.Instance.LoadPrefab(effect_path, ObjCachePoolType.SFX, effect_path, game_object_wrapper))); GameObject effect_object = game_object_wrapper.obj as GameObject; if (effect_object == null)// 特效加载不成功或者在切场景时被销毁,则直接返回 { yield break; } // 是否组件已经被销毁或取消激活 if (mIsDestory || !mIsEnable) { ObjCachePoolMgr.Instance.RecyclePrefab(effect_object, ObjCachePoolType.SFX, effect_path); yield break; } // 资源加载完毕后需要再次判断可见性 bool is_visible = Owner != null ? Owner.mVisibleCtrl.IsVisible : false; if (!is_visible || mState != state_type) { ObjCachePoolMgr.Instance.RecyclePrefab(effect_object, ObjCachePoolType.SFX, effect_path); yield break; } Transform effect_trans = effect_object.transform; Transform bind_trans = trigger_setting.BindBone; if (bind_trans == null) { bind_trans = mTrans; } if (bind_trans != null) { effect_trans.parent = bind_trans; effect_trans.localPosition = Vector3.zero; effect_trans.localRotation = Quaternion.identity; effect_trans.localScale = Vector3.one; mEffectInfos.Add(new EffectInfo(effect_path, effect_object)); yield return(null); } else { GameDebug.LogError("StateEffectPlayer::LoadEffect: bind_trans is null"); ObjCachePoolMgr.Instance.RecyclePrefab(effect_object, ObjCachePoolType.SFX, effect_path); yield break; } }
/// <summary> /// 加载特效资源,加载完毕后根据配置设置不同的跟节点 /// </summary> /// <param name="setting"></param> /// <returns></returns> IEnumerator LoadSkillEffect(TriggerSetting effect_trigger) { var owner = Owner; if (mIsDestory || owner == null || owner.IsDestroy) { yield break; } bool is_visible = owner.mVisibleCtrl.IsVisible; if (!is_visible) { yield break; } bool need_effect_hide = false; if (mIsPlayer)//检查角色的特效数量是否超出限制 { if (!mIsLocalPlayer) { need_effect_hide = true; } } else// 如果召唤怪或者宠物的主人是玩家,释放的技能特效也需要隐藏 { var parent_actor = owner.ParentActor; if (parent_actor != null && parent_actor.IsPlayer() && !parent_actor.IsLocalPlayer) { need_effect_hide = true; } } if (need_effect_hide && EffectManager.Instance.ExceedEffectNum()) { yield break; } int effect_level = 1; // 低配下使用低配的特效 if (QualitySetting.GraphicLevel == 2) { effect_level = 1; } // 其他配置下本地玩家才使用高配特效 else { effect_level = mIsLocalPlayer ? 0 : 1; } string effect_path = effect_trigger.SuitEffectPath(effect_level); if (string.IsNullOrEmpty(effect_path)) { yield break; } xc.ObjectWrapper game_object_wrapper = new xc.ObjectWrapper(); yield return(StartCoroutine(ObjCachePoolMgr.Instance.LoadPrefab(effect_path, ObjCachePoolType.SFX, effect_path, game_object_wrapper))); GameObject effect_object = game_object_wrapper.obj as GameObject; if (effect_object == null)// 特效加载不成功或者在切场景时被销毁,则直接返回 { yield break; } if (mIsPlayer && !mIsLocalPlayer) { EffectManager.Instance.IncreaseEffectNum(); } // 如果组件已经被销毁了,需要将gameobject放入内存池 var ownerActor = Owner; if (mIsDestory || ownerActor == null || ownerActor.IsDestroy) { BeforeRecycleEffect(effect_object); ObjCachePoolMgr.Instance.RecyclePrefab(effect_object, ObjCachePoolType.SFX, effect_path); yield break; } Transform effect_trans = effect_object.transform; Transform bind_trans = effect_trigger.BindBone != null ? effect_trigger.BindBone.transform : null; if (bind_trans == null) { bind_trans = mTrans; } if (bind_trans != null) { effect_trans.parent = bind_trans; effect_trans.localPosition = Vector3.zero; effect_trans.localRotation = Quaternion.identity; effect_trans.localScale = Vector3.one; if (effect_trigger.InWorld)// 特效不跟随角色 { effect_trans.parent = null; } } else { GameDebug.LogError("[LoadSkillEffect]bind_trans is null"); BeforeRecycleEffect(effect_object); ObjCachePoolMgr.Instance.RecyclePrefab(effect_object, ObjCachePoolType.SFX, effect_path); yield break; } ParticleControl particle_control = effect_object.GetComponent <ParticleControl>(); if (particle_control == null) { particle_control = effect_object.AddComponent <ParticleControl>(); } if (ownerActor != null) { particle_control.Speed = ownerActor.AttackSpeed; } else { particle_control.Speed = 1.0f; } var delay_timer = effect_object.GetComponent <DelayTimeComponent>(); if (delay_timer == null) { delay_timer = effect_object.AddComponent <DelayTimeComponent>(); } delay_timer.DelayTime = effect_trigger.LifeTime; delay_timer.Start(); uint skillSoundId = 0; // 播放特效中的声音 if (effect_trigger.Audio != null) { // 某些音效只有本地玩家才播放 if (effect_trigger.OnlyLocalPlayer == false || (effect_trigger.OnlyLocalPlayer && mIsLocalPlayer)) { skillSoundId = AudioManager.Instance.PlayBattleSFX(effect_trigger.Audio, AudioManager.GetSFXSoundType(Owner)); //AudioManager.Instance.PlayAudio(effect_trigger.Audio, false); } } EffectInfo effect_info = new EffectInfo(effect_trigger, effect_object, skillSoundId); mEffectObjects[effect_object.GetHashCode()] = effect_info; delay_timer.SetEndCallBack(new DelayTimeComponent.EndCallBackInfo(OnEffectPlayFinish, effect_object)); //本地玩家才有振动 var cameraShakeCache = effect_object.GetComponent <CameraCurveCache>(); CameraCurveShake[] shakes = null; if (cameraShakeCache == null) { cameraShakeCache = effect_object.AddComponent <CameraCurveCache>(); shakes = effect_object.GetComponentsInChildren <CameraCurveShake>(true); cameraShakeCache.ShakeCache = shakes; } else { shakes = cameraShakeCache.ShakeCache; } foreach (var item in shakes) { if (mIsLocalPlayer && GlobalSettings.Instance.CameraShake) { item.enabled = true; item.StartShake(); } else { item.enabled = false; } } }