示例#1
0
    /// <summary>
    /// 注册动画对应的触发事件
    /// </summary>
    void RegisterAnimation(int key, SkillEffectPlayer effect_player)
    {
        TriggerSetting[] trigger_settings = effect_player.TriggerSettings;
        if (trigger_settings == null)
        {
            return;
        }

        // 根据TriggerSettings来进行动画事件的注册
        for (int i = 0; i < trigger_settings.GetLength(0); ++i)
        {
            int tigger_int = key * 100 + i;
            // 获取AnimationClip
            TriggerSetting trigger_setting = trigger_settings[i];
            AnimationClip  animation_clip  = trigger_setting.Animation;
            if (animation_clip == null)
            {
                GameDebug.LogError(effect_player.gameObject.name + "'s animationclip is null");
                continue;
            }

            // 初始化回调相关参数
            CallBackInfo info = new CallBackInfo();
            info.mTime     = trigger_setting.StartFrame * 0.0333f;
            info.mCallBack = effect_player.OnFrameHit;
            info.mParam    = trigger_setting;
            // 注册回调事件
            RegisterEvent(tigger_int, animation_clip.name, info);
        }
    }
示例#2
0
    /// <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;
            }
        }
    }
示例#3
0
 public EffectInfo(TriggerSetting trigger_settting, GameObject effect_object, uint skill_sound_id)
 {
     mTriggerSetting = trigger_settting;
     mEffectObject   = effect_object;
     mSkillSoundId   = skill_sound_id;
 }
示例#4
0
    /// <summary>
    /// 播放指定触发信息对应的特效
    /// </summary>
    public void PlayEffect(TriggerSetting effect_trigger)
    {
        if (!mIsEnable)
        {
            return;
        }

        if (effect_trigger.OnlyLocalPlayer && !mIsLocalPlayer)
        {
            return;
        }

#if UNITY_EDITOR
        if (InSkillEffectEditor())
        {
            GameObject effect_object = EditorResourceLoader.LoadAssetAtPath("Assets/Res/" + effect_trigger.SuitEffectPath(UseHighEffect? 0:1) + ".prefab", typeof(GameObject)) as GameObject;
            if (effect_object == null)
            {
                return;
            }

            effect_object = GameObject.Instantiate(effect_object) as GameObject;

            // 如果组件已经被销毁了,需要将gameobject放入内存池
            if (mIsDestory)
            {
                GameObject.Destroy(effect_object);
                return;
            }

            Transform effect_trans = effect_object.transform;
            Transform bind_trans   = effect_trigger.BindBone.transform;
            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");
                GameObject.Destroy(effect_object);
                return;
            }

            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)
            {
                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 shakes = effect_object.GetComponentsInChildren <CameraCurveShake>(true);
            foreach (var item in shakes)
            {
                item.enabled = true;
                item.StartShake();
            }
        }
        else
#endif
        StartCoroutine(LoadSkillEffect(effect_trigger));
    }