본문 바로가기

Unity/Articles

Unity: 비동기와 코루틴을 혼동하지 않기 본론에 앞서 유니티에서의 대부분 로직은 동기 방식으로 작성되며, 흐름(Flow, Stream)을 관리하거나 시간을 조절해 시행해야하는 작업은 코루틴(Coroutine)이라는 기능을 활용하여 구현됩니다. 특히 유니티는 기본적으로 메인스레드가 아닌 곳에서의 네이티브 API 호출을 허용하고 있지 않습니다. 비동기 방식으로 로직을 작성하더라도 유니티 API를 사용해야 하는 끝단에서는 메인스레드에서 함수 Call 작업을 마무리 해 주어야 합니다. 이 때 일반적으로 사용되는 방식이 액션을 큐에 추가해 유니티 Update 루프에서 처리해주는 디스패처입니다. 이 방법론이 필요한 이유와 한계, 장단점을 알고 계시다면 아래 내용은 스킵해도 됩니다. 왜 게임 개발에서는 비동기 사용이 적을까요? 상용 엔진에서는 async/a.. 더보기
Unity: UniRx로 NavMeshAgent의 도착 콜백 생성하기 neuecc/UniRx: Reactive Extensions for Unity (github.com) neuecc/UniRx Reactive Extensions for Unity. Contribute to neuecc/UniRx development by creating an account on GitHub. github.com 내장된 NavMeshAgent에는 따로 도착 콜백이 존재하지 않아 UniRx를 이용해서 임의로 콜백을 호출하도록 구현했습니다. 멈춘상태인지를 판단하는 IsStopped 함수를 만들고, Start에서 Update루프에서 확인하도록 등록해주었습니다. public class PlayerCharacter: Character { public NavMeshAgent agent = defau.. 더보기
Unity: 작업중인 프로젝트를 URP로 전환하기 전 확인할 사항 이 게시글은 2021. 5월 경 작성되었습니다. 다소 상황이 달라졌을 수 있어, URP 디퍼드 렌더링 등 최신 업데이트 된 소식을 꼭 찾아서 확인하세요. 유니버설 렌더 파이프라인이 뭐길래? Universal Render Pipeline은 기존 LWRP에서 이름이 바뀐 템플릿입니다. High-Definition의 반대편에서 Light-Weight라는 타이틀 아래 개발이 시작되었지만 이런저런 과정을 거쳐 최종적으로 Universal 한 플랫폼에서 동작한다는 의미로 굳어졌습니다. Light 함보다는 Universal 함에 포커스를 맞추고 개발하겠다는 포부를 밝힌 것인데요, 일부 사용자는 이 렌더러가 결코 Light-Weight 하지 않았기에 이름을 바꿀 수밖에 없었던 게 아닌가 의문을 제기하기도 합니다. 사실.. 더보기
Unity: ShaderLab 패키지 요구사항 정의 (PackageRequirements) 2021.2 알파버전이 한창 개발되고있습니다. SRP 역시 버전을 바꿔가며 거듭 진화하고 있는데, API 이름이라 지원하는 키워드 등 버전별로 사용가능한 부분이 상이해 섣불리 기존 프로젝트에 적용하기엔 부담스럽습니다. 에셋 개발자들 역시 SRP 버전업에 따라 키워드를 바꿔주거나 추가해주어야하고 유지보수가 쉽지 않습니다. Shader "MyShader" { SubShader { Pass { PackageRequirements { "com.unity.render-pipelines.universal":"[10.0,10.5.3]" } ... } Pass { PackageRequirements { "com.unity.render-pipelines.universal":"[11.0,11.2.4]" "com.my.ot.. 더보기
Unity: 코드 블록 성능 측정 방법 효율적인 로직을 구현하기 위해 어떤 코드가 더 성능상 유리한지 시간을 재어 보고 싶을 때가 있습니다. 유니티에서는 GameObject.Find나 GetComponent와 같이 매 프레임 반복적으로 호출하지 말 것을 권장하는 코드들이 있죠. 하지만 글이나 얘기로만 들었지 실제로 어느정도로 성능이 좋지 않은지 제대로 측정해보지는 않습니다. 게다가 비슷한 시도를 하더라도 제대로 측정하는 경우는 거의 없습니다. 최근 유니티 한국어 개발자 톡방에서 TryGetComponent와 GetComponent의 성능에 대한 얘기가 나왔는데, 아무도 잘못된 부분을 짚어주지 않아 겸사겸사 코드 블럭 성능 테스트를 위한 코드를 작성하는 부분에 대해 다뤄보겠습니다. 더보기 # 유니티 개발자 톡방 캡쳐 보기 유니티 엔진으로 개발을.. 더보기
Unity: 당신의 에디터가 느려지는 이유 스터디 발표 자료입니다. 시간이 꽤 지나 전체공개로 올려둡니다. 유니티 에디터가 스크립트를 컴파일하고 로드하는 과정, 플레이 모드에 진입하는 과정이 왜 점차 느려지는지에 대한 간략한 정리와 시도해볼 수 있는 해결책입니다. Assembly Definition Asset으로 Assembly를 쪼개어 컴파일 시간을 단축합니다. Enter PlayMode를 사용해 도메인 로딩 시간을 단축합니다. 종속성이 줄어드는 방식의 어셈블리간 코드 레퍼런스로 전체 프로젝트를 설계합니다. 에셋스토어의 플러그인들 중에는 적합하지 않은 것들이 많아 선택적으로 적용해야합니다. drive.google.com/file/d/1jaM7U5EnL2p7B0ItesQYCx1PKsI7vxHe/view?usp=sharing 당신의 에디터가 느려지.. 더보기
Unity: 빌드 파이프라인 베이직 유니티 에디터로 프로그램(애플리케이션)을 개발하고 사용자에게 제공하기 위해서는 '빌드'라는 과정을 통해 실행 가능한 정돈된 패키지로 만들어야 합니다. '패키징' 등으로 부르기도 합니다. 실행에 필요한 파일들을 모아서 압축하고, 다양한 사용자의 환경에서 일관성있게 실행될 수 있도록 여러 의존성들을 해결하는 작업입니다. 빌드된 유니티 프로그램의 디렉터리를 확인하면 크게 3가지로 구분할 수 있습니다. 유니티 엔진 모듈 사용자 스크립트 아트 리소스 2021년 4월 현재는 2가지의 빌드 방식이 있습니다. 최종 사용자 스크립트를 C++ 문법으로 바꿔주는 IL2CPP와, 닷넷 VM 환경에서 바로 실행시키는 Mono 방식이 있습니다. 두 방식의 빌드 결과물을 조금 상이한 폴더 구조를 가집니다. il2cpp 방식 mon.. 더보기