본문 바로가기
[Algorithm] 백준 13787 Infinity Maze https://www.acmicpc.net/problem/13787 백준에서 문제 찾아보다가 이름이 맘에 드는 문제를 발견했습니다. 재작년에 출시한 게임 iMaze와 같은 이름! 너무 반가워서 바로 풀어보았습니다. 문제가 영어로 되어있어서 우리말로 풀어볼게요. 문제 후쿠오카 박사는 2D 미로에 간단한 로봇을 배치시켰습니다. 미로는 출구가 없어서 로봇이 밖으로 나갈 수 없습니다. 아래 그림처럼 H x W 격자 셀로 만들어졌고, 미로의 위, 오른쪽, 아래, 왼쪽은 각각 북(N), 동(E), 남(S), 서(W)쪽입니다. 각 셀은 벽(#)이거나 빈 공간(.)이고, 좌표 (i, j)에 대해 i는 남쪽으로 갈수록 커지고, j는 동쪽으로 갈수록 커져서, 가장 왼쪽 위부터 (1, 1), 가장 오른쪽 아래는 (H, W).. 2024. 2. 15.
[Unity] 마인크래프트 Voxel System 구현과 Jobs + Burst 최적화 이 글에서는 마인크래프트를 구현하는 데 사용되는 방법인 Voxel System과, 이를 Job System + Burst Compiler로 최적화하여 속도를 2배 가까이 빠르게 만든 과정을 설명하려 합니다. A. 서론 서론이 길지만 딱히 쓸 데 있는 내용은 아니니, 넘어가셔도 좋습니다. 최근 만들고 있는 모바일 게임에서 3D 맵 에디터를 만들기 위해 여러가지 방안을 생각해 봤습니다. 처음엔 무식하게 GameObject를 하나씩 Instantiate/Destroy하는 방식으로 구현했는데, 사실 맵이 클 필요가 없어서 성능이 그리 크게 저하되지는 않았습니다. 그런데 모바일이니 성능은 최대한 올리는게 좋고, 기왕 하는거 좀 더 큰 맵을 만들 수 있도록 했으면 좋을 것 같고, 마인크래프트와 같이 블록을 일일이 .. 2024. 1. 5.
[Unity] Job System 간단 매뉴얼 자세한 개념은 대부분 생략하고, Job System의 사용법을 예제와 함께 간단히 설명드리려 합니다.1. 사용 순서작업을 Job으로 만들기Job 인스턴스 생성Job 인스턴스의 Schedule() 메서드를 통해 JobHandle 객체 생성JobHandle 인스턴스의 Complete() 메서드를 통해 스케줄된 Job을 실행2. 예제(1) IJob아래와 같이 IJob 인터페이스를 구현하는 형태로 만들어 실행할 수 있습니다.using Unity.Collections;using Unity.Jobs;using UnityEngine;public class MyMono : MonoBehaviour{ public int arraySize = 100; void Start() .. 2024. 1. 3.
[Unity] LateFixedUpdate Unity에는 다음과 같이 세 가지 Update 함수가 있습니다. Update() LateUpdate() FixedUpdate() 이 세 가지 업데이트 함수의 특징들을 간단히 짚어 보면, Update()는 매 프레임의 시작마다 호출되고, LateUpdate()는 매 프레임이 끝날 때마다 호출되며, FixedUpdate()는 프레임과 상관 없이 일정한 시간 간격마다 호출됩니다. FixedUpdate()는 물리엔진이 실행되는 기준이 되는 기본값이죠. 그런데 임의로 만든 어떤 MonoBehaviour 스크립트의 FixedUpdate()는 물리엔진보다 먼저 실행됩니다. 가령, OnCollisionEnter(~)에서 오브젝트의 충돌을 감지할 때 "Collision"을 출력하고, FixedUpdate()에서는 "f.. 2023. 10. 4.
[Flutter] Riverpod - List 타입의 상태 관리하기 Riverpod의 Provider가 Mutable Set, List와 같은 집합 타입의 객체를 반환하도록 하는 것은 간단해 보이고, 사실 실제로 간단하지만, 상당히 실수하기 쉽습니다. 이 글에서는 제가 저지른 그 실수를 짚어보고, 발견한 해결책에 대해 설명하려 합니다. * 아직 Flutter를 공부하고 있는 단계이기 때문에 정확하지 않고 두루뭉술한 표현이 다소 있습니다. 모든 지적은 환영입니다! 1. 잘못된 구현 final myListProvider = StateProvider((ref) => []); List 객체를 반환하는 myListProvider를 이용해서, 해당 List의 length를 표시해주는 Text, 그리고 List에 원소를 추가해주는 버튼으로 구성된 간단한 위젯을 만들어보면서 알아봅시다.. 2023. 8. 1.
[Unity] ECS - Archetype Archetype은 특정한 조합의 Components를 묶은 것을 말합니다. 가령 Component A, B, C가 있는 상황에는 다음과 같이 일곱 가지(진부분집합의 개수 = 2ᴺ - 1개)의 Archetype이 나올 수 있습니다. [0]: (A) [1]: (B) [2]: (C) [3]: (A, B) [4]: (B, C) [5]: (A,C) [6]: (A, B, C) 어떤 Entity E가 A, B를 가지고 있다면 E는 3번 Archetype을 가진 셈입니다. Archetype이라는 개념은 이게 전부입니다. 아주 간단하죠. 그런데 굳이 왜 이런 식으로 데이터를 저장하는 것일까요? 1. Archetype과 Chunk Archetype하나는 16KiB짜리 Chunk들로 이루어져 있습니다. 이 Chunk에는 .. 2023. 7. 11.
[Unity] DOTS: Jobs, Burst, ECS 간단 정리 이 글에서는 유니티의 데이터 지향 개발 기술에 대해서 설명 드리려 합니다. 먼저 제가 DOTS를 공부하는 데에 가장 도움이 많이 된 영상입니다: https://youtu.be/H7zAORa3Ux0 유니티 DOTS를 공부하고 싶으신 분들은 아래 정리 글을 보신 후 위 영상을 보시면 좋을 것 같습니다. 정리된 각 항목에 대해 깊게 파 보는 것도 좋지만, 얕게 알고 가는 것도 크게 상관은 없을 것 같습니다. 어차피 실제 돌아가는 코드를 봐야 이해가 제대로 됩니다. # DOTS: 데이터 지향 기술 스택 # DOTS는 데이터 지향 구현을 돕는 기술들을 지칭하는 용어 데이터 지향 설계(DOD)를 통해 메모리 사용성 향상 → 성능 극적 향상 Unity의 DOTS: Job System, Burst Compiler, E.. 2023. 6. 19.
[Unity] IAP 구매버튼 Custom Editor로 편하게 만들기 1. IAP Catalog Unity IAP 패키지(com.unity.purchasing)에서는 IAP Catalog라는 JSON 형식의 파일을 통해 상품들을 관리합니다. 각 스토어에서 각 상품에 대응되는 id를 비롯한 여러 정보들이 이 IAP Catalog에 담겨져 있습니다. 패키지에서 기본적으로 제공되는 IAP Button 컴포넌트에서 다음과 같이 Title, Description, Price에 해당하는 Text 뷰를 할당해주면, 선택한 Product ID에 맞춰 IAP Catalog에 있는 상품 품목의 정보가 Text 뷰들에 할당됩니다. 그런데 안타깝게도 Image에 대해서는 수동으로 처리해야 하고, 애초에 저는 저 컴포넌트들을 지정해주는 것마저 귀찮았습니다. 그래서 Custom Editor를 이용.. 2023. 5. 21.
[Unity] 2D LookAt Lerp Transform에는 특정 target을 바라보도록 하는 함수인 LookAt이 기본적으로 내장되어 있습니다. 그런데 이 함수는 한 프레임 만에 회전값을 변경시킵니다. 2D에서는 다음과 같이 간단하게 수식 하나로, 바라보는 방향 벡터의 x축을 기준으로 하는 각도(θ)값을 얻고 이를 통해 Quaternion.Lerp를 활용하여 부드럽게 회전시킬 수 있습니다. 바로 코드부터 봅시다. public static class LookAtExtension { public static void LookAt2DLerp(this Transform transform, Vector2 dir, float lerpPercent = 0.05f) { float rotationZ = Mathf.Acos(dir.x / dir.magnit.. 2023. 4. 26.
[Unity] 편리한 데이터 관리 - Data Scriptable Object 데이터를 수정하게 되면 거의 대부분 UI에 표시하기, 값에 따라 어떤 이벤트 발생시키기 등의 추가 작업이 동반 됩니다. Update함수를 통해 매 프레임마다 데이터의 값을 확인하고 반영하는 작업을 수행할 수 있지만, 이 방법이 권장되지 않는다는 것은 많은 분들이 아실 것입니다. 데이터 자체에 값 변경시 필요한 작업을 등록(Register)하고, 값을 변경할 때 자동으로 등록된 작업들을 수행하도록(Invoke)할 수 있다면, 또 데이터 자체를 인스펙터에서 블록 형태로 등록하고 관리할 수 있다면 굉장히 편리할 것입니다. 데이터 하나에 대해서 값 그 자체와, 변경에 대한 콜백을 담는 Action 객체를 또 하나의 객체로 묶어 관리하고, 그 객체를 Scriptable Object(이하 SO)로 만들면 이러한 목.. 2023. 4. 21.
[Unity] PlayerPrefs - 암호화 및 임의 객체 저장 PlayerPrefs는 로컬에 필요한 정보를 코드 단 한 줄로 저장할 수 있는 편리한 기능입니다. 하지만 그 이름에서 알 수 있듯이, PlayerPrefs는 Preference, 즉 '사용자 설정'을 저장하기 위한 용도로 사용하는 게 적절합니다. 또한 사용할 수 있는 타입이 Float, Int, String 밖에 없기 때문에 이 상태로 어떤 객체를 저장하기에는 한계가 있습니다. 또한, 디스크에 단순한 텍스트 파일로 저장하기 때문에 데이터를 처리하는 과정이 느리고, 데이터의 양이 많아질 수록 더욱 느려집니다. 정확히는 모르지만 아마 어떤 키 값을 찾기 위해 "텍스트에서 문자열 찾는 알고리즘"이 사용되겠죠. 한 마디로, 보안과 타입, 속도에 한계가 있는 셈입니다. 모든 정보는 string으로 표현이 됩니다... 2023. 4. 21.
[Unity] UnityMediation.h file not found • Issue 광고 수익 최적화를 도와주는 패키지인 Mediation을 적용한 뒤 빌드했더니, .xcodeproj를 열고 빌드할 때 다음 에러가 발생했습니다. https://forum.unity.com/threads/unitymediationsdk-unitymediationsdk-h-file-not-found.1286033/ 포럼을 둘러보니 .xcodeproj가 아니라 .xcworkspace 파일을 열어야 한다고 합니다. 하지만 난 그런 파일이 없는데?! 그 때가 되어서야 Unity에서 iOS빌드할 때 생긴 에러로그가 눈에 들어왔습니다. "pod install" 명령어가 실패했다는 내용이었죠. 찾아보니 그냥 m1이라서 발생하는 버그였습니다. • Resolve 그래서 지금 글을 쓰고 있는 2022년 9월 .. 2022. 9. 30.