본문 바로가기
Old/Unity

RPG Project 오류 일지 - Respawn

by onenewkong 2023. 8. 15.

오브젝트 풀에 10개의 오브젝트를 할당해두고, 몬스터가 죽어도 전체 개수는 계속 10개로 유지하도록 구현했다.

구현하는 중에 오브젝트 풀을 Manager로 선언해서 싱글톤 패턴을 적용할까 싶었지만, Monster에만 관여하므로 굳이 싶었다.. (프리팹이 더 다양했으면 처음부터 Manager로 올렸을거다) 그래서 최대한 지금 상태에서 생각할 수 있는 방법을 적용하려고 머리를 굴렸다.

유니티 함수의 생명주기를 다 고려해보다가 죽은 몬스터의 인덱스를 찾는건 Update()가 가장 적절하다고 생각했고, 리스폰해주는 함수의 위치를 생각하는건 꽤 어려웠다.. 

이 참에 생명 주기 함수를 모두 복습했고, 코루틴도 복습했지만 적절한 위치가 없었고, 코루틴은 메모리 낭비가 큰 것 같아 InvokeReapeating을 사용하게 되었다.

리스폰 되는 함수가 일정 시간마다 호출되니, 부활한 몬스터의 위치도 일정 시간마다 바뀌는 현상을 마주했다.

그래서 전투팀 긴급회의를 잡았고ㅋㅋㅋ 

두명이서 잠깐 말 없이 생각하다 같은 타이밍에 같은 아이디어를 냈다!

리스폰에 해당하는 코드는 일정시간마다 반복하되, 위치를 설정하는 코드는 조건을 걸자였다. 

 

void Start()
{
    monsterObjectPool = new List<GameObject>();
    area = GetComponent<BoxCollider>();
        
    StopAllCoroutines();

	for (int i = 0; i < poolCount; i++)
	{
		GameObject gameObject = Instantiate(monster);
                        
		monsterObjectPool.Add(gameObject);

		StartCoroutine(Spawn(i));
	}
        
    InvokeRepeating("Respawn", 5, 10);  
}

private void Update()
{
	for (int i = 0; i < poolCount; i++)
	{
		if (monsterObjectPool[i].activeSelf == false)  
		{
			deadIndex = i;
		}
	}
}

private void Respawn()
{
	if (deadIndex < poolCount)     
	{   
		GameObject gameObject = monsterObjectPool[deadIndex];     
		gameObject.SetActive(true);      

		if (!isRespawn)   
		{
			gameObject.transform.position = GetRandomPosition();
			isRespawn = true; 
		}
	}
}

 

 

막상 해보면 꽤나 쉽게 풀리는 문제였는데,,  왜 처음엔 안떠올랐나 싶다.

요즘 프로젝트를 진행하면서 계속 느끼는 점이다...

한 줄 한 줄 주석을 달아보면서 논리 흐름에 따라가다보면 금방 답이 나오는데, 거기서 메모리 효율성까지 고려하고, 어떻게 해야 게임이 더 재밌어질지 생각하다보면 좀 길이 새는건가 싶고, 아직은 경험이 정말정말정말 부족해서 그런 것 같기도 하다. 그래서 하나 해결할 때마다 회의록에 정리해두고 다음번에는 더 쉽게 길을 찾아가려고 노력 중이다..

아직 갈 길이 멀다...!!! 더 노력해야지

'Old > Unity' 카테고리의 다른 글

RPG Project - Event  (0) 2023.09.16
Event  (0) 2023.08.31
Scriptable Object  (0) 2023.07.24
디자인 패턴 요약  (0) 2023.07.24
체감형 AR 디자인 - 최적화  (0) 2023.05.17