티스토리 뷰
오늘 한 일 (회고)
오전
- 토끼 움직임 어색한 부분 수정하기
- 수준별 꾸준실습
오후
- 좀비 죽었는데도 연타 시 움직이는 오류 고치기
- 좀비와 토끼가 나오는 스폰존 만들기
공부한 것
Coroutine
spawnZone을 만들어서 그 영역안에 플레이어가 에 들어가면 rabit이나 좀비가 생성되는 로직을 짯으나
그 영역을 벗어나자마자 사라지는 게임에서 어색한 부분이 생겼습니다.
그래서 어느정도 플레이어와 거리를 두면 사라지게 하는게 좋겠다 생각했으나
update를 통해 하기엔 너무 자원낭비인 것 같아 찾아본 방법이 coroutine이었습니다.
아래는 활용법입니다.
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
for (int i = 0; i < spawnCount; i++)
{
GameObject rabbit = spawnManager.SpawnEnemies(transform.position, PoolObject.rabit);//이 위치에서 스폰
SpawnRabbits.Add(rabbit);
}
}
}
콜라이더 안에 플레이어가 들어오면
SpawnManager에 있는 SpawnEnemines함수를 이용해 spawCount 만큼 토끼를 생성합니다.
그리고 생성한 토끼는 spawndRabbits에 모아줍니다.
private void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
if (deactivateRabbitsCoroutine != null)
{
StopCoroutine(deactivateRabbitsCoroutine);
}
deactivateRabbitsCoroutine = StartCoroutine(DeactivateRabbitsCoroutine());
}
}
여기서부터 코루틴을 사용합니다
플레이어가 영역밖으로 나가고 deactivateRabbitsCoroutine(코루틴)이 null이 아니라면 코루틴 실행을 중단해줍니다
여기서 중단하는 이유는 이미 실행되고 있는 코루틴이 있다면
두개의 코루틴이 같이 동작할 수 있기때문에
시작하기전에 중단해주는 방어코드입니다.
그리고 코루틴을 다시 시작해주면서 deactivateRabbitsCoroutine을 다시 정의해줍니다.
private IEnumerator DeactivateRabbitsCoroutine()
{
foreach (GameObject rabbit in SpawnRabbits)
{
if (rabbit != null)
{
float distance = Vector3.Distance(playerTransform.position, rabbit.transform.position);
if (distance > despawnDistance)
{
rabbit.SetActive(false); // 거리가 멀어지면 비활성화
}
}
yield return new WaitForSeconds(1f);
}
deactivateRabbitsCoroutine = null;
IEnumerator는 C#에서 반복기(iterator)를 나타내는 인터페이스로, 주로 코루틴에서 사용됩니다.
SpawnRabbits 리스트에서 rabbit오브젝트를 꺼내와줍니다
rabbit이 null이 아니라면 플레이어와 rabbit의 거리값을 가져오고
만약 그 거리가 일정거리보다 멀다면 rabbit을 비활성화합니다
그리고 1초 기다린 후 이와같은 작업을 반복합니다
5초후면 모든 토끼가 사라지고 코루틴이 종료됩니다.
deactivateRabbitsCoroutine 을 null로 지정해 참조하고있던 코루틴을 제거해줍니다.
코루틴은 아래와같은 상황에 종료가 됩니다.
코루틴이 종료되는 경우
- 코루틴의 실행이 끝났을 때
- stopCoroutine을 호출 했을 때
- 오브젝트가 비활성화 되거나 파괴할때