오늘 있었던 문제점과, 해결법에 대해 작성해보겠다.
StageManager는 일정 시간동안, 정해진 마리수만큼 몬스터를 소환하는 스크립트이다. 몬스터의 소환은 ObjectPool을 통해 실행한다.
이때 소환된 몬스터는 지정된 체력, 속도, 애니메이션 등을 보유해야한다. 해당 값은 Scriptable Object로 보유한다.
SO는 필요없을것같다.
SO는 "같은 값"을 가지는 "여러 종류"의 오브젝트의 변수들을 저장하기 위한 것이다.
예를 들면 고블린은 공격력8, 체력 4, 스켈레톤이 공격력 5, 체력 10이라고 정했을때, 이런 값의 템플릿처럼 사용하는 것이다.
하지만 이번 프로젝트의 적들은 다른값을 가지는 수많은 오브젝트들이다. 따라서 SO를 사용하는것은 굳이굳이..인 느낌이 되어버렸다.
그럼에도 우선 monsterSO를 시작으로 사용되었기 때문에 수정해보도록 했다.
StageManager도 하나의 SO를 지니고, 해당 값들을 스테이지 시작 전에 수정하도록 했다. 문제는 monsterSO를 넘겨주는 부분이었다.
오브젝트의 so를 불러오고, 그 so를 수정하는게 어느 스크립트에서든 힘들어서 튜터님을 찾아가니 ObjectPool을 수정해보라는 답을 받았다.
기존에 매개변수 string tag를 받는 소환 메서드에 매개변수 MonsterSo를 추가하여 동명의 메서드가 다른 역할을 하도록 할 수 있다. (예전에 배웠는데 까먹음;;)
따라서 소환 메서드에 (string tag, MonsterSO so)를 넘겨주면 그걸 받아 ObjectPool 메서드에서 넣어줄 수 있게 되었다.
obj.GetComponent<MonsterController>().monsterSO = monsterSO;
하지만 해결되지 않은 부분은 여전히 존재한다.
ObjectPool에서 GetComponet구문을 사용하고 있기 때문이다.
GetComponent 컴포넌트를 가져오는데 편리하지만, 성능을 많이 차지하여 프레임속도가 많이 떨어질 수 있다. objectpool에서 프리펩들을 소환할때마다 getcomponet를 사용한다면 이 부분도 부하가 걸릴 수 있다.
저 부분을 최적화하기 위해 조금 알아봤으나 도통 모르겠다...