목차
Cooking Knight 4일차
어제 계획했던 대로, 스테이지 씬을 스테이지 답게 굴릴 수 있는 요소들(몹 스폰, 영역 제한, 카메라 무빙)을 완성하고,
오브젝트 풀링이라는 최적화 기법을 사용해보려고 한다.
오브젝트 풀링
StageScene에서 EnemySpawnManager를 구현했다.
Enemy는 맵에 최대로 존재할 수 있는 갯수가 정해져있다.
파괴되어야할 객체를 오브젝트 풀에 담궜다가, 다시 사용하는 방식을 사용하기에 아주 적합하다는 뜻이다.
private Dictionary<GameObject, IObjectPool<GameObject>> _enemyPools = new Dictionary<GameObject, IObjectPool<GameObject>>();
public void InitStage(StageData stageData)
{
this._currentStageData = stageData; //굳이 딥카피할 필요.. 없을듯?
this._currentEnemyCount = 0;
this._defeatedEnemyCount = 0;
_enemyPools.Clear();
foreach (EnemyData enemyData in _currentStageData.enemies)
{
IObjectPool<GameObject> pool = new ObjectPool<GameObject>(() =>
{
GameObject newEnemy = Instantiate(enemyData.prefab, this.transform);
return newEnemy;
},
(obj) =>
{
obj.SetActive(true);
obj.transform.position = _currentStageData.GetRandomSpawnPosition();
Enemy enemy = obj.GetComponent<Enemy>();
if (enemy != null)
{
enemy.enabled = true;
enemy.Init(enemyData, this);
}
},
(obj) =>
{
obj.SetActive(false);
},
(obj) =>
{
Destroy(obj);
},
false,
_currentStageData.maxEnemyCount,
_currentStageData.maxEnemyCount
);
_enemyPools.Add(enemyData.prefab, pool);
}
}
오브젝트 풀은 코드로 직접 구현하지 않고 유니티 자체 API를 사용했다.
개념은 이해하지만 활용해본적이 없었는데 이번에 개념을 확실히 실습하며 확실히 깨우쳤다.
최종 프로젝트 때는 자체적으로 커스터마이징하여 사용해보면 어떨까 싶다!
오브젝트 풀링: 오브젝트 초기화의 중요성
오브젝트 풀링은 이미 사용했던 객체를 재사용하기 때문에,
오브젝트 풀에 담갔다 꺼내 쓰는 오브젝트를 초기화를 시켜 갓 생성한 녀석인 것처럼 포장해주는 것이 중요하다.
예를 들어서 currentHealth를 초기화하지 않으면 해당 객체는 꺼내오는 순간부터 death 상태가 될 것이다.
나도 같은 상황이 발생했는데,
사망 판정을 하고 나면, 다른 피격이나 공격을 할 수 없도록 collider를 모두 끄고, 위치도 고정해주기 위해 rigidbody를 kinematic으로 설정을 바꾸어주었다.
재사용하는 객체들은 collider들이 없어서 공격과 피격 무엇도 되지 못했고, 허공에서 생성되면 땅으로 떨어지지 않았다.
애초에 사망하고 나면 Destroy 할 것이란 생각에 짜서 그렇다.
다음부터는 오브젝트 풀링을 사용할 객체라면 Init() 함수를 고려하고 구현해야겠다는 생각이 들었다.
애니메이션 Sliced Image 사용 시 주의


좌측과 같이 슬라이드하여 애니메이션을 만드니, 사망한 닭이 공중에 살짝 떠있게 되는 문제가 발생했었다.
초기에는 해당 프레임들의 y값만 -0.2로 변경하여 맞췄는데, 이게 사망 판정이다보니 끝나고 나면 바로 오브젝트 풀에 수납되게 된다.
다시 Get하여 사용하게 되면, 아예 애니메이션 Model의 y 포지션이 -0.2가 되어서 Ground와 겹쳐지게 보이는 상황이 발생했다.
처음에는 원인을 모르고 오브젝트 풀에서 꺼내서 다시 사용할때 transform을 초기화해주었었다.
아예 이미지 슬라이스를 우측과 같이, 같은 높이로 잘라서 사용하도록 변경하고, Transform 값을 애니메이션에서 건드리지 않는 방향으로 진행하니 굳이 코드상에서 초기화해줄 필요도 없어졌다.
애니메이션을 위해서 자동으로 슬라이스하여 사용할때, 크기를 어느정도 맞춰줘야 추후에 귀찮은 일을 더하지 않을 수 있다.
느낀점
어제 불면증으로 3시간밖에 못잤다!
전날 시작된 감기기운부터 잠을 안자니 몸살이 그냥 와버린 것 같다.
그래도 오전에 계획했던 것들을 완성했고, 오브젝트 풀링을 사용해봄으로서 어떤 점을 주의해야할지, 경험을 쌓았다!
내일 학습 할 것은 무엇인지
현재 Enemy에서 버그가 조금 있다.
깃 과정에서 무언가 누락된 것처럼 수정하거나 삭제했던 코드들이... 사라졌다....
이 부분들을 확인하고, EnemyData와 StageData를 Data매니저에 등록해서 그 녀석들을 불러오게 하려고 한다.
다른 종류 Enemy 에셋이 더 준비되어 있다고 하시니까, 시간이 남으면 종류를 추가해보려고 한다.
'부트캠프 > 본캠프' 카테고리의 다른 글
| [내일배움캠프_2025SEP09] Cry4Code 팀 결성! (0) | 2025.09.09 |
|---|---|
| [내일배움캠프_2025SEP04] Cooking Knight 발표 & 최종 팀 빌드 (0) | 2025.09.08 |
| [내일배움캠프_2025SEP03] Cooking Knight 3일차 (0) | 2025.09.03 |
| [내일배움캠프_2025SEP02] Cooking Knight 2일차 (0) | 2025.09.02 |
| [내일배움캠프_2025SEP01] Cooking Knight 1일차 (0) | 2025.09.01 |