private IEnumerator CloseTargetCoroutine(CharacterEntity target, float delay) { if (delay > 0) { delay /= Game.GameSetting.instance.speed; float time = Time.realtimeSinceStartup; float currentTime = time; while (Time.realtimeSinceStartup - time < delay) { yield return(null); if (TimeController.instance.playerPause) { time += (Time.realtimeSinceStartup - currentTime); } currentTime = Time.realtimeSinceStartup; } } Vector3 offset = Vector3.zero; Vector3 centerPos = Vector3.zero; if (target.isPlayer) { centerPos = PositionData.GetPos((uint)FormationPosition.Player_Position_2); } else { centerPos = PositionData.GetPos((uint)FormationPosition.Enemy_Position_2); } offset.z = target.pos.z - centerPos.z; offset.z += _offset; Vector3 target1 = new Vector3(target.pos.x, _originalMainCameraPos.y, _originalMainCameraPos.z) + offset; Vector3 end = Vector3.Lerp(target1, target.pos, lerp); LTDescr ltDescr = LeanTween.move(mainCamera.gameObject, end, 0.3f); ltDescr.tweenType = LeanTweenType.easeInOutSine; ltDescr.setIgnoreTimeScale(true); }
private void PlayAOEEffects(float lastDelay, int layer) { #region aoe MechanicsData mechanicsData = null; List <float> timelineKeys = skillInfo.skillData.timeline.GetKeys(); Dictionary <CharacterEntity, int> judgeTypeDic = new Dictionary <CharacterEntity, int>(); for (int j = 0, count = timelineList.Count; j < count; j++) { Dictionary <uint, List <KeyValuePair <uint, uint> > > mechanicsDic = timelineList[j]; List <uint> mechanicsKeys = mechanicsDic.GetKeys(); List <Triple <float, float, float> > mechanicsValues = skillInfo.skillData.mechanicsValues[j]; uint effectId = 0; if (skillInfo.skillData.aoeEffects.Length > j) { effectId = skillInfo.skillData.aoeEffects[j]; } for (int k = 0, kCount = mechanicsKeys.Count; k < kCount; k++) { uint mechanicsId = mechanicsKeys[k]; mechanicsData = MechanicsData.GetMechanicsDataById(mechanicsId); List <KeyValuePair <uint, uint> > tids; if (mechanicsData.mechanicsType == MechanicsType.Reborn) { tids = CharacterUtil.FindDeadTargets(mechanicsData.rangeType, mechanicsData.targetType, isPlayer); if (mechanicsData.rangeType == RangeType.All || mechanicsData.rangeType == RangeType.AllAbsolutely) { tids.AddRange(CharacterUtil.FindAllTargets(mechanicsData.targetType, isPlayer)); } } else { if (mechanicsData.rangeType == RangeType.All || mechanicsData.rangeType == RangeType.AllAbsolutely) { tids = CharacterUtil.FindAllTargets(mechanicsData.targetType, isPlayer); } else { tids = mechanicsDic[mechanicsId]; } } Triple <float, float, float> mechanicsValue = mechanicsValues[k]; float delay = timelineKeys[j] + lastDelay; if (GameSetting.instance.effectable) { EffectInfo effectInfo = new EffectInfo(effectId); if (effectInfo.effectData != null) { effectInfo.character = character; effectInfo.target = character; effectInfo.skillInfo = skillInfo; effectInfo.delay = delay + effectInfo.effectData.delay; effectInfo.mechanicsData = mechanicsData; effectInfo.mechanicsValue = mechanicsValue; switch (effectInfo.effectData.effectType) { case EffectType.TargetArea: //根据范围信息取位置 uint positionId = GetTargetAreaPositionId(mechanicsData, tids, isPlayer); effectInfo.pos = PositionData.GetPos(positionId); delay += effectInfo.effectData.delay; break; } EffectController.instance.PlayEffect(effectInfo, layer); } } bool isLastTarget = false; if (FightController.instance.fightStatus == FightStatus.Normal)//矫正因暂停导致时间线推迟 { delay -= skillInfo.skillData.pauseTime; } for (int i = 0, iCount = tids.Count; i < iCount; i++) { if (i == iCount - 1) { isLastTarget = true; } CharacterEntity target1 = CharacterUtil.FindTarget(mechanicsData.mechanicsType, mechanicsData.targetType, isPlayer, tids[i].Key); CharacterEntity target2 = CharacterUtil.FindTarget(mechanicsData.mechanicsType, mechanicsData.targetType, isPlayer, tids[i].Value); if (!target1) { continue; } int judgeType = 0; if (!judgeTypeDic.ContainsKey(target1)) { judgeType = JudgeUtil.GetJudgeResult(character, target1, target2, (int)skillInfo.skillData.skillId); judgeTypeDic[target1] = judgeType; if (judgeType == 0) { EffectController.instance.RemoveEffectByPrefabName(EffectController.SPEED_LINE); } } else { judgeType = judgeTypeDic[target1]; } if (isPlayer) { MechanicsController.instance.PlayerMechanics(skillInfo, mechanicsData, character, target1, target2, mechanicsValue, delay, judgeType, isLastTarget); } else { MechanicsController.instance.EnemyMechanics(skillInfo, mechanicsData, character, target1, target2, mechanicsValue, delay, judgeType, isLastTarget); } } } } judgeTypeDic.Clear(); judgeTypeDic = null; #endregion }
public void PlayCasterEffect(int layer) { if (!GameSetting.instance.effectable) { return; } #region black screen if (skillInfo.animationData.blackScreen > 0) { EffectInfo effectInfo = new EffectInfo(skillInfo.animationData.blackScreen); if (effectInfo.effectData != null) { effectInfo.skillInfo = skillInfo; effectInfo.target = character; effectInfo.delay = skillInfo.skillData.blackTime; effectInfo.length = skillInfo.skillData.blackLength; //switch (skillInfo.animationData.animType) //{ // case AnimType.Root: // effectInfo.length = skillInfo.skillData.timeline.First().Key;// skillInfo.animationData.length - skillInfo.skillData.pauseTime; // break; // case AnimType.Trace: // effectInfo.length = skillInfo.animationData.moveTime + 0.3f; // break; //} EffectController.instance.PlayEffect(effectInfo, (int)Logic.Enums.LayerType.Scene); } } if (skillInfo.animationData.bgEffect > 0) { EffectInfo effectInfoBgEffect = new EffectInfo(skillInfo.animationData.bgEffect); if (effectInfoBgEffect.effectData != null) { effectInfoBgEffect.skillInfo = skillInfo; effectInfoBgEffect.target = character; effectInfoBgEffect.delay = skillInfo.skillData.blackTime; effectInfoBgEffect.length = skillInfo.skillData.blackLength; EffectController.instance.PlayEffect(effectInfoBgEffect, (int)Logic.Enums.LayerType.Scene); } } #endregion #region full screen if (skillInfo.animationData.fullScreen > 0 && isPlayer) { EffectInfo effectInfo = new EffectInfo(skillInfo.animationData.fullScreen); if (effectInfo.effectData != null) { effectInfo.delay = skillInfo.skillData.fullScreenTime;// +effectInfo.effectData.delay; effectInfo.target = character; Vector3 pos = PositionData.GetPos((int)FormationPosition.Player_Position_2); effectInfo.pos = pos;// effectInfo.effectData.offset + new Vector3(0, 0, pos.z); effectInfo.length = skillInfo.skillData.fullScreenLength; //effectInfo.length = skillInfo.animationData.closeupOverTime; EffectController.instance.PlayEffect(effectInfo, layer); } } #endregion MechanicsData mechanicsData = MechanicsData.GetMechanicsDataById(timelineList.First().First().Key);//第一个作用效果 for (int i = 0, count = skillInfo.skillData.effectIds.Length; i < count; i++) { uint effectId = skillInfo.skillData.effectIds[i]; EffectInfo effectInfo = new EffectInfo(effectId); if (effectInfo.effectData == null) { continue; } effectInfo.skillInfo = skillInfo; effectInfo.character = character; switch (effectInfo.effectData.effectType) { case EffectType.Root: { effectInfo.delay = skillInfo.effectDelay + effectInfo.effectData.delay; Vector3 offset = effectInfo.effectData.offset; if (!isPlayer) { offset.x *= -1; } effectInfo.pos = PositionData.GetPostionDataById(character.positionId).position + offset; effectInfo.target = character; } break; case EffectType.LockPart: effectInfo.delay = skillInfo.effectDelay + effectInfo.effectData.delay; effectInfo.lockTrans = TransformUtil.Find(effectInfo.effectData.partName, character.transform); effectInfo.target = character; break; case EffectType.LockTarget: if (effectInfo.effectData.isRotate) { effectInfo.rotateAngles = skillInfo.rotateAngles; } effectInfo.delay = skillInfo.effectDelay + effectInfo.effectData.delay; effectInfo.target = character; break; case EffectType.TargetArea: uint positionId = GetTargetAreaPositionId(mechanicsData, timelineList.First().First().Value, isPlayer); effectInfo.pos = PositionData.GetPos(positionId); effectInfo.target = character; effectInfo.delay = effectInfo.effectData.delay; break; case EffectType.MoveTargetPos: { float moveCost = (skillInfo.animationData.hitTime - skillInfo.animationData.moveTime); float moveDelay = moveCost * positionRow * GameConfig.timePercent; effectInfo.delay = skillInfo.effectDelay + effectInfo.effectData.delay + moveDelay; effectInfo.character = character; effectInfo.target = character; Vector3 offset = effectInfo.effectData.offset; if (!isPlayer) { offset.x *= -1; } effectInfo.pos = endPos + offset; } break; case EffectType.FullScreen: if (!isPlayer) { continue; } effectInfo.delay = skillInfo.effectDelay + effectInfo.effectData.delay; effectInfo.target = character; Vector3 pos = PositionData.GetPos((int)FormationPosition.Player_Position_2); effectInfo.pos = effectInfo.effectData.offset + new Vector3(0, 0, pos.z); break; case EffectType.BlackScreen: case EffectType.ShakeScreen: effectInfo.delay = effectInfo.effectData.delay; break; } EffectController.instance.PlayEffect(effectInfo, layer); } }