a15714ab041eb360be3335625e82726f7229436470228cb1e3e52aaa81c75990d5


사정거리 내에 들어오면 이런식으로 탄을 쏘는 타워디펜스 게임을 만드는 중임.

그런데 Distance가 이상하게 거리를 측정하는 문제가 있음.


저 사정거리 표시하는 원은 설정된 사정거리대로 크기를 정함.

그래서 사정거리 안의 적들은 저 원 안에 들어가 있는걸로 표시가 됨.




a15714ab041eb360be3335625e82726c3a58470bc68896051ad1eabb5e29d23885


그런데 문제는 저렇게 사정거리를 나갔는데도 공격을 해버린다는거임.
If문의 문제인가 싶어서 디버그를 확인해봤는데 저렇게 나갈때만 Distance의 측정이 이상해짐.

많이 작아서 잘 안보일수도 있지만 디버그 창에 지금 노리고 있는 타겟과의 거리가 나와있음.


(타겟하고 있는 적과의 거리) and 4 (사정거리)

왜 들어갈때와 나갈때의 거리 측정 단위가 달라지는지 이유를 도저히 모르겟다...


IEnumerator TryAttackParticleBullet()

{

    while (true)

    {

        // 적이 사정거리 내에 있는지 확인

        if (!IsPossibleToAttackTarget())

        {

            attackTarget = null;

            ChangeState(WeaponState.SearchTarget);

            yield break;

        }


        // 더 나은 타겟이 있는지 확인

        Transform betterTarget = FindBetterTarget();

        if (betterTarget != null && betterTarget != attackTarget)

        {

            attackTarget = betterTarget;

        }


        // 공격 수행

        Shoot();


        // 공격 딜레이

        yield return new WaitForSeconds(template.weapon[level].rate);

    }

}


bool IsPossibleToAttackTarget()

{

    if (attackTarget == null)

        return false;


    float distance = Vector3.Distance(attackTarget.position, transform.position);

    debug = distance;


    if (distance > template.weapon[level].range)

    {

        attackTarget = null;

        return false;

    }


    Debug.Log(distance + " and " + template.weapon[level].range);


    return true;

}


Transform FindBetterTarget()

{

    Transform bestTarget = attackTarget; // 현재 타겟

    float closestDistance = CalculateRemainingDistance(attackTarget.GetComponent<Enemy>());

    int bestWayPointIndex = attackTarget.GetComponent<Enemy>().GetCurrentIndex();


    // 다른 적들을 탐색해 현재 타겟보다 더 우선순위가 높은 적을 찾음

    for (int i = 0; i < enemySpawner.enemyList.Count; ++i)

    {

        Enemy enemy = enemySpawner.enemyList[i];

        float remainingDistance = CalculateRemainingDistance(enemy);

        int enemyWayPointIndex = enemy.GetCurrentIndex();


        // 더 멀리 진출한 적이 있거나, 같은 웨이포인트를 향해 가는 적 중에 더 가까운 적을 찾아 타겟 변경

        if (enemyWayPointIndex > bestWayPointIndex ||

            (enemyWayPointIndex == bestWayPointIndex && remainingDistance < closestDistance))

        {

            bestTarget = enemy.transform;

            closestDistance = remainingDistance;

            bestWayPointIndex = enemyWayPointIndex;

        }

    }


    // 현재 타겟보다 더 나은 적을 찾았으면 반환, 없으면 null 반환

    return bestTarget != attackTarget ? bestTarget : null;

}