/// <summary> /// 退出待机状态 /// </summary> /// <param name="data"></param> void OnExitIdleState(CEventBaseArgs data) { if (!mTriggerAuto) { return; } mState = StateTriggerSetting.StateType.STATE_NONE; RecycleEffect(); }
/// <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="data"></param> void OnEnterIdleState(CEventBaseArgs data) { if (!mTriggerAuto) { return; } mState = StateTriggerSetting.StateType.STATE_IDLE; List <StateTriggerSetting.TriggerSetting> trigger_setting_list = null; if (mStateTriggerMap.TryGetValue(mState, out trigger_setting_list)) { PlayEffect(trigger_setting_list, mState); } }
/// <summary> /// 进入状态的时候不自动触发,需要调用此函数才触发 /// </summary> /// <param name="actor"></param> public void TriggerManual() { if (Owner == null) { return; } if (Owner.IsIdle()) { mState = StateTriggerSetting.StateType.STATE_IDLE; List <StateTriggerSetting.TriggerSetting> trigger_setting_list = null; if (mStateTriggerMap.TryGetValue(mState, out trigger_setting_list)) { PlayEffect(trigger_setting_list, mState); } } }
/// <summary> /// 播放指定触发信息对应的特效 /// </summary> private void PlayEffect(List <StateTriggerSetting.TriggerSetting> trigger_setting_list, StateTriggerSetting.StateType state_type) { // 先删除特效 RecycleEffect(); if (!mIsEnable) { return; } // 判断是否需要隐藏特效 bool need_effect_hide = false; bool is_visible = Owner != null ? Owner.mVisibleCtrl.IsVisible : false; if (!is_visible) { need_effect_hide = true; } else { if (Owner.IsPlayer())//检查角色的特效数量是否超出限制 { if (!Owner.IsLocalPlayer) { 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) { return; } foreach (var trigger_setting in trigger_setting_list) { StartCoroutine(LoadEffect(trigger_setting, state_type)); } }