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);
}
코드는 대충 이렇고
코드는 대충 이렇고
마우스 클릭하면 타워를 설치하고 저절로 저 Setup 함수를 한번 실행시키는데
그러자마자 이런 메모리 관련 오류가 진짜 개 많이 뜸. 지피티도 못하던데 해결방법 있음?
재귀함수마냥 계속 함수호출스택쌓여서 그런 것 같아 보이는데
맞네 타겟이 있으면 Search -> AttackToTarget -> Search -> AttackToTarget -> ... 이거네 IDLE상태 만들어서 공격 끝나면 유휴로 넘겨주면 될듯
코드를 복붙하지말고 스샷찍으면 안됨? 가독성이 너무 구려 라이더는 그냥 복붙해도 배경이랑 폰트색 바꿔주던데 비주얼 스튜디오는 안되나봄...