Metaverse/Unity

RPG Project 오류 일지 - Respawn

onenewkong 2023. 8. 15. 21:37

오브젝트 풀에 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; 
		}
	}
}

 

 

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

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

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

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

'Metaverse > 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