# Component 패턴- Component 패턴의 개념모든 코드들을 부품화해서 관리를 하는 방식을 의미한다언리얼은 상속과 Component가 어느정도 혼합되어있지만유니티는 거의 Component로만 구성되어있다 - Component 패턴의 예시public void Update(int deltaTick){ // 이동 로직 // 애니메이션 로직 // 스킬 로직 // 물리 로직}위와 같은 일반적인 방식을 Component 패턴를 통해아래와 같이 구성할 수 있다AnimationComponent _move = new AnimationComponent();SkillComponent _skill = new SkillComponent();PhysicsComponent _phys..
# 에디터 입문 (단축키)마우스 우클릭 누른 상태 + 마우스 이동: 카메라 상하좌우마우스 우클릭 누른 상태 + wasd: 카메라 이동마우스 우클릭 누른 상태 + q or e: y축 고정 카메라 상하이동마우스 우클릭 누른 상태 + 마우스 휠: 카메라 이동속도 설정마우스 휠: 카메라 줌인 줌아웃 (딱딱)alt + 마우스 우클릭 누른 상태: 카메라 줌인 줌아웃 (소프트)alt + 마우스 좌클릭 누른 상태: 카메라 상하좌우 (중심을 기점으로)게임오브젝트 클릭한 뒤 q w(transform) e(rotation) r(scale) 확인 및 조절ctrl + shift + f: 선택한 오브젝트의 위치와 각도를 씬창에 위치한 우리의 카메라와 동기화 # Play ctrl + p: 플레이(게임 시작)주의점은 플레이 상태에서..
해당 카테고리의 글들은 루키스 강사님의 "[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진" 강의를 수강하며정리한 개인 노트입니다일부 핵심적인 내용에만 거의 초점을 맞추어 메모형식으로 작성하였습니다그렇기에 해당 글을 통해 유니티 엔진에 대한 입문 지식을 얻는 것은 비추천하며강의를 참고해 주시길 부탁드립니다https://www.inflearn.com/course/mmorpg-%EC%9C%A0%EB%8B%88%ED%8B%B0 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진 강의 | Rookiss - 인프런Rookiss | , MMORPG 개발에 필요한 모든 기술, C# + Unity로 Step By Step! 🕹️ [사진] 기초부터 끝판왕까..
# Dictionary- C#의 Dictionary와 HashSetC#의 Dictionary는 C++의 unordered_map과 거의 같다C#의 HashSet은 C++의 unordered_set과 거의 같다 - 주의점두 언어 모두 임의접근을 하는 경우 주의할 필요가 있다C#의 Dictionary[key]는 키가 없으면 예외가 발생한다반면, C++의 unordered_map[key]는 키가 없으면 기본 값을 생성하여 추가된다// C#Dictionary dict = new Dictionary();var value = dict[1]; // KeyNotFoundException 발생// C++unordered_map dict;auto value = dict[1]; // 새로운 키 1이 생성되고, 값은 기본값(..
# List- C# List 개념C#의 List는 C++의 vector와 같다고 보면 된다중간 삽입, 중간 삭제는 매우 비효율적이다 - C# List 주의점객체를 생성만 하고 임의 접근을 하면, 항상 런타임에서 ArgumentOutOfRangeException이 발생한다범위를 벗어난 접근 역시 항상 예외가 발생하며, C#의 런타임이 이를 안전하게 보호해 준다즉, C#의 인덱서 접근은 기본적으로 안전하지만주의해서 코드를 작성할 필요는 당연히 있다 - C++ vector 주의점객체를 생성만 하고 임의 접근을 하면 'Undefined Behavior'가 발생하며, Debug 모드에서는 크래시가 발생할 수 있지만,Release 모드에서는 크래시가 발생하지 않을 수도 있다범위를 벗어난 접근은 항상 크래시가 발생하..
# 배열- 배열Lvalue를 선언할 때 '[]' 위치가C++과는 좀 다르기에 헷갈리지 않아야 한다초기화 방식은 다양하게 지원하는 것을 알 수 있다// C++ int arr[5]; int* arr = new int[5];// C# int[] arr = new int[5];int[] arr2 = new int[5] { 10, 20, 30, 40, 50 };int[] arr2 = new int[] { 10, 20, 30, 40, 50 };int[] arr2 = { 10, 20, 30, 40, 50 }; - C# 배열은 동적할당C++ 배열은정적할당도 가능하고, new 키워드를 통해 동적할당도 가능하다 반면, C# 배열은참조타입으로 동적할당을 한다는 점이 중요하다 - arr.LengthC++에서 sizeof()를..
# GC더 이상 참조 하지 않는 쓰레기 메모리들을 GC가 알아서 수집하고 자동으로 해제해 주는 기능을 의미한다프로파일러를 보다 보면 순간적으로 GC 때문에 성능이 하락하거나 게임이 끊기는 경우가 발생하는데이를 GC spikes라고 부른다 GC를 최소화 하기위한 다양한 기법을 숙지해서 활용하는 것이 중요하다# GC를 줄이기 위한 다양한 기법들 1. 객체 풀링 (Object Pooling) 개념: 게임에서 자주 생성되고 파괴되는 객체들(예: 총알, 파티클 효과, 적 캐릭터)을 미리 일정량 생성해두고 재활용하는 기법이다객체를 파괴하는 대신 비활성화해서 풀에 반환하고, 필요할 때 풀에서 꺼내 활성화하여 사용한다활용: Instantiate와 Destroy는 GC 발생의 주요 원인이다풀링을 사용하면 이 두 연산을 ..
# 메시(Mesh)란?유니티에서 3D 모델은 기본적으로 메시이다메시는 3D 객체의 모양을 정의하는 데이터 덩어리로아래의 요소들로 구성된다- 정점 (Vertices)3D 공간에서 점들의 위치 (X, Y, Z 좌표) - 삼각형 (Triangles/Indices)정점들을 연결해서 만들어지는 가장 작은 기본 단위로이 삼각형들이 모여 모델의 형태를 만든다 - 노멀 (Normals)각 정점이나 면이 어느 방향을 바라보고 있는지 나타내는 정보로빛 계산에 사용된다 - UV 좌표 (UV Coordinates)모델 표면에 텍스처를 입힐 때,텍스처의 어느 부분이 모델의 어느 정점에 매핑될지를 나타내는 2D 좌표 - 탄젠트 (Tangents)노멀 맵(Normal Map) 같은 특수 텍스처를 사용할 때 필요한 정보이다이런 정보..
# 배칭(Batching)?유니티 최적화 기술 중 배칭(Batching)은 중요하다특히 모바일이나 저사양 기기를 위한 유니티 게임을 만들 때필수적으로 이해하고 활용해야 하는 기술이다배칭은 간단히 말해 CPU가 GPU에 그리기 명령(Draw Call)을보내는 횟수를 줄여서 렌더링 성능을 최적화하는 기술이다# 드로우 콜(Draw Call)?배칭을 이해하려면 먼저 드로우 콜을 알아야 한다드로우 콜은 CPU가 GPU에게"이 모델을 이 재질로, 이 위치에 그려라"라고명령을 내리는 것을 의미한다 CPU는 게임 로직 계산, 물리 연산, 드로우 콜 생성 등의 일을 하고GPU는 CPU로부터 받은 드로우 콜을 바탕으로 실제로 화면에 이미지를 그린다문제는 CPU가 드로우 콜을 생성하고 GPU에 보내는 과정이 생각보다 비용이..
# 유니티 빌드 과정유니티는 스크립트(C# 등)와 분리된 계층에서 실행된다이 스크립트들은 빌드를 진행하면 아래와 같은 단계로 실행된다 1. IL 코드 생성: 개발자가 작성한 C# 코드는 먼저 IL(중간 언어)로 컴파일된다 2. IL2CPP 변환: IL 코드를 IL2CPP 백엔드가 받아서 C++ 소스 코드로 변환한다 3. 네이티브 컴파일: 변환된 C++ 소스 코드는 각 플랫폼(iOS, Android, Windows 등)에 맞는 네이티브 컴파일러 (ex. iOS는 Clang, Android는 GCC/Clang, Windows는 MSVC)를 통해 해당 플랫폼의 기계어 코드로 최종 컴파일된다 # IL2CPP의 장점1. 런타임 성능IL2CPP는 모든 IL 코드를 미리 C++ 코드를 거쳐 네이티브 기계어로 컴파일..