물리 엔진을 이용한 수박 게임을 만들었다.
프레임 드랍을 줄이기 위해 Instantiate와 Destroy를 오브젝트 풀로 바꾸었고,
코루틴 함수도 없애고 Invoke로 바꾸었다.
중간까지는 괜찮지만 박스에 중간쯤 과일이 가득차면,
과일이 제멋대로 날아가고 Merge 함수도 작동을 하지 않는다.
가끔 과일이 합쳐지면서 박스 밖으로 나가기도 한다.
버벅거림이 심해지고 Merge 함수 호출이 미뤄질 때 전후 사진이다.
Physics가 과도하게 CPU를 사용중인걸 볼 수 있다.
Collider 줄이기
과일 프리팹에 캡슐 콜라이더 2~3개, 폴리곤 콜라이더가 들어있었는데
이걸 캡슐 콜라이더 1~2개로 줄이고 폴리곤 콜라이더도 최대한 없앴다.
과일이 박스를 꽉 채웠는데도 CPU 사용량이 아까보다 줄었다.
Sprite Atlas 사용
Sprite Atlas를 사용하여 과일의 스프라이트를 모두 넣었다.
상태를 보면 Batches와 SetPass calls가 7에서 4로 줄었다.
시뮬레이션 끄기
rigidbody 컴포넌트의 시뮬레이션이 켜진 상태로 풀에 반환된다.
풀에 반환된 객체를 다시 불러올 때 시뮬레이션이 켜져있기 때문에 바닥으로 떨어져버린다.
이 때 Merge 변수도 켜진 상태이기 때문에 다시 불러왔을 때 Merge 함수도 작동하지 않는 것이다.
객체를 불러올 때 시뮬레이션을 끄고 Merge 변수 상태도 false로 바꿔준다.
Lerp 함수 삭제
두 과일이 만나 병합될 때 부딪힌 객체로 부드럽게 이동하도록 Lerp 함수를 사용했었다.
하지만 박스의 콜라이더를 무시하고 이동하기 때문에 병합되는 과정에서 박스 밖으로 이탈하기도 했었다.
사실 Lerp 함수가 너무 빠르게 움직여 별 차이도 없고 연산도 많이 쓰는 것 같아서 삭제했다.
Lerp가 사라지면서 코루틴도 필요가 없게되어 Invoke로 대체했다.
회전값 보정
오브젝트 풀 관련 수정 사항이 많은 것 같다.
과일이 수직이 아니라 대각선으로 떨어지는 현상은 과일의 회전값과 관련 있었다.
변수값이나 상태, transform 등이 초기화되지 않은 상태로 비활성화 되기 때문에
다시 활성화 시킬 때 초기화를 시켜줘야 한다.
localRotation 값을 Quaternion.identity로 하여 활성화되도록 했다.
CPU 사용률이 많이 최적화되었다.
이제 박스가 꽉 차도 모든 함수가 정상적으로 작동한다.
'유니티' 카테고리의 다른 글
[유니티] 게임 재화 저장하는 방법 : PlayerPrefs + XOR 연산, JSON + AES-256 (0) | 2025.02.25 |
---|---|
[유니티] C#에서 여러 값을 반환하는 방법 : out, Tuple (0) | 2025.02.24 |
[유니티] 디자인 패턴 : 오브젝트 풀링 (Object Pooling) (0) | 2025.02.15 |
[유니티] #18 광부 타이쿤 게임 만들기 (구름, 통화 시스템) (0) | 2025.02.08 |
[유니티] #17 광부 타이쿤 게임 만들기 (샤프트 매니저 부스트) (0) | 2025.02.08 |