ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 내일배움캠프 54일차 TIL - 최종 프로젝트 기초 개발 3
    TIL/Unity 2024. 7. 3. 17:06

     

    [한 줄 요약]

    인벤토리 기능을 끝마치고, 고양이를 완전히 완성시키기 위한 작업에 들어갔다.

    수준별 특강으로 최적화에 대해 학습하였다.


    [학습 내용]

     

    최종 프로젝트 기초 개발


    인벤토리 완성

    인벤토리 아이템 정보 패널

    아이템 슬롯을 클릭하면 해당 슬롯의 데이터를 받아와 아래에 아이콘과 설명을 출력하는 패널을 제작했다.

    아이템 정보 패널

     

    아이템 제거

    아이템 제거 시 선택한 슬롯의 갯수를 하나씩 감소시키고, 남은 갯수가 하나일 경우 슬롯을 비우는 기능을 제작했다. 현재는 버리기 기능이 직접적으로 없고, 아이템 사용 시 하나 제거하도록 구현하였다.

    현재 갯수가 4개이다.
    아이템 사용시 하나가 줄어든다.
    모두 사용 시 아이템 슬롯이 비워진다.

     

    고양이 데이터

    고양이 데이터 항목 추가

    기존의 데이터에 새로운 항목을 더했다. 확장성을 고려하여 스프라이트와 번호, 설명 등을 추가하였다.

    • Icon : 스프라이트 (Idle상태 1번 스프라이트)
    • SerialNo : 고양이 고유 번호
    • Description : 캐치 시에 출력할 간단한 설명

     

    SO 파일 추가

    이렇게 만들어진 데이터를 50개 가량으로 늘렸다. NPC로 사용될 고양이는 이름에 _NPC를 붙여주고, 랭크를 0으로 설정해주었다. 

     

    고양이 SO 목록

     

    최적화 특강


    초당 프레임(FPS)

    초당 프레임

    • FPS: 컴퓨터가 1초에 화면을 몇 번 그리는지
    • ms: 다음 화면을 그리기까지의 시간 간격

     

    초당 프레임 제한

    FPS가 높을 필요가 있는지 먼저 생각해보는 게 좋다.프레임 단위로 게임 결과가 갈리는 게임이 아니라면, 프레임을 제한하는 것이 좋다.

    특히 모바일 기기의 경우 발열이 심해질 수 있으로 제한을 두는 것이 권장된다.

     

     

    배치(Batch)

    배치

    Draw Call과 Set Pass Call의 명령어들을 합친 것을 배치(Batch)라고 한다.

    커맨드 버퍼와 배치

     

     

    이미지 사용

    큰 이미지 사용

    크기가 큰 이미지를 사용한다면 사이즈를 줄여주는 게 좋다.

     

    압축이 되는 형식의 이미지 사용

    2의 거듭제곱(혹은 4의 배수, PoT)의 사이즈를 가진 정사각형 이미지를 사용하면 특정한 형식의 압축이 가능하다.

    예를 들어 512 x 306 사이즈의 이미지를 쓰는 것보다, 512 x 512 사이즈의 이미지를 쓰는 것이 좋다.

     

    스프라이트 아틀라스

    여러 스프라이트들을 하나로 합쳐주는 게 좋다. 이 때 사용하는 것이 스프라이트 아틀라스(Sprite Atlas)다. 스프라이트 아틀라스를 생성하고 Objects for Packing에 이미지들을 넣으면 자동으로 PoT 형태로 그려준다.

    단, 상황에 따라 소수의 스프라이트를 쓰기 위해 아틀라스 전체를 가져오는 게 더 손해일 수도 있으므로, 여러 요소들을 잘 고려하는 것도 중요하다.

     

     

    스크립트 최적화

    프로파일러 사용

    프로파일러

     

    가비지

    new 키워드를 이용하여 생성한 객체를 한 번 쓰고 마는 형식의 코드는 자제하는 것이 좋다.

     

    디버그 코드 제거

    디버그 코드가 남아있으면 보안 상의 문제도 있지만, 성능도 꽤나 잡아먹는다. 개발이 완료되면 디버그 코드를 모두 지워주는 것이 좋으며, 혹은 빌드 때 제거되는 Debug.Assert()를 대신 사용하는 것도 좋다.

     

    카메라

    Camera.main은 Tag를 검색하는 형태이기 때문에 캐싱해서 사용해야 한다.

     

    벡터 연산 순서

    float * float * vector와 float * vector * float의 연산량은 다르다. 연산을 줄이는 쪽으로 연산 순서를 짜는 것이 좋다.

     

    LINQ

    닷넷 7 버전 이상부터는 LINQ가 더 빠를 수 있다. 그런데 유니티는 하위 버전의 닷넷을 쓰므로 사용을 지양하는 것이 좋다.

     

    기타

    • 오브젝트 풀
    • Find, GetComponent 계열은 최소한으로 하고 캐싱하기
    • 쓰지 않는 유니티 이벤트 함수 제거
    • 불필요한 static 사용 지양

     


    [회고]

    오늘부로 수준별 특강이 종료되었다. 다른 분반의 특강도 시간 날 때 돌려봐야겠다.

    인벤토리가 생각보다 버그 없이 잘 완성된 거 같다. 다시 고양이 작업에 들어가서 빠르게 다른 팀원들과 기능을 연결시켜야겠다. 적어도 이번주 금요일에는 캐치존과 던전과 마을이 연결되어있는 것을 목표로 잡아야겠다.