프로그래밍
UniRx에서 ObjectPool 사용하기
2019. 12. 14.object pool 패턴은 게임을 제작할 때 자주 사용하는 패턴 중 하나입니다. 프로그램에서 인스턴스를 생성할 때에는 생각보다 많은 비용이 듭니다. 특히, 큰 크기의 Prefab들을 그때그때 새로 생성해서 사용하는 것들이 그렇지요. 큰 용량의 Prefab을 한 프레임 안에서 여러 번 생성하게 되면, 한 프레임 안에서 많은 CPU 자원을 사용하게 된다는 의미이고, 이것은 프레임 저하와 잦은 생성(Instantiate)과 파괴(Destroy)를 통한 빈번한 GC 호출을 의미합니다. 물론, 작은 프로젝트나 취미 수준의 게임 개발에서는 필요 없는 기능일 수 있지만, 그런 와중에 성능을 올려야 한다면 가장 먼저 도입을 고려해야 할 만한 패턴입니다. 이번 포스팅에서는 UniRx를 이용해 ObjectPool 패턴을..
UniRx에서 First()와 Take(1) 중 어느 것을 써야하는가
2019. 10. 13.개인 프로젝트를 하던 중, 다음과 같은 에러를 만났습니다. InvalidOperationException: sequence is empty System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () (at :0) UniRx.InternalUtil.ExceptionExtensions.Throw (System.Exception exception) (at Assets/Plugins/UniRx/Scripts/InternalUtil/ExceptionExtensions.cs:10) UniRx.Stubs+c.b__3_1 (System.Exception ex) (at Assets/Plugins/UniRx/Scripts/Observer.cs:496) UniRx.Ob..
UniRx에서 여러개의 Observable을 합성하는 방법
2019. 9. 11.비단 UniRx 뿐만 아니라 Rx로 프로그래밍을 하다 보면, 필연적으로 여러 개의 Observable을 동시에 구독하는 것처럼 동작하게 만들어야 할 필요가 있습니다. 예를 들어 비밀번호 확인을 위해 2개의 input필드가 있고, 그 값이 바뀔 때마다 비밀번호가 유효한 규칙으로 작성되었는지 확인하고 싶을 때를 생각해봅시다. 2개의 input 필드를 각각 구독하고 유효한 규칙인지 판단해도 되지만, 2개의 input Observable을 합성하고 그것을 구독하는 방법도 있을 것입니다. 이런 상황처럼 실제로 UniRx를 이용하여 게임 로직을 작성하다 보면, 여러 개의 ReactiveProperty나 Subject를 동시에 구독해서 처리해야 하는 상황들이 많이 나오게 됩니다. 0. Zip 말 그대로 2개의 스트림..
어느날 Unity 패키지 의존성이 박살났다
2019. 8. 11.회사일이 너무 바빠서 한동안 개인 프로젝트를 진행하지 못했었습니다. 잠을 좀 줄여서라도 다시 진행해보려고 묵혀둔 프로젝트를 오픈했는데... 시작부터 에러 메시지가 저를 반겼습니다. (이상한 일이죠... 그냥 나는 저장했던 프로젝트를 다시 켰을 뿐인걸??) 대략 무슨 내용인고하니, 프로젝트가 valid하지 못한 디펜던시를 가지고 있다는 것. 나는 그간 프로젝트의 세팅을 건든 적도 없고, 추가적인 플러그인을 받지도 않았는데 무슨 X소리인지 모르겠습니다. (덕분에 이 메세지를 보고 대략 한 1분 정도 멍 때린 건 비밀...) Retry나 Continue를 눌러도 Editor가 켜지지 않아서 일단 프로젝트의 뭔가를 변경하려면 직접 세팅 파일들의 경로를 찾아서 수정해야했습니. 정말 기막힌 상황.... 일단 Dep..
Unity MonoBehaviour에서 유용하게 쓰는 Attribute 정리
2019. 5. 26.*너무 포스팅을 안 해서 느끼는 죄책감에 작성하는 포스팅 최근 팬 게임을 본격적으로 만들기 시작했다. 보너스 받은 걸로 와콤 액정 태블릿도 구입해서 진행 중인데, 아직은 시스템을 제작하고 있는 상황이다... 기반을 닦고 있다 보니 나중에 아트 + 세팅 작업에 필요한 도구들을 만들거나, Component에 박혀있는 변수들을 정리하는 일이 많다. 옛날부터 몇몇 유용한 Attribute들을 이용하여 작업했었는데 오랜만에 기반 작업에 들어간 거라 거진 다 까먹었다. 그래서 리마인드를 위한 정리 포스팅을 진행해본다. (철저하게 개인적으로 사용하는 용도로 정리, 다른 사람은 어떻게 사용하는지 모릅니다 >__ Create에 메뉴 추가 ScriptableObject Asset 생성에 유용 ContextMenu 컴포넌트..
Unity iOS Could not produce class with ID 에러 해결법
2018. 10. 19.회사에서 신규 슬롯을 제작하고 iOS로 빌드를 한 뒤 해당 게임을 들어갔는데 AssetBundle을 로드하다가 크래시가 나는 상황이 벌어졌다. Console App을 이용해 디바이스 로그를 확인해보니 다음과 같은 메시지가 찍혀있었다. 뒷 문장을 읽어보면, 플레이어 세팅에서 'Strip Engine Code'를 비활성화 시켜봐라 라는데... 일단 Strip Engine Code라는 기능이 무엇인지 몰랐기 때문에 찾아보니 IL2CPP를 사용하면서 iOS에서 빌드 사이즈를 줄이기 위한 기능이었다. (자세한 내용은 여기서 참고) 간단하게 설명하면, 유니티엔진 관련 코드 중 런타임에서는 사용되지 않을 코드들을 제외하고 빌드하는 옵션이다. 만약, 에셋 번들을 이용하여 다이나믹하게 컨텐츠를 다운받게될 경우 게임 빌드..
Script compilation and assembly definition files을 사용해보았다
2018. 8. 5.Unity 2017.3의 새로운 피쳐 중 스크립트 컴파일 및 어셈블리 정의 파일(Script compilation and assembly definition files 이하 SCADF)이라는 것이 생겼습니다. 이 시스템을 도입한 이유는 '유저에게 스크립트가 어셈블리로 컴파일되는 방법을 정의하게 하고, 컴파일 결과물을 분리할 수 있게 만들어 결과적으로 컴파일이 필요한 구획만 컴파일해 컴파일 시간을 줄이고 싶다!'라는 이유입니다. 일단 말로 들었을 때 정말 어썸한 기능입니다. 프로젝트가 커져서 많은 스크립트를 들고 있으면 자연스럽게 컴파일 타임이 늘어나게 됩니다. 이 시스템을 도입하면 컴파일 타임이 줄어들 것이라고 기대됩니다. 흔히 격는 코드 수정 후 유니티 하단에 동글뱅이가 돌아가는 시간이 줄어든다는 것이..
UniRx Operator 관련 정리
2018. 6. 19.Observable Operator Operator When Description Observable.Return 값을 하나만 발행 Observable.Repeat 값을 반복해서 발행 Observable.Range 지정한 범위의 수치들 발행 Observable.Empty 더미 스트림을 만들어 사용하고 싶을 때 OnCompleted를 즉시 발행하게됨 Observable.EveryUpdate Observable.EveryFixedUpdate (etc...) Life cycle에서 Update 부분의 로직을 작성하고 싶을 때 MainThreadDispatcher에서 코루틴이 돌기 때문에 Life cycle관리 주의! - UpdateAsObservable 을 사용 - 마지막에 AddTo(this.gameObje..
Unity할 때 외워두면 유용한 Mathf 함수들
2018. 6. 17.유니티를 사용하다 보면 숫자를 계산할 때가 많습니다. 이 숫자들을 다룰 때 자주 사용하는 클래스가 Mathf 클래스입니다. 레퍼런스가 잘 되어있다고 하더라도 자주 사용하는 함수들을 외워두면 코드를 작성하는 시간을 크게 줄일 수 있을 것입니다. (무엇보다 구글 켜서 검색하는게 귀찮음...) 그래서 이번에는 알아두면 좋고, 나의 삽질 시간을 줄여줄 수 있는 유용한 Mathf 함수들을 정리해보려고 합니다. 0. 절댓값 Mathf.Abs(float num) Abs은 num에 대한 절댓값을 반환해줍니다. 가끔 데이터의 부호를 때고 계산해야 할 때 편리하게 사용할 수 있습니다. 1. 최대/최솟값 Mathf.Clamp(float num, float min, float max)Mathf.Clamp01(float num..
Unity VideoPlayer가 Gradle 빌드에서 작동하지 않는 이슈
2018. 2. 12.요즘 어느 정도 볼륨이 있는 게임을 하다 보면 AssetBundle을 다운받는 동안 해당 게임 관련 동영상을 틀어준다거나 튜토리얼, 세계관 같은 것들을 영상으로 틀어주는 경우가 가끔 있다. 그 외에도 학부 프로젝트를 하다보면 유니티 안에서 동영상으로 대략 때우거나 VR 관련 영상을 재생 해야 하는 경우가 생기는데 이때 유니티 내장 Video Player를 사용하곤 한다. 회사에서도 라이브 운영 중 바뀐 시스템에 대해서 간단하게 소개하기 위해 Video Player를 사용하게 되었는데 에디터에서는 잘 작동했으나 디바이스에서는 어째 잘 작동하지 않았다. 에디터에서는 분명히 잘 작동했기 때문에 디바이스의 로그를 찍어보기로 했다. 결과는? AndroidVideoMedia OpenExtractor: file is..
Unity에서 iPhone X를 대응하는 간편한 방법
2018. 1. 5.시작하면서얼마 전까지 iOS에서 가장 핫한 이슈였으며 골칫거리였던 주제는 iPhone X의 탈모 디자인이었다. 각진 사각형이거나 살짝 라운드가 들어간 기존의 안드로이드나 iOS의 화면과는 다르게 화면 상단 부분에 1)M자 탈모처럼 생긴 검은 영역이 생겼기 때문이다. 탈모도 문제였지만 2)물리 홈버튼을 제거하면서 생겨난 홈바가 터치 화면의 일정 영역을 차지했고, 이 영역 또한 고려해 프로그램을 작성해야 했다. 우리는 이 두 개의 요소를 고려해 대응할 필요가 있다. (그래야 피쳐드를 받...읍읍) 이런 대응은 일반적인 iOS 개발은 기존에 있었던 Auto layout 정책을 잘 따랐다면 쉽게 대응할 수 있다고는 한다. 하지만, 게임은 주로 상용화된 게임 엔진을 이용하여 제작하는 경우가 많기 때문에 빌드 사이..
iOS 빌드할 때 Your development team has reached the maximum number of registered iPhone devices. 문제
2017. 12. 27.2년 만에 핸드폰을 iPhone으로 교체했다. 요즘 iPhone X에 대응하게 해주면서 Editor 안에서 테스트를 해볼 수 있게 해주는 Unity 플러그인을 하나 제작 중이다. 제작을 어느정도 끝내고 당연하게도 iOS를 빌드 하는 순간 다음과 같은 매세지를 던졌다. Your development team has reached the maximum number of registered iPhone devices.해석할 필요도 없이 그냥 '네가 사용할 수 있는 iPhone 디바이스 개수를 초과했다' 정도이다. 그런데 나는 최근에 아이폰 빌드를 시도한 적도 없는데 이게 뭔 X소리인지... 게다가 Xcode 7 이후부터는 어느 정도 제약이 있지만, 무료로 iOS 빌드를 해서 디바이스에 넣어볼 수 있다고 알고 ..