public virtual bool DecreaseLife(float damage) { if (currenthp <= 0) { return(false); } currenthp -= damage; bloodChangeEvent.Invoke(currenthp / maxhp); if (currenthp <= 0 && state != MovetionState.DEAD) { SmallMap.Instance.RemoteMonsterIcon(gameObject); agent.Stop(); state = MovetionState.DEAD; monAnimationCon.Die(); GetComponent <CapsuleCollider>().enabled = false; GetComponent <NavMeshAgent>().enabled = false; GetReward(); return(true); } else if (currenthp <= 0 && state == MovetionState.DEAD) { return(false); } currentSkillID = UnityEngine.Random.Range(0, skills.Length); hideSkillTipsEvent.Invoke(); monAnimationCon.Injured(); if (!isDetectePlayer) { isDetectePlayer = true; ContestEnemy(); } return(true); }
// Use this for initialization protected void Start() { base.Start(); agent = GetComponent <NavMeshAgent>(); if (agent == null) { Debug.LogError("need Component NavMeshAgent"); } monAnimationCon = animationCon as MonsterAnimationController; if (monAnimationCon == null) { Debug.LogError("need Component MonsterAnimationController"); } monAnimationCon.SetAttackSpeed(attackSpeed); monAnimationCon.SetMoveSpeed(moveSpeed); agent.speed = moveSpeed; currenthp = maxhp; state = MovetionState.IDLE; currentSkillID = UnityEngine.Random.Range(0, skills.Length); bloodChangeEvent.Invoke(currenthp / maxhp); SmallMap.Instance.AddMonsterIcon(gameObject); if (showEffect != null) { Instantiate(showEffect, transform.position, transform.rotation); } }
protected virtual void MoveControl() { float deltaTime = Time.deltaTime; if (!(deltaTime > 0)) { return; } if (currenthp <= 0.0f) { deleteTime += Time.deltaTime; if (deleteTime >= GameControl.Instance.EnemyDeleteTime) { if (dieEffect != null) { Instantiate(dieEffect, transform.position, transform.rotation); } Destroy(this.gameObject); } hideSkillTipsEvent.Invoke(); return; } if (reactTime < GameControl.Instance.EnemyReactTime) { reactTime += Time.deltaTime; return; } //找不到目标则寻找目标 if (player == null) { FindTarget(); if (player == null) { agent.Stop(); return; } } //进行寻路 Vector3 toTarget = player.transform.position - transform.position; toTarget.y = 0.0f; if (toTarget.magnitude > detectRange && !isDetectePlayer) { //正在站岗 agent.Stop(); state = MovetionState.IDLE; } else { if (!isDetectePlayer) { isDetectePlayer = true; ContestEnemy(); } if (monAnimationCon.IsAttacking() || monAnimationCon.IsInjured() || state == MovetionState.DEAD) //攻击和受伤时不位移和旋转 { agent.Stop(); } else if (toTarget.magnitude > skills[currentSkillID].range) //追踪时位移和旋转 { MoveTo(player.transform.position); RotateTo(toTarget); state = MovetionState.CHASE; } else if (toTarget.magnitude <= skills[currentSkillID].range) //瞄准的时候只旋转 { agent.Stop(); float angle = GetAngle(toTarget); if (angle <= skills[currentSkillID].angle * 0.3f) { state = MovetionState.ATTACK; } else { RotateTo(toTarget); state = MovetionState.CHASE; } } } }