/// <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; } }; }
// 产生特效并执行伤害 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); } } }
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; } }
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; } } }
/// <summary> /// 获得一个临时GameObject对象,并为其添加EffectsLifeCycle脚本管理其生命周期 /// </summary> /// <param name="templateObject">模板对象</param> /// <returns></returns> public static EffectsLifeCycle AcquireObject(EffectConditonalType type, GameObject templateObject = null, BattleState battleState = null, CharacterMono target = null, float during = -1, ParticleSystem particleSystem = null) { GameObject result = null; if (templateObject == null) { result = new GameObject(); } else { result = GameObject.Instantiate(templateObject); } EffectsLifeCycle effectsLifeCycle = result.AddComponent <EffectsLifeCycle>(); effectsLifeCycle.Init(type, battleState, target, during, particleSystem); return(effectsLifeCycle); }
/// <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; } }