void AttackUpdate()
    {
        float distance = Vector3.Distance(target.transform.position, transform.position);

        if (distance > attackRange + 0.5f)
        {
            state = goblinState.move;
        }
    }
    IEnumerator WaitUpdate()
    {
        state = goblinState.wait;
        float waitTime = Random.Range(1.0f, 3.0f);

        yield return(new WaitForSeconds(waitTime));

        state = goblinState.idle;
    }
    void MoveUpdate()
    {
        Vector3 diff          = Vector3.zero;
        Vector3 lookAtPositon = Vector3.zero;

        switch (state)
        {
        case goblinState.patrol:
            if (target.transform.position != Vector3.zero)
            {
                diff = target.transform.position - transform.position;

                if (diff.magnitude > attackRange)
                {
                    StartCoroutine(WaitUpdate());
                    return;
                }

                lookAtPositon = new Vector3(target.transform.position.x,
                                            transform.position.y,
                                            target.transform.position.z);
            }
            break;

        case goblinState.move:
            if (target != null)
            {
                diff = target.transform.position - transform.position;

                if (diff.magnitude < attackRange)
                {
                    state = goblinState.attack;
                    return;
                }

                lookAtPositon = new Vector3(target.transform.position.x,
                                            transform.position.y,
                                            target.transform.position.z);
            }
            break;
        }

        Vector3 direction = diff.normalized;

        direction = new Vector3(direction.x, 0, direction.z);

        Vector3 moveAmount = direction * speed * Time.deltaTime;

        transform.Translate(moveAmount, Space.World);
        transform.LookAt(lookAtPositon);
    }
 private void OnTriggerEnter(Collider other)
 {
     if (other.gameObject.CompareTag("Player Attack"))
     {
         HP -= 10;
         if (HP > 0)
         {
             anim.CrossFade(damage.name);
             //Instantiate(damageEffect, other.transform.position, Quaternion.identity);
             DamageTweenEffect();
         }
         else
         {
             state = goblinState.die;
         }
     }
 }
    private void Start()
    {
        state = goblinState.idle;
        anim  = GetComponent <Animation>();

        anim[idle.name].wrapMode   = WrapMode.Loop;
        anim[move.name].wrapMode   = WrapMode.Loop;
        anim[attack.name].wrapMode = WrapMode.Once;
        anim[damage.name].wrapMode = WrapMode.Once;
        anim[damage.name].layer    = 10;
        anim[die.name].wrapMode    = WrapMode.Once;
        anim[die.name].layer       = 10;

        AddAnimationEvent(attack, "OnAttackFinish");
        AddAnimationEvent(damage, "OnDamageFinish");
        AddAnimationEvent(die, "OnDieFinish");

        skinnedMeshRenderer = transform.Find("body").GetComponent <SkinnedMeshRenderer>();
    }
    void IdleUpdate()
    {
        if (target == null)
        {
            Vector3 randomTarget = new Vector3(transform.position.x + Random.Range(-10.0f, 10.0f),
                                               transform.position.y + 1000.0f,
                                               transform.position.z + Random.Range(-10.0f, 10.0f));

            Ray        ray        = new Ray(randomTarget, Vector3.down);
            RaycastHit raycastHit = new RaycastHit();
            if (Physics.Raycast(ray, out raycastHit, Mathf.Infinity))
            {
                randomTarget.y = raycastHit.point.y;
            }

            target.transform.position = randomTarget;
            state = goblinState.patrol;
        }
        else
        {
            state = goblinState.move;
        }
    }
 void OnSetTarget(GameObject obj)
 {
     target = obj;
     state  = goblinState.move;
 }