1 minute read

작업 내용

유닛 추격 기능 수정

맵이 기존에는 단순한 사각형이었어서 그리드와 NavMesh의 범위가 일치하여 문제가 없었는데, 이제는 맵이 복잡해져서 유닛이 그리드 기준으로만 움직여서는 이동 불가지점이 목표 위치가 되는 문제가 발생했다.
그래서 기존의 추격시 위치 탐색 함수를 수정했다 :

private Vector3 CalculateNewTargetPosition()
{
    Vector3 directionToEnemy = (targetEnemy.transform.position - userUnit.transform.position).normalized;
    Vector3 newPosition = GridGenerator.Instance.Grid.WorldPositionInBound(targetEnemy.transform.position - directionToEnemy * (attackRange - 1.0f));
    NavMeshHit hit;
    NavMesh.SamplePosition(newPosition, out hit, 10f, 1);
    return hit.position;
}

UserUnitTrackingState 클래스에 새 위치를 찾는 함수에 NavMesh.SamplePosition으로 기존에 그리드 기준으로 찾은 목표지점에서 가까운 NavMesh 위에 위치를 돌려주게 하였다.

스프라이트 아틀라스 추가

우리가 쓰던 에셋인 SPUM이 유닛을 개발자가 자유롭게 만들어서 쓸 수 있게 해주어 좋지만, 딱히 최적화가 잘되어있는 편이 아니었다. 그래서 Game씬에 Stats를 확인해보면 드로우콜 덩어리인 Batches가 유닛 1개 생성될 때 마다 12~15개 가량 불렸는데, 이를 줄이기 위해 스프라이트 아틀라스로 유닛들에 쓰이는 스프라이트를 한번에 불러오기로 했다
스크린샷 2024-07-31 195940
처음에는 유닛별로 아틀라스를 나눠야하나 했지만 그러기엔 유닛별로 겹치는 스프라이트가 많아서 오히려 모호함을 불러일으켜 배치수치가 전혀 줄지 않았다.
이를 줄이려면 내가 하나하나 직접 스크립트상으로 각 유닛의 각 파츠에 필요한 아틀라스에서 스프라이트를 붙여줄 수도 있겠지만 그러면 작업량이 훨씬 늘어나니 차라리 하나의 아틀라스에 모든 유닛의 스프라이트를 다 모으기로 했다.
각 유닛의 모든 파츠에 쓰이는 스프라이트를 모두 찾아 넣는데는 시간이 엄청 걸리긴 했다.
끝나고나니 유닛 1기당 생성되는 배치 수가 4개 가량으로 확 줄어들었다.

마무리

아틀라스의 힘을 제대로 느낀날이다. 확실히 드로우콜이 줄어들었다. 살짝 아쉬운점이라면 안쓰는 스프라이트들은 끝나면 메모리에서 사라질 수 있게 유닛별로 따로 아틀라스를 만들고싶기는 했다.
근데 시간이 남아도는게 아니기 때문에 그런 일은 나중에 시간이 많이 남는 날에 해볼지도 모르겠다.
처음부터 최적화가 잘된 에셋을 쓴다면 고민할 일도 없는 문제다.
참고로 원래는 자동전투를 만들까 하긴 했었는데, 게임 특성상 pc게임이라 자동전투가 불필요하기도하고 최적화, 필수 구현 사항을 먼저 구현하는게 우선이라 생각이 들어 일단 미뤄두기로 한다.