Github에서 이슈를 만들고 관련된 작업을 한 후 이슈와 커밋을 연결하기 위해서 아래와 같이 커밋 메시지에 이슈의 키값을 함께 작성했다. #1 커밋 메시지이 후에 병합을 하던 도중에 충돌이 발생하여 충돌을 해소한 후 다시 커밋을 하려는데 아래와 같은 메시지가 나오며 커밋이 되지 않는 문제가 발생했다.Commit operation was cancelled due to empty commit message.위와 같은 문제가 발생하는 이유는 git에서는 #은 주석을 뜻하기 때문에 메시지가 없는 것처럼 동작한다고 생각했다. 그리고 관련 내용으로 찾아봤을 때 아래와 같이 설정을 변경하는 방법으로 문제를 해결했다. * 깃의 주석을 정의하는 문자를 변경 방법 git config core.commentChar '..
개인 프로젝트를 진행하던 중 이미 Git에 Commit 된 파일의 이름을 변경할 일이 생겼다. 이때 작업한 내용은 파일 이름의 대문자를 소문자로 변경하는 것이었는데, 변경한 내용을 Git에서 감지하지 못하는 문제가 발생했다. 이유를 찾아보니 Git의 설정에 대소문자를 구분하지 않도록 설정되어 있기 때문인 것으로 확인했다. 변경한 내용을 Git이 감지할 수 있도록 하는 방법은 두 가지가 있는 것으로 확인했다. 하나는 git mv 명령어를 사용하여 파일의 이름을 변경하는 것이다. 다른 하나는 Git의 config 파일에서 core.ignorecase 속성의 값을 false로 수정하는 것이다. 다만 config 파일의 속성값을 변경할 때는 두 가지를 유의해야 한다. 하나는 변경한 내용을 Commit 한 후 원..
implicit, explicit 키워드는 암시적( implicit ) 또는 명시적( explicit ) 변환을 정의할 때 사용된다. 암시적 변환은 특별한 구문을 호출할 필요가 없으며 할당 및 메서드 호출과 같은 다양한 상황에서 사용할 수 있다. 미리 정의된 암시적 변환은 항상 성공하도록 구현되어 예외를 던지지 않으며 사용자가 정의하는 암시적 변화도 동일하게 작동해야 한다. 만약 변환할 때 예외를 던지거나 정보가 손실될 수 있는 경우에는 명시적 변환으로 정의해야 한다. (위와 같이 가이드한 것은 암시적 변환을 사용했을 때 문제가 발생하면 디버깅하는 것이 어려워지기 때문으로 생각된다.) 사용자가 정의한 명시적 및 암시적 변환은 is나 as 연산자는 사용하지 못하고 캐스팅하여 호출해야 한다. 사용 방법은 o..
GitHub에서 보안을 강화하기 위해 2FA를 활성화하라는 메일이 왔다. 2024년 1월 18일 00:00(UTC)까지 활성화를 해야 하고 하지 않으면 GitHub에 대한 접근에 제약이 생긴다고 한다. 해당 메일에서 아래와 같은 방법으로 2FA를 활성화할 수 있다고 한다. Security key GitHub Mobile Authenticator application (TOTP) Text messages (SMS) 이 글에서는 Authenticator application을 사용해서 진행해보려고 한다. 우선 크롬 확장 프로그램에 Authenticator를 검색하여 설치한다. 그다음 GitHub에서 2FA를 활성화하기 위해 Setting에 들어간다. 그다음 Password and authntication 목..
인덱서란 클래스나 구조체의 인스턴스를 배열처럼 사용할 수 있는 방법을 말한다. 인덱싱된 값은 다양한 형태의 매개 변수를 사용하여 반환하거나 할당할 수 있다. 이러한 인덱서는 매개 변수를 사용한다는 점을 제외하면 Property와 유사한데 컴파일러가 항상 인덱서에 올바른 스토리지를 생성할 수 있는 것은 아니라 Property와 다르게 자동 구현 속성을 사용할 수 없다. 인덱서는 정수 값으로 인덱싱할 필요가 없고, 별도의 인덱싱된 값을 찾는 메커니즘을 정의하여 사용해도 무방하다. 인덱서는 오버로드될 수 있도 있고 2차원 배열에 액세스하는 경우 둘 이상의 매개 변수를 사용할 수 있다. 인덱서를 정의할 때 사용되는 키워드에 대한 내용은 아래와 같다. this : 인덱서 임을 정의 get : 값을 반환할 때 필요..
Null 허용 값 형식('T?') Null 허용 값 형식이란 null을 가질 수 있는 값 형식의 변수를 뜻한다.(참조 형식 변수에 사용할 수는 있는데 경고가 뜬다.) null을 할당할 수 있다는 것을 암시적으로 나타내기 때문에 변수에 null을 할당할 수 있다. 변수를 선언하는 것은 아래와 같다. bool? b; Nullable b2; 두 가지 모두 컴파일하면 Nullable 형식이 된다. 변수에 값을 할당하는 방법은 아래와 같다. bool b = true; bool? b1 = true; bool? b2 = b; bool? b3 = null; Nullable nb = null; 아래의 경우는 InvalidOperationException을 던진다. int? n = null; int m = n; // 에러..
0. 메모리 최적화는 모바일 게임을 만들 때 특히 중요하다. - PC는 실제 메모리 사양보다 더 많이 사용할 수 있다. - 모바일은 게임에 사용할 수 있는 메모리가 실제 사양보다 적다. 1. Asset 중복 유니티는 중복 파일 체크를 하지 않기 때문에 동일한 Asset( font, audio, texture, mesh, 등 )을 여러 폴더에 뒀을 때 메모리를 불필요하게 차지할 수 있다. 2. Asset Bundle Asset Bundle을 사용할 때 Asset 디펜던시로 인해서 하나의 Asset이 중복되어 메모리에 올라갈 수 있다. EX) 하나의 Texture를 공유하는 여러 프리팹을 번들로 만들고 Texture는 번들로 만들지 않으면 Texture가 중복으로 들어가게 된다.( addressables 사..
ScriptableObject는 대량의 데이터를 저장할 수 있는 데이터 컨테이너로 데이터를 저장하고 있기 때문에 변경되지 않는 데이터를 갖는 프리팹의 경우 ScriptableObject를 사용하면 인스턴스화할 때마다 데이터를 중복하여 만들지 않기 때문에 메모리 사용을 줄일 수 있다. MonoBehaviour와 같이 ScriptableObject는 Unity의 Object에서 파생되지만 MonoBehaviour와 달리 GameObject에 연결할 수 없고 에셋으로 저장된다. 편집기에서 사용할 때 데이터 저장은 아무 때나 가능하다. 다만 게임을 플레이하는 중에는 데이터를 저장할 수 없고 저장된 데이터를 사용하는 것만 할 수 있다. 편집기에서 에셋 형태로 ScriptableObject에 저장한 데이터는 세션 ..
1. 중첩 Canvas 1.1 Canvas 안의 요소가 변경되면 Canvas 안의 모든 요소가 갱신된다. 1.2 Canvas가 중첩됐을 때 부모와 자식 Canvas 사이에는 서로 영향을 주지 않는다. (부모 Canvas의 크기가 변경되는 경우는 예외) 위의 두 가지 때문에 변경이 잦은 요소를 중첩된 Canvas 중 자식 Canvas에 두어 별도로 관리하면 성능이 향상될 가능성이 높다. 2. 계층의 깊이를 낮게 유지 UI의 RectTransform은 계층구조로 이루어져 있다. 때문에 계층의 깊이가 깊어질수록 Canvas 갱신 등의 비용이 커진다. 3. Re-parenting 주의 부모를 바꾸는 행위를 할 때 Canvas가 갱신될 가능성이 높기 때문에 자제하는 것이 좋다. 4. Pixel Perfect 사용..
1. LINQ를 사용하지 않는다. LINQ는 사용하기는 쉽지만, 알고리즘을 직접 만들어 사용하는 것보다 일반적으로 더 많은 자원이 필요하다. 2. 최대한 GC가 동작하지 않도록 한다. GC(가비지 컬렉터)는 자동 메모리 관리자로 메모리 할당 및 해제를 관리한다. 자동으로 관리되기 때문에 개발자는 편하지만 동작하게 될 때 많은 자원을 사용하게 된다. GC가 동작하는 시점은 시스템의 메모리가 부족해지거나 관리되는 힙에 허용되는 임계값을 초과하는 경우이다. 즉 사용되지 않는 메모리가 많아질수록 GC가 동작하게 될 여지가 많아지기 때문에 이를 막아야 한다. 3. boxing에 주의한다. boxing이란 int, bool, 등과 같은 값 형식 변수를 참조 형식 변수로 래핑하는 것으로 래핑하게 되면 메모리에 할당되..