프로그래밍
언어권에 따른 String 변환에 주의하자
언어권에 따른 String 변환에 주의하자
2023.02.20무언가의 객체에 대한 ToString()은 별 신경을 쓰지 않고 사용하기 쉬운 메서드이지만, 글로벌 런칭을 주로 한다면 생각보다 사용에 주의가 필요하다. DateTime 파싱 데이터에는 보통 생성 시간이나 수정 시간이 들어가지만, 유니티에서는 DateTime을 Serialize하지 못한다. 이 때문에 나는 보통 DateTime을 String으로 바꿔 저장하고, 불러올 때에는 DateTime.Parse를 쓰고 있다. //세이브 할 때 UtcNow_string = DateTime.UtcNow.ToString(); //로드 할 때 UtcNow_dateTime = DateTime.Parse(UtcNow_string); 하지만 세이브와 로드 사이에 언어권이 변경되는 경우 이 구문은 오류가 날 수 있다. DateT..
is null 연산은 유니티의 ==를 사용하지 않는다
is null 연산은 유니티의 ==를 사용하지 않는다
2023.02.09원인 C# 9.0에서 추가된 패턴 일치 중, not 패턴은 해당 패턴이 일치하지 않도록 요구하는 기능이다. 개인적으로는 A != null을 사용하는 것보다 A is not null을 사용하는 것이 명확하다고 생각했기에, 개발 중인 코드의 조건문에 is를 적극적으로 사용하기로 하였다. 그러나… public Animator Animator { get { if (animator is null) animator = GetComponent(); return animator; } } 위의 코드는 animator == null일 때 새 애니메이터를 찾아 대입하는, 아주 명확하고 간단한 코드다. 하지만 파이어베이스에서는 해당 구문에 참조가 없다며 오류를 뿜어내고 있었다. null 체크로 오류가 날 만한 것은 unity..
Test Framework 적용하기
Test Framework 적용하기
2023.01.27근래 테스트 자동화와 리포팅의 필요성을 느껴 프로젝트에 Unity Test Framework를 적용하려 한다. 어떻게 적용하는지, 코드 작성 방법은 무엇인지 알아보는 글이 되겠다. Test Framework 시작하기 Package Manager에서 Test Framework를 설치하고, Window/General/Test Runner를 실행해준다. Test Framework 적용하기 이 창에서 테스트 코드를 만들거나 재생할 수 있다. 상단에 PlayMode/EditMode가 나뉘어져 있는 것을 확인할 수 있는데, PlayMode는 에디터 플레이 중에 작동한다. 반면에 EditMode는 에디터에서만 작동하므로 에디터 전용 테스트에 유용할 것이다. 아무튼, 나는 PlayMode에서 테스트 항목을 만들고 싶었..
C# 9.0 새 기능 알아보기
C# 9.0 새 기능 알아보기
2023.01.16최근 유니티 2021 버전을 주로 사용하게 됨에 따라, C# 9.0의 기능을 정리할 필요성을 느껴 오랜만에 포스팅을 한다. 2022 버전에서도 C# 9.0을 사용하고 있으니 당분간 C# 신기능 포스팅은 이후로는 없을 듯 하다. 마이크로소프트 공식 문서를 참조했다. 레코드 레코드(record) 형식이 새로 추가되었다. 변경할 수 없는 데이터 모델을 지원하기 위해 만들어졌다. 레코드는 초기화 한 뒤에는 객체 내의 멤버들을 변경할 수 없다. public record Person(string FirstName, string LastName); public record Person { public string FirstName { get; init; } = default!; public string LastNam..
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; } } 그런데, 클래스 객체가 이곳저곳에 호출되면서 중간에 ..
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..
[.Net C# 설명서] 읽고 정리하기
[.Net C# 설명서] 읽고 정리하기
2021.09.29본 글은 공부하며 작성하였습니다. 정보를 얻으실 때 사실과 다르거나 부정확한 정보가 들어있을 수도 있습니다. 내용 출처https://docs.microsoft.com/ko-kr/dotnet/csharp/tour-of-csharp/ C# 둘러보기 - C# 가이드C#을 처음 사용하시나요? 언어의 기본 사항에 대해 알아봅니다. 이 개요에서 시작합니다.docs.microsoft.com 최근에 기초를 더 탄탄하게 다져야 한다고 느껴서, C# 라이브러리를 읽고 정리해보기로 했다. 이전 글과 마찬가지로, 전체 내용보다는 새롭게 배웠거나 필요성을 느낀 내용들을 정리해보려 한다.부호 있는 정수와 부호 없는 정수부호 있는 정수 : sbyte, short, int, long 부호 없는 정수 : byte, ushort, ui..