전체 분류
시간축 전쟁
시간축 전쟁
2022.10.08아주 날카로운 소리가 들렸다. 파공음. 하늘과 하늘의 경계마저도 나누는 일직선의 궤적. 그 시리고 빠르게 스쳐나간 작은 울림을 듣는 순간 느낄 수 있었다. 다시 시작이구나. 모두가 그 기척을 느꼈는지, 자신이 가진 무기를 손에 들었다. 이후 작은 단서를 하나도 놓치지 않겠다는 시선들이 허공을 떠돌았다. 수많은 초점들이 무언가를 바라보고 있었다. "진정해." 손을 들고 말을 꺼낸 것은 가장 예민하다 평가받는 그였다. "우리 차례가 아니야." 말이 끝나자마자 모두가 무기를 내렸다. 뒤이어 수많은 비수들이 하늘을 지나쳤다. 마치 수평으로 내리는 비처럼. 그것들은 모두를 티끌만큼도 건드리지 않고 이 시점을 지나쳤다. "...그 때 우리의 차례야." 순간, 사람들의 몸이 고꾸라졌다. 정확히는 그들의 몸에서 껍질이..
UniTask 파헤치기
UniTask 파헤치기
2022.09.27실무에서 코루틴 말고 UniTask를 쓰는 빈도가 점점 늘어나고 있다. 편하고, 명확해지고, 코루틴과 달리 가비지를 만들지 않아 안 쓸 이유가 없다! 하지만 쉬운 메서드만 사용해보고 본격적으로 공부해 본 적은 없었기에, 이번 글에서는 문서를 읽으며 정리해보고자 한다. UniTask는 메모리 할당이 제로? 코루틴의 경우, 잦은 새 객체 생성과 메모리 할당으로 불필요한 메모리를 차지하는 단점이 있다. iEnumerator Function(float time) { while(true) { Debug.Log("Print"); yield return new WaitForSeconds(1f); } } 위 코드에서는 1초마다 새로운 WaitForSecond 객체가 생성되며, 해당 객체는 1초가 지나기 전까지 메모리에..
C# 8.0 새 기능 알아보기
C# 8.0 새 기능 알아보기
2022.09.20최근 코드를 작성하던 중 C# 11에 다양한 기능이 추가되었다는 걸 알게 되어 이것저것 해 보았다. 어트리뷰트를 상속받는 제네릭 클래스를 선언 문자열 보간에서 줄 바꿈을 할 수 있다 이스케이프 문자를 사용하지 않고 문자열을 선언할 수 있다 구조체의 모든 필드가 기본값으로 초기화됨 다만 이 멋진 기능들을 당장 사용하는 건 불가능했는데, C# 11은 프리뷰 버전이며 Unity에서도 적용하고 있지 않기 때문이다. 그럼 Unity에서는 대체 C#의 어떤 버전을 사용하고 있단 말인가? 답은 공식 문서에서 찾을 수 있었다. 유니티 버전이 올라갈 때마다 C# 버전도 함께 상승하고 있으며, 현재 최신으로는 C# 9.0을 적용하고 있음을 알 수 있다. 유니티 버전(LTS 기준) 컴파일러 C# 언어 버전 2020.3 Ro..
Unity Device Simulator 알아보기
Unity Device Simulator 알아보기
2022.07.18유니티의 디바이스 시뮬레이터는 실제 핸드폰 기기에서 게임이 어떻게 보이는지 알 수 있게 해주는 패키지이다. 물론, 진짜로 해당 환경에서 실행된다는 건 아니지만, 해상도에 적용되는 UI와 품질 설정 등의 환경을 확인할 수 있으므로 매우 유용하다고 할 수 있다. 디바이스 시뮬레이터는 패키지 매니저에서 받을 수 있고, 현재(22.07.18) 기준으로 프리뷰 기능이다. 사진의 예시는 갤럭시 Z Fold2의 편 상태 해상도인데, 정면 카메라 위치나 해상도가 잘 적용되어 있는 것을 확인할 수 있다. 최신 기기를 선택할 수 없기에 아쉽다고 느끼겠지만, 시뮬레이션 기기는 JSON으로 정의되기 때문에 커스텀으로 디바이스를 추가하는 것 또한 가능하다. 링크를 참조하여 커스텀 디바이스를 추가해 보자. https://docs..
C# 구조체 : 기본 매개변수를 사용한 생성자는 호출되지 않을 수도 있다
C# 구조체 : 기본 매개변수를 사용한 생성자는 호출되지 않을 수도 있다
2022.07.10문제 상황 나는 여느 때처럼 클래스 객체를 사용해 다른 함수에게 데이터를 넘겨주고 있었다. public class Tester : MonoBehaviour { private void Start() { var data = new Data(); Initialize(data); } public void Initialize(Data data) { //Something } } public class Data { public int crushId = -1; public int count = 0; public Data(int crushId = -1, int count = 0) { this.crushId = crushId; this.count = count; } } 그런데, 클래스 객체가 이곳저곳에 호출되면서 중간에 ..
존재 증명
존재 증명
2022.06.23책장 위에는 먼지가 가득 쌓여 있었다. 사람의 손을 거친 지 오래 되었으니 자연스럽고 당연한 일이다. 그러니 부자연스럽고 당연하지 않은 것은 새로이 이 공간에 들어온 그였다. 먼지 쌓인 책장을 헤집어 원하는 것을 찾기 위해 정리된 배열을 흐뜨려놓는다. 그러한 행위에 반응하는, 손과 팔의 검은 그림자가 바쁘게 한 동작도 놓치지 않겠다는 듯 움직인다. 고요했던 공간에 소리가 쌓여 간다. 종이가 서로 맞닿으며 스치는 소리를 만든다. 그리고 그 멍청이는 결국 원하던 것을 찾지 못한다. 존재를 증명하는 방법. 그가 갈망하던 지식은 이 도서관에는 존재하지 않았다. 사실은 어디에도 없다. 하지만 그가 마지막으로 도달할 수 있는 공간은 이곳 뿐이었다. 할 수 없지, 초라한 이곳에서라도 존재 증명을 실행해야만 했다. 그..
비어버린 구석의 한 자리
비어버린 구석의 한 자리
2022.06.12"그 사람, 요새는 찾아오질 않더라." A가 구석의 한 자리를 보며 툴툴댔다. 단골 한 명이 더 이상 오지 않아 매상이 줄었다고, 이제는 적극적으로 손님들에게 다가가야 한다고. 내가 반응하지 않자 한숨을 내쉬며 이야기를 듣고는 있냐고 떠들어댔다. "더 마음에 드는 곳이 생겼나 봐." 그렇게 말하고는 입을 닫았다. 더 이상 생각하고 싶지 않았던 탓이다. 다시 나는 테이블을 닦기 시작했다. 그 구석 자리로 다가갈 때마다 어쩐지 마음 속이 허전했다. 단골이었음에도 불구하고, B와 내가 그다지 대화할 일은 없었다. 그는 말없이 가게에 찾아와 메뉴를 주문했고 나는 내어주었을 뿐이다. 대화를 하는 것은 주로 A였다. 그 뒤 B는 이곳이 편안했는지 자주 들렀다. 그러니 가게에 늘 그가 존재하는 것은 아주 오래된 흔한..
Unity Null Check할 때 성능을 개선할 수 있는 방법
Unity Null Check할 때 성능을 개선할 수 있는 방법
2022.05.01Null 체크로 해당 객체가 실제로 존재하는지 확인하는 일은 매우 자주 발생하곤 한다. 그런데 최근 IDE를 VS에서 Rider로 갈아탔더니 null 체크를 할 때마다 이것저것 알려주었고, 충격적인 사실을 여러가지 알게 되었다. UnityEngine.Objects UnityEngine.Object는 유니티 엔진에서 관리하는 오브젝트이다. 그리고 유니티는 실제로는 C++로 작성되어 있다. 그리고 C++은 가비지 콜렉터가 존재하지 않는 언어이다. 즉, 언어가 아닌 유니티가 가비지 컬렉터를 관리하고 있다는 뜻이다. UnityObjects를 Destory를 한 뒤 null 체크를 했을 때, 로그에서는 null이 맞다고 뜨니 의심을 품지 않게 되기 마련이다. 그러나 실제로는 null로 객체를 초기화해주지 않았기 ..
어드레서블 에셋 (1)
어드레서블 에셋 (1)
2022.04.10본 글은 공부하며 작성하였습니다. 정보를 얻으실 때 사실과 다르거나 부정확한 정보가 들어있을 수도 있습니다. 어드레서블 에셋을 실제로 사용해보기 전에, 영상을 보고 공부할 점을 정리해보았다. 에셋 번들과 어드레서블 에셋의 차이 어드레서블 에셋 에셋 번들 - 에셋에 주소를 지정할 수 있는 방식 - 에셋 번들처럼 카테고리를 분류할 수 있음 - 사용법이 복잡하지 않음, 인스펙터에 연결하여 사용도 가능함 - 에셋들을 하나로 묶어 압축 파일을 생성하는 개념 - 생성된 에셋 번들을 네트워크를 통해 배포하여 사용 (다운로드 콘텐츠, DLC 등) - 불러오는 코드를 작성하기가 대단히 불편함 어드레서블 개요 - 최소 2018.2 이상의 유니티 버전 사용할 것 - 스크립트를 이용한 관리 가능한 빌드 파이프라인과 리소스 매..
Enum.ToString 최적화하기
Enum.ToString 최적화하기
2022.02.25프로파일러를 뚫어지게 쳐다보다가 이상한 것을 발견했다. 별 생각 없이 사용하고 있던 enum값의 ToString()이 파멸을 초래하고 있었다. 한번 Call을 할 때마다 0.003ms를 먹어치우고 있던 상황. 코드에서는 1프레임에 80번을 호출하고 있었으니 자그마치 0.24ms를 차지하고 있던 셈이다. 찾아보니 원래 enum.ToString()은 값이 비싼 메서드라고 한다. 왜냐면 리플렉션을 사용하니까! 조금만 생각해봐도 값이 비싼건 당연한 것이다. 이를 해결하기 위해서 다양한 방법들을 찾아보았다. 1. 자체 Dictionary에 캐싱 //데이터는 입력되었다고 가정 private readonly Dictionary e_s_cache = new Dictionary(); public string ToStri..
~01/07 Log
~01/07 Log
2022.01.07
BlackOut (2021)
BlackOut (2021)
2021.11.30자고 일어났더니, 모르는 호텔의 바닥에서 깨어났다. 분명 어제는 술자리가 있었다. 필름이 끊긴 것일까? 안녕하세요, 더블즈비(Doublsb)입니다. 전 닉네임은 쌍쌍뱌였습니다. 본 게임은 2021 1치킨 알만툴 게임잼 참여작입니다. 게임잼의 주제는 탈출입니다. 탈출 게임의 형태지만 마음 먹으면 나갈 수는 있는 평화로운 분위기에서 진행합니다. 플레이타임은 15분 내외이며, 엔딩은 3개입니다. 제작자 닉네임을 표기하는 것으로 플레이 영상 공개 및 스트리밍을 허용하고 있습니다. 더블즈비, Doublsb, 쌍쌍뱌 중 적당한 것을 골라 제작자명을 표기해 주세요. 예전부터 구현하고 싶었던 키워드 기반의 추리/어드벤처 게임입니다만, 심도있게 구현하지는 못했네요. 시스템은 구현해뒀으니 언제든지 만들 수 있다는 것에 위..