프로그래밍
[C#] 구조체의 get/set을 조심하자
[C#] 구조체의 get/set을 조심하자
2024.06.04잠깐 생각해보면 당연하고 별 거 아닌데, 아무 생각 없이 쓰다가 디버깅때문에 고통받았다. 보통 외부에서 참조는 할 수 있지만 내부에서만 변경하고 싶은 객체를 만들 때, get/set을 쓰는 게 일반적이다. 예시로 단순히 int 변수를 가진 somethingClass 객체를 만든다고 해 보자.public static somethingClass A { get; private set; } public static void Main(string[] args) { A = new somethingClass(0); A.count++; Console.WriteLine(A.count); //Output is 1 } public class somethingClass { public int count; public some..
왜 partial Enum은 없는 걸까?
왜 partial Enum은 없는 걸까?
2024.03.21왜 partial Enum을 쓰려고 했는가 최근 개인 프로젝트에서 partial class를 자주 활용하는 방식으로 개발하고 있다. 파일 하나에 클래스의 모든 멤버나 메서드를 정의하지 않고, 다른 파일에 나눠서 적을 수 있어서 확장성이 높은 방법이라고 생각한다. 이런 방식을 자주 쓰다 보니 아래와 같은 경우가 생겼다. public static partial class ModifierUtil { public const int StatMaxPenaltyId = 3; public static void AddStatPenalty(this ModifierStorage storage, int value) { storage.Add(new ModifierSomething(StatMaxPenaltyId, value));..
[알쓸유잡 : 모바일 최적화] 영상 정리하기
[알쓸유잡 : 모바일 최적화] 영상 정리하기
2024.01.20이번 포스팅은 유니티 공부를 할 때 항상 신세를 지고 있는 알쓸유잡 콘텐츠를 공부하고 기록해보는 글이 되겠다. 특히나 이번 영상은 최적화였기 때문에, 프로파일러 안의 숫자를 하나라도 더 줄이면 쾌감을 느끼는 편인 나는 어쩔 수 없이 글을 쓸 수밖에 없었다. 음... 변태같은 소리는 뒤로 하고 본론으로 들어가자. 소개 https://www.youtube.com/live/-IrpQzZi_p8?si=tz7lyopfIHhbdPyX https://blog.unity.com/engine-platform/updated-2022-lts-best-practice-guides Updated 2022 LTS Best Practice Guides for optimizing games | Unity Blog Each guide..
URP는 Built-In과 뭐가 다른가? (1) : SRP Batcher
URP는 Built-In과 뭐가 다른가? (1) : SRP Batcher
2023.12.17최근 Unity 2022 LTS 버전을 사용해보면서 URP도 겸사겸사 사용해보게 되었다. 대체 Built-In과 뭐가 다른가 싶어서 유니티 공식 문서를 받아 공부해보고 있는데, 정리가 필요하다고 느꼈다. 다만 이론적인 것 말고, 실무에서 무엇이 달랐는지 하나씩 정리해보려 한다. SRP Batcher가 뭔지 요약해서 알려달라 간단하게 말하면, 같은 쉐이더를 쓰는 오브젝트를 그릴 때 렌더링 성능을 개선해주는 녀석이다. '같은 머티리얼을 쓰면 Draw Call이 하나'라는 게 '같은 쉐이더를 쓰면 SetPass Call이 하나'가 된 것이다. 즉, 같은 쉐이더를 쓰는 것만 신경쓰면 성능 개선을 이뤄낼 수 있는 개꿀 기능이라는 것이다. 다만, 파티클 시스템과 UI에는 적용되지 않는다. 뭘 어떻게 성능 개선을 한..
3매치 구조 회고 (4) : 효율적으로 힌트 찾기
3매치 구조 회고 (4) : 효율적으로 힌트 찾기
2023.09.25현재 회사에서 설계하고 유지보수한 3매치 코드는 이미 검증되었지만, 과거의 자신을 돌아보는 것이 늘 그렇듯 다시 읽어보면 구데기인 부분이 너무 많다. 그래서 이 시리즈는 과거의 설계를 돌아보며 더 확장성있는 코드를 고민해보는 글이 되겠다. 조건 1. 일정 시간동안 유저가 조작을 하지 않을 경우, 힌트를 보여 줄 것. 2. 이 때, 우선순위가 높은 힌트를 먼저 보여주어야 함. 3. 유저가 조작을 하기 전까지 랜덤한 힌트를 돌아가면서 보여주어야 함. 3-1) 3x1 이상의 우선순위 매치가 있을 경우, 그 매치들만 돌아가면서 보여 준다. 3-2) 일반 매치만 힌트 대상일 경우, 일반 매치만 돌아가면서 보여 준다. 과거의 나 1. 왼쪽 아래에서부터 위/오른쪽 방향으로 스왑한 결과의 매치를 조사한다. 1-1) 같..
3매치 구조 회고 (3) : 효율적으로 매치하기
3매치 구조 회고 (3) : 효율적으로 매치하기
2023.09.19현재 회사에서 설계하고 유지보수한 3매치 코드는 이미 검증되었지만, 과거의 자신을 돌아보는 것이 늘 그렇듯 다시 읽어보면 구데기인 부분이 너무 많다. 그래서 이 시리즈는 과거의 설계를 돌아보며 더 확장성있는 코드를 고민해보는 글이 되겠다. 으엄... 이번 글은 확장 관련 얘기는 없지만 말이다. 조건 1. 연속된 블록의 개수에 따라 다른 결과물을 만들어낼 것 과거의 나 1. BFS(너비 우선 탐색)으로 연속된 블록들을 모두 리스트로 가져온다. 2. 리스트의 블록들을 순회하면서 그 블록 기준으로 연속된 가로/세로 개수를 구한다. 3. 개수 조건에 들어맞는 매치를 수행한다. class ConnectInfo { List slots; //중복해서 계산하는 일이 없도록 캐싱함 Dictionary horizontal..
3매치 구조 회고 (2) : 타겟팅 로직
3매치 구조 회고 (2) : 타겟팅 로직
2023.09.18현재 회사에서 설계하고 유지보수한 3매치 코드는 이미 검증되었지만, 과거의 자신을 돌아보는 것이 늘 그렇듯 다시 읽어보면 구데기인 부분이 너무 많다. 그래서 이 시리즈는 과거의 설계를 돌아보며 더 확장성있는 코드를 고민해보는 글이 되겠다. 조건 블록을 4개 이상 매치하면 특수 블록이 만들어지는 모습은 이제는 흔한 장면이 되었다. 그 중에서도 똑똑하게 미션을 깰 수 있도록 도와주는 유도 미사일, 혹은 부메랑을 개발해야 했다. 1. 게임 목표에 있는 장애물을 우선적으로 타겟으로 할 것 2. 도중에 타겟이 된 블록이 파괴되거나 식별할 수 없게 되면 다른 타겟을 찾을 것 3. 장애물을 파괴하는 것이 목적이 아닌 경우도 있음 과거의 나 3매치를 만들면서 가장 공수를 많이 들인 부분이 타겟팅 로직이 아닐까 싶다. ..
3매치 구조 회고 (1) : 슬롯과 블록
3매치 구조 회고 (1) : 슬롯과 블록
2023.09.15현재 회사에서 설계하고 유지보수한 3매치 코드는 이미 검증되었지만, 과거의 자신을 돌아보는 것이 늘 그렇듯 다시 읽어보면 구데기인 부분이 너무 많다. 그래서 이 시리즈는 과거의 설계를 돌아보며 더 확장성있는 코드를 고민해보는 글이 되겠다. 조건 처음 입사했을 때, 새 3매치 프로젝트의 주요 사양에는 네 가지가 있었다. 1. 두 칸 이상의 크기를 가진 블록 기존 블록이 1x1이라면, 2x2 이상이나 5x1 등으로 이루어진 블록들을 만들 수 있어야 한다. 심지어 어떤 장애물 블록은 실시간으로 크기가 변경될 수도 있다. 2. 블록 위에 블록이 있을 수 있다 상자 블록이 있다고 하면, 그 블록을 가리는 꿀 블록이 있을 수도 있다. 이런 경우 꿀 블록이 사라질 때까지 상자 블록을 찾을 수 없다. (특수 블록의 대..
유니티 빌드 중 겪은 문제 정리
유니티 빌드 중 겪은 문제 정리
2023.08.24유니티 빌드를 하다 보면 별별 오류를 다 겪는다. 주로 SDK가 원인인 경우가 많다. 그 오류들의 원인은 대체 무엇이고 해결 방법은 무엇인지 알아보는 글이 되겠다. 그리고 인터넷에 널린 글들을 찾아볼 필요 없도록 그냥 이 글에 다 넣어버릴 예정이다. 페이스북 SDK 에러 : debug.keystore 없음 [콘솔] Your Android setup is not correct. See Settings in Facebook menu. [경고] Your android debug keystore is missing! You can create new one by creating and building empty Android project in Eclipse. 해결 방법 아무 유니티 프로젝트에서 Android ..
LeetCode 23.08.16 : Sliding Window Maximum
LeetCode 23.08.16 : Sliding Window Maximum
2023.08.17https://leetcode.com/problems/sliding-window-maximum/ 풀이 - 보자마자 이중 for문? 생각했지만 제한조건에 nums.length가 10의 5승인 걸 보고 그만둠. - 우선순위 큐로 최초 k 사이즈만큼의 num들을 정렬해놓고, 다음 k + index에 위치한 숫자를 EnQueue하는 방식으로 생각. - 우선순위 큐 검색 도중 window 안에 들어와있는 값이 아니면 삭제해보도록 하자. - 닷넷에는 이미 구현된 PriorityQueue가 있다. public class IntMaxCompare : IComparer { public int Compare(int x, int y) => y.CompareTo(x); } static int[] Solution(int[] n..
ZString 라이브러리는 어떻게 제로 할당을 주장하는가
ZString 라이브러리는 어떻게 제로 할당을 주장하는가
2023.08.04string을 매번 선언할 때마다 메모리 할당이 일어나는 것은 당연한 일이지만, 그만큼 경계해야 할 일이기도 하다. 특히나 프레임마다 string을 선언하거나 stringBuilder 없이 문자열을 합치는 것은 성능 상 좋지 않다. 이러한 메모리 할당을 줄이는 방법은 굉장히 다양하지만, 이번 글에서는 가장 금방 적용할 수 있는 라이브러리를 소개한다. https://github.com/Cysharp/ZString GitHub - Cysharp/ZString: Zero Allocation StringBuilder for .NET and Unity. Zero Allocation StringBuilder for .NET and Unity. Contribute to Cysharp/ZString developmen..
Unity 인스펙터 꿀팁 알아보기
Unity 인스펙터 꿀팁 알아보기
2023.08.03이전 사수분이 유튜브 유니티 11가지 꿀팁 영상을 공유해주셨는데, 개발자 입장에서 내용이 굉장히 유익했다. 이런 자잘한 꿀팁들이 또 존재할 것 같아서, 영상들과 유니티 공식 메뉴얼을 뒤져보았다. 이 글은 그 결과로 나온 요약글이다. 프로그래머가 아니더라도 인스펙터를 자주 만지는 사람들에게 유용할 것이라고 생각한다. 사실 그 때에는 인스펙터 프리셋 기능도 정리했었는데, 결국 안 쓰게 되서 그 부분은 제외했다. 궁금하신 분은 공식 블로그 글을 확인해보는 것도 괜찮을 듯. 아무튼 본론으로 들어간다. 여러 오브젝트 한번에 일렬로 배치하기 주의, 유니티 2021 버전 이상만 가능하다. 여러 오브젝트를 선택한 뒤에 숫자 프로퍼티에 L(최솟값, 최댓값)을 입력하면 알아서 일렬로 배치된다. L은 Linear의 약자인 ..