Пример #1
0
    /// <summary>
    /// 在两个单位之间创建链条特效
    /// </summary>
    public void CreateChainEffect(CharacterMono speller, CharacterMono target)
    {
        EffectsLifeCycle lifeCycle = TransientGameObjectFactory.AcquireObject(EffectConditonalType.During, during: 1f, templateObject: TargetEffect);

        lifeCycle.transform.position = target.transform.position;
        lifeCycle.OnFinshied        += () => {
            CharacterMono nextTarget = null;
            // 找到目标单位周围随机的单位
            Collider[] colliders = Physics.OverlapSphere(target.transform.position, SkillInfluenceRadius);
            foreach (var collider in colliders)
            {
                CharacterMono characterMono = collider.GetComponent <CharacterMono>();
                if (characterMono != null && characterMono != target)
                {
                    nextTarget = characterMono;
                    break;
                }
            }
            if (nextTarget != null && nowCount >= 1)
            {
                Execute(speller, nextTarget);
                nowCount -= 1;
            }
            else
            {
                // 复原
                nowCount = Count;
            }
        };
    }
Пример #2
0
    // 产生特效并执行伤害
    public void Execute()
    {
        if (projectileModel.spherInfluence == 0)
        {
            // 只影响单人的投射物

            // 产生敌人身上的特效
            if (projectileModel.tartgetEnemryEffect != null)
            {
                EffectsLifeCycle lifeCycle = TransientGameObjectFactory.AcquireObject(EffectConditonalType.During, templateObject: projectileModel.tartgetEnemryEffect, during: 2f);
                lifeCycle.transform.SetParent(target.transform);
                lifeCycle.transform.localPosition = Vector3.zero;
            }

            // 产生目标位置的特效
            if (projectileModel.targetPositionEffect != null)
            {
                EffectsLifeCycle lifeCycle = TransientGameObjectFactory.AcquireObject(EffectConditonalType.During, templateObject: projectileModel.targetPositionEffect, during: 2f);
                lifeCycle.transform.SetParent(target.transform);
                lifeCycle.transform.localPosition = Vector3.zero;
            }

            target.characterModel.Damaged(damage);
        }
        else
        {
            // 影响一个范围的投射物

            // 产生技能特效

            // 产生目标位置的特效
            if (projectileModel.targetPositionEffect != null)
            {
                EffectsLifeCycle lifeCycle = TransientGameObjectFactory.AcquireObject(EffectConditonalType.During, templateObject: projectileModel.targetPositionEffect, during: 2f);
                lifeCycle.transform.SetParent(target.transform);
                lifeCycle.transform.localPosition = Vector3.zero;
            }

            Collider[] colliders = Physics.OverlapSphere(targetPosition, projectileModel.spherInfluence);
            foreach (Collider collider in colliders)
            {
                CharacterMono targetMono = collider.GetComponent <CharacterMono>();

                if (targetMono == null)
                {
                    continue;
                }

                // 产生敌人身上的特效
                if (projectileModel.tartgetEnemryEffect != null)
                {
                    EffectsLifeCycle lifeCycle = TransientGameObjectFactory.AcquireObject(EffectConditonalType.During, templateObject: projectileModel.tartgetEnemryEffect, during: 2f);
                    lifeCycle.transform.SetParent(target.transform);
                    lifeCycle.transform.localPosition = Vector3.zero;
                }

                targetMono.characterModel.Damaged(targetMono, damage, launcher);
            }
        }
    }
Пример #3
0
    protected virtual void OnEnter(CharacterMono stateHolder)
    {
        firsstEnterTime = Time.time;

        if (stateHolderEffect != null)
        {
            EffectsLifeCycle lifeCycle = TransientGameObjectFactory.AcquireObject(EffectConditonalType.BattleState, templateObject: stateHolderEffect, battleState: this, target: stateHolder);
            lifeCycle.transform.SetParent(stateHolder.transform, false);
            lifeCycle.transform.localPosition = Vector3.zero;
        }
    }
Пример #4
0
 protected override void OnEnter(CharacterMono stateHolder)
 {
     base.OnEnter(stateHolder);
     time = interval;
     if (effect != null && effectObject == null)
     {
         // 创建临时特效对象
         effectObject = TransientGameObjectFactory.AcquireObject(EffectConditonalType.BattleState, templateObject: effect, battleState: this, target: stateHolder).gameObject;
         effectObject.transform.position = stateHolder.transform.position;
         effectObject.transform.SetParent(stateHolder.transform);
     }
 }
Пример #5
0
    public override void Execute(CharacterMono speller, CharacterMono target, ref Damage damage)
    {
        // 约束暴击几率
        float            critRate         = Mathf.Clamp01(CritRate);
        EffectsLifeCycle tempTargetEffect = null;

        if (Random.Range(0f, 1f) <= critRate)
        {
            // 执行暴击效果,将伤害*倍数对敌人进行计算
            damage *= CritMultiple;

            // 产生特效
            if (skillModel.TargetEffect != null)
            {
                tempTargetEffect = TransientGameObjectFactory.AcquireObject(EffectConditonalType.During, templateObject: skillModel.TargetEffect, during: 5f);
                tempTargetEffect.transform.position = target.transform.position;
            }
        }
    }
Пример #6
0
    /// <summary>
    /// 为技能产生一般性特效,即释放时,
    /// 自身的特效 selfEffect;
    /// 敌方的特效 targetEffect;
    /// </summary>
    protected void CreateEffect(CharacterMono speller, Vector3 position, CharacterMono target = null)
    {
        EffectsLifeCycle tempSelfEffect   = null;
        EffectsLifeCycle tempTargetEffect = null;

        if (SelfEffect != null)
        {
            tempSelfEffect = TransientGameObjectFactory.AcquireObject(EffectConditonalType.During, templateObject: SelfEffect, during: 5f);
            tempSelfEffect.transform.position = position;
        }
        if (TargetEffect != null)
        {
            tempTargetEffect = TransientGameObjectFactory.AcquireObject(EffectConditonalType.During, templateObject: TargetEffect, during: 5f);
            tempTargetEffect.transform.position = position;
        }

        // 如果有技能要延迟执行,默认根据目标特效对象的生命周期进行延迟执行
        if (OnCompelte != null)
        {
            tempTargetEffect.OnFinshied += OnCompelte;
            // 清除委托
            OnCompelte -= OnCompelte;
        }
    }