public void Setup(EnemySpawner enemySpawner)
{
    this.enemySpawner = enemySpawner;

    ChangeState(WeaponState.SearchTarget);
}

private Coroutine searchTargetCoroutine;

public void ChangeState(WeaponState newState)
{
    if (weaponState == newState)
        return;

    Debug.Log("Changing state from: " + weaponState.ToString() + " to: " + newState.ToString());

    StopAllCoroutines();

    weaponState = newState;

    if (weaponState == WeaponState.SearchTarget)
    {
        searchTargetCoroutine = StartCoroutine(SearchTarget());
    }
    else if (weaponState == WeaponState.AttackToTarget)
    {
        StartCoroutine(AttackToTarget());
    }
}

IEnumerator SearchTarget()
{
    while (weaponState == WeaponState.SearchTarget)
    {
        // 타워가 활성화되지 않은 경우 바로 탈출
        if (!gameObject.activeInHierarchy) yield break;

        float closestDistSqr = Mathf.Infinity;
        Transform closestEnemy = null;

        foreach (var enemy in enemySpawner.enemyList)
        {
            float distance = Vector2.Distance(enemy.transform.position, transform.position);
            if (distance <= range && distance < closestDistSqr)
            {
                closestDistSqr = distance;
                closestEnemy = enemy.transform;
            }
        }

        if (closestEnemy != null)
        {
            attackTarget = closestEnemy;
            Debug.Log("Target found: " + attackTarget.name);
            ChangeState(WeaponState.AttackToTarget);
        }
        else
        {
            attackTarget = null;
        }

        yield return new WaitForSeconds(0.2f);
    }
}

IEnumerator AttackToTarget()
{
    while (attackTarget != null)
    {
        float distance = Vector3.Distance(attackTarget.position, transform.position);

        if (distance > range)
        {
            Debug.Log("Target out of range, searching for new target.");
            attackTarget = null;
            ChangeState(WeaponState.SearchTarget);
            yield break;
        }

        Debug.Log("Attacking target at " + Time.time);
        yield return new WaitForSeconds(attackRate);

        Shoot();
    }

    Debug.Log("Target lost, returning to search state.");
    ChangeState(WeaponState.SearchTarget);
}

void Shoot()
{
    Debug.Log("Shooting projectile at " + Time.time);
    Instantiate(projectilePrefab, spawnPoint.position, Quaternion.identity);
}

코드는 대충 이렇고



a15714ab041eb360be3335625e8277644d34c87c6fc379f0e9b0980eb647e72116



마우스 클릭하면 타워를 설치하고 저절로 저 Setup 함수를 한번 실행시키는데
그러자마자 이런 메모리 관련 오류가 진짜 개 많이 뜸. 지피티도 못하던데 해결방법 있음?