Пример #1
0
    IEnumerator FollowTarget()
    {
        if (!sc.unit.alive)
        {
            yield break;
        }
        if (!onState)
        {
            yield break;
        }
        if (!sc.unit.onAi)
        {
            yield break;
        }

        controller.modelAnim.Play("walk");

        while (true)
        {
            Vector3 targetPos = sc.target.transform.position;

            controller.transform.position = Vector3.MoveTowards(
                controller.Position,
                targetPos,
                controller.unit.status.move_speed * Time.deltaTime);

            // 왼쪽이 0
            // 투석기만 좌우가 다르다.
            // 왼쪽이 1
            int dir = (targetPos.x - controller.Position.x < 0) ? 1 : 0;
            controller.modelTr.rotation = Quaternion.Euler(new Vector3(0, 180 * dir, 0));

            if (!sc.target.alive)
            {
                sc.Restart();
                break;
            }

            yield return(null);
        }
    }
    public override IEnumerator Update()
    {
        /* 공격 가능한 시간이 되면 공격하고.
         * 추격 스테이트로 간다.
         *
         * 공격이 불가능 하다면.
         * 시간을 더하고 추격 스테이트로 간다.
         */

        if (!sc.target.alive)
        {
            sc.Restart();
            yield break;
        }

        controller.modelAnim.Play("idle");

        // 공격 가능한 시간이 되면.
        if (currentTime >= controller.unit.status.attack_speed)
        {
            if (checkTime != null)
            {
                controller.StopCoroutine(checkTime);
                checkTime = null;
            }

            currentTime = 0f;

            // 공격을 한다.
            AttackStart();

            // 공격이 끝날때 까지 기다린다.
            yield return(new WaitUntil(() => attackAnimComplete));

            // 공격이 끝나면 다시 시간을 계산한다.
            checkTime = sc.StartCoroutine(CheckTime());
        }

        // 스테이지를 변경하고 끝낸다.
        controller.ChangeState(sc.chaseSate);

        yield break;
    }