private void AddEvent(HeroAction action, string functionName, float time) { if (BattleManager.Instance.InformAnimationClip(thisAnimation.GetClip(action.ToString()))) { UnityEngine.AnimationEvent evt = new UnityEngine.AnimationEvent(); evt.functionName = functionName; evt.time = time; thisAnimation.GetClip(action.ToString()).AddEvent(evt); } }
private void DoAction(HeroAction changeAction) { if (thisAnimation[action.ToString()].speed == 0) { if (changeAction == HeroAction.die) { thisAnimation[action.ToString()].speed = 1; } else { return; } } if (action == changeAction && thisAnimation[changeAction.ToString()].wrapMode != WrapMode.Loop) { thisAnimation[changeAction.ToString()].time = 0; } else { action = changeAction; } thisAnimation.Play(changeAction.ToString()); }
void FixedUpdate() { if (Time.timeScale == 0) { return; } if (mode == Mode.show) { if (thisAnimation.isPlaying) { return; } DoAction(HeroAction.idle); } else { if (injuryColorTime > 0) { injuryColorTime -= Time.deltaTime; if (injuryColorTime <= 0) { SetBodyIllumin(Color.black); } } if (BattleManager.Instance.status == BattleManager.Status.start && current_hp > 0) { bool standstill = false; foreach (var item in dots) { if (item.type == DotType.dazzle || item.type == DotType.freeze || item.type == DotType.knockback) { standstill = true; } } //处理一下图标 if (skillBtn) { if (allowCastSkill.activeSelf) { if (target.current_hp <= 0 || gauge < 1000 || standstill) { allowCastSkill.SetActive(false); } } else { if (target.current_hp > 0 && !navMeshAgent.enabled && gauge == 1000 && !standstill) { allowCastSkill.SetActive(true); } } } //普攻间隔倒计时 atkInterval -= Time.deltaTime; if (!standstill) { float dist = Vector3.Distance(transform.position, target.transform.position) - radius - target.radius; if ((target.current_hp <= 0 || dist > atk_range) && action == HeroAction.idle) { bool twine = false; foreach (var item in dots) { if (item.type == DotType.twine) { twine = true; } } if (action == HeroAction.idle && navMeshObstacle.enabled && !twine) { navMeshObstacle.enabled = false; //这里是为了让obstacle挖的洞先消失 Invoke("SearchTarget", 0.01f); } } if (navMeshAgent.enabled) { if (dist <= atk_range) { navMeshAgent.enabled = false; navMeshObstacle.enabled = true; DoAction(HeroAction.idle); transform.LookAt(target.transform); } else if (dist >= lastDistance) { navMeshAgent.destination = target.transform.position; } lastDistance = dist; } else { if (navMeshObstacle.enabled && dist <= atk_range) { if (action == HeroAction.idle && atkInterval <= 0) { atkInterval = 1 / atk_speed; DoAction(HeroAction.attack); } //自动释放技能 if (troop.auto) { CastSkill(null, null); } } } } //处理DOT for (int i = 0; i < dots.Count; i++) { Dot item = dots[i]; int lastSec = Mathf.FloorToInt(item.duration); item.duration -= Time.deltaTime; if (Mathf.FloorToInt(item.duration) != lastSec) //伤害及治疗类DOT { switch (item.type) { case DotType.burning: case DotType.bleeding: Damage(item.num, item.unit, true); break; case DotType.heal: Heal(item.num); break; } } if (item.duration <= 0) { switch (item.type) { case DotType.freeze: thisAnimation[action.ToString()].speed = 1; if (navMeshAgent.enabled) { ResumeMoving(); } else { DoAction(HeroAction.idle); } break; case DotType.dazzle: case DotType.knockback: case DotType.twine: ResumeMoving(); break; case DotType.atkUp: atk -= item.num; break; case DotType.matkUp: matk -= item.num; break; case DotType.speedDown: atk_speed /= (1 - item.num); move_speed /= (1 - item.num); navMeshAgent.speed = move_speed; break; case DotType.speedUp: atk_speed /= (1 + item.num); move_speed /= (1 + item.num); navMeshAgent.speed = move_speed; break; } if (item.eff) { Destroy(item.eff); } dots.Remove(item); } } } switch (action) { case HeroAction.attack: case HeroAction.skill_cast: case HeroAction.skill_attack: case HeroAction.hurt: case HeroAction.win: if (thisAnimation.isPlaying) { return; } DoAction(HeroAction.idle); break; } } }