Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
0
    // 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);
        }
    }
Exemplo n.º 3
0
    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;
                }
            }
        }
    }