[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. [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함수를 통해 매 프레임마다 데이터의 값을 확인하고 반영하는 작업을 수행할 수 있지만, 이 방법이 권장되지 않는다는 것은 많은 분들이 아실 것입니다.이러한 문제를 해결하기 위해 Observer Pattern 이 종종 이용되는데, 데이터 자체에 값 변경시 필요한 작업을 등록(Register)하고, 값을 변경할 때 자동으로 등록된 작업들을 수행하도록(Invoke) 합니다. 그래서 고안한 것이 "데이터를 작업과 함께 묶어주는 클래스를 만들자"였습니다. 이에 이전 글에서 Data 라는 클래스를 만들어 주었죠.그런데 이에 더해서, 데이터 자체를 인스펙터에서 블록 형태로 등록하고 관리할 .. 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. [Unity] Animation 에셋을 관리하는 특이한 방법 : Animation Clip into Animator Controller 2021.2.15f apple silicon 버전 기준으로 작성되었습니다. 0. 글을 읽기 전 알아두기 유니티 버튼 애니메이션 Transition - Animation 유니티 버튼 애니메이션 Transition - Animation 버튼 눌렸을때 애니메이션 만들기 Button Script의 T... blog.naver.com [에디터 확장 입문] 번역 26장 AssetDatabase http://anchan828.github.io/editor-manual/web/asset_database.html26장 AssetDatabase AssetDatabase... blog.naver.com 이 글에서는 Animation Clip을 Animation Controller 하위에 위치시키도록 하는 방법을 소개합니다... 2022. 4. 8. [Unity] 유지보수성과 성능을 모두 챙기는 방법 - 데이터 변경에 따른 콜백과 MVC 분리 0. 개요 데이터가 변경됨에 따라 특정 작업을 수행해야 하는 경우가 있습니다. 예를 들면 HP 값이 변경될 때, 동시에 UI를 갱신해야 하는 경우가 있을 텐데, 이 때 UI를 관리하는 클래스에서 Update()를 통해 HP 데이터를 가진 클래스를 참조하여 HP 값을 매 프레임마다 계속 관찰하면서 UI를 갱신할 수도 있지만, 이는 성능 상 좋지 않다는 것을 모두 알 것입니다. 대신에 HP가 변경되는 시점에만 UI 갱신 작업을 수행하도록 하면 성능을 높이고 코드의 유지보수성도 향상시킬 수 있습니다. 이 글에서는 C#의 delegate를 이용하여 데이터 변경에 대한 이벤트 등록/발생을 쉽게 구현하고, 더 나아가 이를 통해 유니티에서 MVC를 바람직하게 분리할 수 있음을, 또한 그 MVC 각각을 Scene의 h.. 2022. 3. 22. 이전 1 2 다음