private IEnumerator LateAtk(Character _target, float delay, Skill skill) { skill.cast(this.character, _target); yield return(new WaitForSeconds(delay)); AbstractAI targetAI = _target.ai; if (this.IsDied() || targetAI.IsDied() || !isInAttackArea(_target.gameObject, getAtkRange())) { yield break; } bool isCrit = IsCrit(skill, _target); bool isDodge = IsDodge(skill, _target); int damage = GetDamage(atkTarget, skill, isCrit, isDodge); _target.hp -= damage; Vector3 attackdir = this.transform.position - _target.gameObject.transform.position; attackdir[1] = 0f; attackdir = Vector3.Normalize(attackdir); if (_target.type == CharacterType.MONSTER && isCrit && !isDodge) { cameraCtrl.Hitcam(); } targetAI.OnHit(damage, attackdir, character, isCrit, isDodge); }
public void atk() { if (atkTarget == null) { Debug.Log("target is null"); currentState = IDLE; return; } if (atk_ez_time > 0) { return; } GameObject target = atkTarget.gameObject; if (currentState != ATK) { currentState = ATK; } else if (isInAttackArea(target.gameObject, getAtkRange()) && !atkTarget.ai.IsDied()) { //Debug.Log("is attacked " + target.gameObject); currentState = ATK; //atk_ez_time = GetAnimaLen("attack1") + 0.2f; // TODO 如果有其它的硬直存在?, TODO,这里应该为技能的CD、攻击的CD等设置 atk_ez_time = character.atkSpeed; AbstractAI targetAI = atkTarget.ai; if (!targetAI.IsDied()) { Skill skill = getSkill(); PlayClip(skill.atkClip); animation.PlayQueued("idle"); float delay = 0.5f;// TODO 这里的delay应该是动作播放到到受击帧的时间 StartCoroutine(LateAtk(atkTarget, delay, skill)); } } gameObject.transform.LookAt(target.gameObject.transform.position); }