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