Unity 검색

Unity 사용자가 흔히 범하는 실수

최근 업데이트: 2018년 12월

페이지 내용: 개발 단계에서 참고할 가이드입니다. Unity 필드 엔지니어 발렌틴 시모노브(Valentin Simonov)가 제공하는 훌륭한 팁을 통해 스마트하고 효율적인 개발 파이프라인을 구축하고 더 뛰어난 성능의 콘텐츠를 제작하세요.

계획

계획은 모든 소프트웨어 개발 프로젝트에서 가장 중요한 부분입니다. 이 단계에서 결정한 사항은 개발 주기의 이후 단계에서 변경하기 어렵기 때문입니다.

프로젝트를 사전 조사가 불충분함

  • 계획한 기능이 모든 대상 플랫폼에서 실제로 작동하는지 확인하세요.

프로젝트가 지원하는 최소 지원 기기를 파악하지 않음

  • 콘텐츠를 위한 최소한의 지원 기기를 파악하세요.
  • 개발 팀과 QA 팀에 해당 기기를 제공하세요.
  • 이러한 사항을 수행하면 현실적인 성능 수준과 프레임 예산을 설정할 수 있습니다.

프레임 및 에셋 예산을 초기부터 설정하지 않음

  • 다음에 대한 예산을 정하세요.
    • 모델 - 대상 기기가 렌더링할 수 있는 버텍스 수
    • 에셋 - 모델과 텍스처의 디테일 수준
    • 스크립트 및 렌더링 - 로직, 렌더링, 효과 및 하위 시스템의 프레임 비율(%)

추가 팁:

그래픽스 성능 최적화

성능 최적화를 위한 캐릭터 모델링

초기에 씬 및 프리팹을 분할하지 않음

즉, 모든 작업자가 같은 씬을 작업함

  • 레벨을 (추가 로드된) 씬으로 분할하세요.
  • 개별 오브젝트를 프리팹으로 이동하여 각각의 씬에서 편집하세요.
  • 메인 씬 잠금 메커니즘을 설정하고 공유하세요.

에셋 파이프라인 프로세스에 대한 계획이 미흡함

이 프로세스는 적합한 사양의 아티스트 에셋을 프로젝트로 가져오는 과정입니다.

  • 가능한 경우 처음부터 테크니컬 아티스트가 이 과정에 참여하도록 하세요.
  • 에셋 형식과 사양에 관해 명확한 가이드라인을 정하세요.
  • 임포트 시간 테스트를 추가하세요.

추가 팁:

아트 에셋 베스트 프랙티스 가이드

Unity 에셋 임포트

빌드 및 QA 프로세스를 계획하지 않음

  • 빌드 머신을 설정하거나 Unity 팀즈를 활성화하고 설정하세요.
  • 어떤 방법을 통해 기능을 릴리스 빌드로 퍼블리시할 예정인가요?
  • 새로운 빌드는 어떻게 테스트하고 있나요?
  • 이러한 테스트는 자동화되어 있나요?
  • 통계를 기록하고 있나요?

Unity 설정 클라우드 빌드

초기 프로토타입 제작 후 프로젝트를 처음부터 시작하지 않음

프로토타입을 제작하여 경영진으로부터 승인을 받은 후에는 처음부터 프로젝트 제작을 시작하는 것이 좋습니다.

  • 보통 프로토타입 제작 중에는 속도를 기준으로 의사결정을 하게 됩니다.
  • 대략적인 의사결정을 짜깁기하여 게임을 제작하는 것은 프로젝트를 시작하는 좋은 방법이 아닙니다.

Unity 베스트 프랙티스 계획

개발

잘못된 실행과 개발 단계의 실수로 인해 팀의 작업 속도가 지연되며 최종 제품의 품질이 저해됩니다.

버전 관리가 잘못 설정됨

캐시 서버 미사용

JSON 또는 XML 파일로 정적 데이터 저장

  • 이렇게 데이터를 저장하면 로딩 속도가 느려집니다.
  • 파싱으로 인해 가비지가 생성됩니다.
  • 내장된 정적 데이터 저장에는 커스텀 에디터 툴이 있는 ScriptableObjects를 사용하세요.

프로젝트에 미사용 에셋, 플러그인 및 중복 라이브러리가 있음

프로젝트의 미사용 에셋이 게임 빌드 포함될 가능성이 높습니다. 프로젝트에 가비지가 남아있지 않도록 하세요. 버전 제어 시스템을 설정하면 파일을 쉽게 복원할 수 있습니다.

  • 에셋 스토어의 종속성 에셋이 프로젝트에 딸려들어가지 않는지 확인하세요. 예를 들면, 프로젝트에 필요 없는 JSON 라이브러리가 의도치 않게 생성될 수 있습니다.
  • 이전 프로토타입의 오래된 에셋과 스크립트가 남아 있을 수 있습니다.
  • 오래된 에셋을 "삭제된 항목" 폴더로 이동하더라도 리소스 및 스크립트가 게임 빌드에 포함됩니다.

수동으로 진행해야 하는 반복 작업

  • 스크립트를 사용하여 모든 반복 작업을 자동화하세요.
  • 어느 씬에서든 게임이나 인터랙티브 콘텐츠를 "플레이"할 수 있게 하세요.
  • 모든 빌드 절차 단계를 자동화하여 애플리케이션이 클라우드 빌드를 통해, 또는 로컬에서 버튼을 클릭하는 것으로 빌드가 가능하도록 하세요.

에디터에서만 프로젝트를 프로파일링

  • 항상 대상 기기에서 콘텐츠를 프로파일링하세요. 에디터에서만 게임을 프로파일링하면 실제 성능 관련 장애를 확인하지 못할 수 있습니다.

Unity Profiler

빌트인 및 플랫폼별 프로파일링/디버깅 툴을 모두 사용하지 않음

추가 팁:

일반 성능 최적화

셰이더 프로파일링 및 최적화 팁

Unity 프레임 디버거

너무 늦은 개발 주기 단계에 프로파일링 및 최적화 수행

  • 프로파일링을 더 후반부에 진행할수록 성능 비용이 더 많이 소요될 수 있습니다.
  • 초기부터 프로파일링을 수행하여 프로젝트가 프레임, 메모리 및 디스크 용량 예산에 부합하는지 확인하세요.

테스트 데이터를 기반으로 최적화하지 않음

  • 실제로 발생하는 장애를 최적화해야 합니다.
  • 위에서 언급한 툴을 사용하여 정확한 데이터를 취합하세요.

대상 플랫폼에 대한 지식이 부족함

  • 대상 플랫폼에 대한 정보를 충분히 알아보세요.
  • 데스크톱, 모바일과 콘솔 플랫폼에서 발생하는 장애는 제각기 다릅니다.

Unity 베스트 프랙티스 개발

에셋 설정

에셋(모델, 텍스처, 사운드)은 게임 용량의 대부분을 차지합니다. 프로젝트에 잘못된 메시 하나만 포함되어도 프로그래머가 진행한 모든 최적화가 무효화될 수 있습니다.

스프라이트 아틀라스 설정이 잘못됨

  • 타사 툴(예: Texture Packer)을 사용하여 Unity에서 아틀라스를 만들거나 스프라이트를 그룹화하면 게임 내 드로우 콜을 줄일 수 있습니다.

텍스처 설정이 잘못됨

  • 다음을 고려하여 대상 플랫폼에 적합한 텍스처를 설정했는지 확인하세요.
    • 플랫폼이 지원하는 압축 형식은 무엇인가요?
    • 텍스처에 밉맵이 필요한가요?
  • AssetPostprocessor API를 사용하여 새 텍스처에 이러한 설정을 자동으로 적용하는 방법을 구축하세요. 구축 방법은 이 프로젝트에서 참조하실 수 있습니다.에서 확인 가능합니다.
  • 아티스트가 잘못된 설정의 텍스처를 커밋하는 일을 방지하세요.

Unity 에셋 임포트 설정

에셋 번들에 중복 텍스처가 존재함

  • 에셋 번들 빌드 시스템 설정 시 오류를 범하기 쉽습니다. 여기에서 명확한 가이드라인을 확인하세요. 특히 중복 텍스처에 문제가 발생하기 쉽습니다.
  • 에셋 번들 브라우저를 사용하여 종속성을 추적하세요.

Unity 베스트 프랙티스 에셋 설정

프로그래밍

코드 아키텍처와 개발 과정에 관련된 오류 및 실수로 인해 생산성이 저하됩니다.

코드가 매우 추상적이며 내용을 파악하기 어려움

  • 추상적인 엔터프라이즈 코드(Enterprise code)는 해석하기가 쉽지 않으며
  • 추론하기 어렵습니다.
  • 또한 느리게 실행되며 IL2CPP에서 더 많은 코드를 생성해야 합니다.

아키텍처 컨벤션이 정의되지 않았거나 기록이 부실함:

  • 같은 작업을 완료하는 데 다음과 같은 여러 메서드를 사용하는 코드를 작성하지 마세요.
    • 구성 형태(파일, 프로퍼티, 에셋) 사용.
    • 이벤트(Unity 이벤트, C# 이벤트, SendMessage) 사용.
  • 각 오브젝트를 담당하는 관리자는 누구인가요?

Unity 프레임 루프를 충분히 이해하지 못함

  • Awake, OnEnable, Update 및 기타 메서드를 호출하는 시기.
  • 코루틴 업데이트 시기.
  • FixedUpdate 실행 방법.

스크립트 초기화 로직이 Unity 실행 순서에 의존

  • 작동 원리를 합리적으로 설명하지 못하거나 스크립트 실행 주문을 남용합니다.

로직이나 애니메이션 스크립팅 시 프레임 속도를 고려하지 않음

  • FPS 독립형 스크립트에는 Time.deltaTime을 사용하세요.

추가 팁:

Scriptable Object로 설계하는 멋진 방법 세 가지

더 나은 스크립팅 경험

Unity 베스트 프랙티스 프로그래밍

CPU 성능

CPU 사용량이 높으면 게임플레이의 반응이 "지연"되며 배터리 수명이 짧아집니다.

Unity CPU 프로파일러

지나치게 많은 스크립트에 Update() 메서드가 사용됨

  • 네이티브 -> 관리형 호출을 사용하면 어느 정도의 오버헤드가 발생합니다. 자세한 내용은 이 블로그 게시물에서 확인하세요.
  • 대신 커스텀 관리자를 사용하세요.

모든 커스텀 동작이 Update/Awake/Start 메서드가 정의된 추상 클래스를 상속함

  • 그러면 모든 스크립트에 Update() 메서드가 존재하게 됩니다.

모든 게임 시스템이 프레임마다 업데이트됨

  • 다음과 같은 게임 및 콘텐츠 내 각 시스템의 업데이트 빈도를 정하세요.
    • 오브젝트 이동.
    • AI 및 경로 탐색.
    • 로깅 및 게임 상태 저장.
    • 기타 "무거운" 시스템

자주 필요한 오브젝트의 데이터와 레퍼런스가 캐시되지 않음

자주 필요한 캐시 데이터는 다음과 같습니다.

  • Reflection
  • Find()
  • Camera.main
  • GetComponent()

자주 인스턴스화되는 오브젝트가 풀링되지 않음

  • 오브젝트 인스턴스화가 느립니다.
  • 게임 시작 시 오브젝트 풀을 생성하세요.
  • 새로운 오브젝트를 만들지 말고 기존 오브젝트를 재사용하세요.

모든 프레임에 메모리가 할당됨

  • 프레임마다 소량의 메모리를 할당하더라도 언젠가는 급격한 GC 증가 문제가 발생합니다.
  • 가급적 모든 할당을 제거하세요.

메모리를 할당하지 않는 다른 방법이 아닌 메모리 할당 API를 사용하세요

  • LINQ.
  • 스트링 연결.
  • 배열을 반환하는 Unity API:
    • Physics.RaycastAll, Mesh.vertices, GetComponents 등.

추가 팁:

C# 데이터 구조 및 Unity API를 통한 최적의 작업 수행

Unity 베스트 프랙티스 CPU 성능

GPU 성능

GPU 사용량이 높으면 프레임 속도가 저하되고 배터리 수명이 단축되며 "느리게 실행되는" 게임/콘텐츠로 인식됩니다.

Unity GPU 프로파일러

모바일: 프로젝트에 오버드로우가 지나치게 많이 발생함

  • 모바일 GPU에서 초당 드로우할 수 있는 픽셀 수에는 한계가 있습니다.
  • 오버드로우는 모바일에서 성능을 정체시키는 가장 큰 요인입니다.
  • 불필요하게 투명한 이미지를 그리지 마세요.
  • 보다 복잡한 메시를 사용하여 완전히 투명한 영역을 자르세요.

모바일: 셰이더가 너무 복잡함

  • 모바일에 스탠다드 셰이더(Standard Shader)를 사용하지 마세요.
  • 전용 커스텀 셰이더를 만드세요.
  • 저사양 기기의 경우 간소화된 버전을 사용하거나 일부 효과를 해제하세요.

포워드 렌더링에 지나치게 많은 동적 조명 사용

  • 조명을 추가할 때마다 조명이 비추는 모든 오브젝트에 렌더 패스가 추가됩니다.

프로젝트의 잘못된 설정으로 인해 동적 배칭이 중단됨

  • 오브젝트를 동적 배칭하려면 서로 "비슷"해야 합니다.
  • 프레임 디버거는 일부 오브젝트가 배치되지 않은 이유를 표시합니다.

LOD가 사용되지 않거나 올바르게 설정되지 않음

  • LOD를 사용하면 추가 오브젝트 렌더링에 소비되는 리소스를 절감할 수 있습니다.

추가 팁:

드로우 콜이 배칭되지 않는 이유

모바일 최적화 베스트 프랙티스

Unity 베스트 프랙티스 GPU 성능

UI 성능

Unity UI 아티스트에게 친화적인 툴이지만 잘못 설정하기 쉬우며, 이러한 경우 CPU와 GPU 리소스를 많이 소모할 수 있습니다.

Unity UI

여러 해상도와 종횡비를 고려하지 않음

  • 해상도와 종횡비가 각기 다른 여러 대의 기기에서 UI 테스트
  • 기기마다 다른 UI 화면을 구축하는 것이 나은 경우도 있음

같은 캔버스 내에 애니메이션화된 요소들이 존재함

  • 요소가 변경되면 캔버스에서 새로운 복합 메시를 생성해야 함
  • 복잡한 캔버스의 경우 이 과정에서 많은 비용이 소요될 수 있음
  • 애니메이션화된 요소를 각각 별도의 캔버스로 이동

새 창 "열기"가 최적화되지 않음

  • 새 창이나 용량이 큰 UI가 생성되면 게임 환경이 눈에 띄게 느려지는 현상을 최소화해야 합니다.
  • UI 창을 더욱 간단하게 만드세요.
  • UI를 여러 부분으로 분할하세요.
  • 창을 캐싱하세요.

목록이 많은 항목을 포함함

  • 모든 목록 항목을 한꺼번에 생성하지 말고 동적으로 재사용하세요.
  • 목록에 네스티드(nested) 캔버스를 만드세요.
  • 오픈소스 구현을 사용하세요 등의 오픈소스 구현을 사용하세요.

참조:

Unity UI 최적화 팁

Unity 베스트 프랙티스 UI 성능

리소스 더 보기

Unity 버프보트로 편하게 작업 진행

신청을 통해 Unity 전문가로부터 매주 기술 및 크리에이티브 노하우를 받으세요.

구독
확인

유니티에서는 웹 사이트의 모든 기능을 최대로 이용할 수 있도록 쿠키를 사용합니다. 자세한 정보는 쿠키 정책 페이지를 참조하세요.