Unity - Coroutine, yield, Invoke, IEnumerator
·
Unity
코루틴 (Coroutine)Unity에서 제공하는 특수한 함수 실행 방식이다.일반적인 동기 함수는 한 번에 호출되면 끝까지 즉시 실행되는 반면,코루틴은 중간에 잠시 멈췄다가(yield) 나중에 다시 이어서 실행할 수 있다.마치 비동기처럼 동작하는 듯이 보이는데 사실 비동기와는 조금 다르다.진행 중인 쓰레드에서 일시정지 후, 잠시 다른 로직의 진행에 쓰레드 자리를 내어준 뒤, 재실행 되는 듯한 구조를 보인다. 아래는 코루틴의 기본 구조다.public class CoroutineExample : MonoBehaviour{ void Start() { StartCoroutine(PrintNumbers()); } IEnumerator PrintNumbers() { ..
Unity - Rigidbody, Collider - 물리, 충돌 처리
·
Unity
Unity에서는 충돌 감지 시스템을 제공한다.단순 감지 뿐 아니라 질량, 중력, 마찰, 탄성 등 물리적 특성까지 구현되어있다.이러한 충돌 처리는 게임에서 수많은 상호작용에 사용되는 기능이므로 잘 이해하고 숙지해야 한다. Rigidbody : 물리 연산의 주체. 질량, 중력, 속도, 회전력 등을 담당.Collider : 물리적 충돌 영역을 정의. 모양에 따라 경계가 결정.이 두 컴포넌트를 조합하여 물리 충돌 처리가 가능하다.이번 글에서는 이 물리 충돌 처리에 관해 정리해볼 것이다. Rigidbody물리 시뮬레이션을 적용하기 위한 핵심 컴포넌트다.게임 오브젝트가 중력에 영향을 받거나, 힘(충격)을 받아 움직이거나, 회전하는 모든 물리적 현상은 Rigidbody를 통해 계산된다. 주요 속성Mass질량 (기본..
Unity - Transform, 위치 이동
·
Unity
TransformUnity의 모든 GameObject에 자동으로 포함된 기본 컴포넌트다.이는 단순히 위치를 저장하는 데이터 구조 뿐만 아니라 씬 내에서 공간적 존재를 정의하는 근본적인 컴포넌트다. 구성 요소Position오브젝트 위치VectorRotation오브젝트 회전QuaternionScale오브젝트 크기Vector 자식 오브젝트는 부모의 Transform 영향을 함께 받는다.즉 부모가 회전하거나 이동하면 자식도 같이 회전하거나 이동하는 것이다. 이것을 월드 좌표와 로컬 좌표로 설명할 수 있다. 월드 좌표 (World Space) : 씬 전체의 기준 좌표계. (0,0,0)은 씬의 절대 원점.로컬 좌표 (Local Space) : 부모 Transform을 기준으로 한 상대 좌표. 부모가 회전하면 자신의..
C# - 콘솔로 "2중 버퍼링 (Double Buffering)" 구현하기
·
C#
문제 상황1차 콘솔 프로젝트 위 사진은 이전에 진행했던 콘솔 프로젝트다.투사체를 발사해서 내려오는 블럭을 파괴하는 간단한 게임이며가로3 x 세로2 크기의 셀을 논리 그리드로 정해서 배경색을 이용해 하나의 블럭처럼 표현했다. 실시간 슈팅 게임이므로 일정 시간마다 프레임을 갱신하는 업데이트 기반으로 구성되어 있었는데최초에 Console.Clear()로 작성하였더니 심한 깜빡임 현상이 발생했다. 이를 해결하고자 클리어가 아닌 SetCursorPosition() 을 이용해 다시 그리는 방식을 채용했으나깜빡임은 해결됐지만 화면 출력이 느리게 밀려 보이는 현상이 발생했다. 당시 자력으로 해결하지 못하고 이 문제에 대해 질문을 하였고 "2중 버퍼링을 활용해봐라" 라는 답변을 들었다.하지만 콘솔에서 대체 2중 버퍼링을..
C# - GetAsnycKeyState() 기반 실시간 키 입력 처리
·
C#
콘솔의 기본적인 Console.ReadKey() 기반으로 입력을 받으면, OS의 연속키 입력 지연 때문에 입력이 느리고 답답하게 느껴진다.이는 실시간 게임 같은 것에서는 조작감을 치명적으로 망쳐놓는 원인이 된다. 비슷한 현상을 Unity에서도 겪은 바 있기에, 이를 해결하고자 KeyDown / KeyUp을 이용한 인풋 시스템을 만들고자 했으나C#에는 KeyUp 기능이 없다...! 없으면 직접 만들어야지 뭐... 결론부터 말하면 GetAsyncKeyState()라는 Win32 API가 제공하는 비동기 키 입력 감지 함수를 이용해 해결할 수 있다. if (Console.KeyAvailable){ var key = Console.ReadKey(true).Key; switch (key) { ..
C# - LockConsoleSize() : 콘솔 창 크기 고정 및 리사이즈 방지
·
C#
콘솔프로젝트 도중, 시작과 동시에 콘솔 창 크기를 고정하고, 창 크기를 바꾸지 못하게 고정하고 싶었다. 사실 Console.SetWindowSize()를 이용해서 창 크기를 설정할 수 있지만이것만으로는 사용자가 마우스로 창 모서리를 드래그하거나, 최대화 버튼을 클릭하면...콘솔 프로젝트는 그냥 망가져버릴 수 있다. 이 문제는 Window API를 사용해서 콘솔 창의 윈도우 스타일을 직접 수정하는 것으로 해결할 수 있다. using System;using System.Runtime.InteropServices;namespace WeaponMasterDefense{ public static class ConsoleWindowManager { [DllImport("user32.dll"..
Unity - 오브젝트(Object), 컴포넌트(Component), 오브젝트 풀링(Object Pooling)
·
Unity
Object라는 건 프로그래밍 외에도 다양한 곳에서 다양한 의미로 사용된다.어째 현실에서도 Object 데이터 타입이랑 똑같다... 이번 글에서는 유니티에서 Objec와 관련된 내용들을 정리해 봤다. Scene게임의 한 단계 / 장면을 구성하는 모든 리소스와 상태를 담는 .unity 파일이다.독립적인 세계(레벨) 단위로 메뉴, 플레이, 엔딩 등 씬을 분리해 개발, 테스트, 로딩을 최적화할 수 있다.씬 간의 전환은 SceneManager.LoadScene() 함수를 통해 이루어진다.using UnityEngine.SceneManagement;// 싱글 로드SceneManager.LoadScene("Game");// 애드티브 로드(멀티 씬)SceneManager.LoadScene("UI", LoadScen..
C# - 콘솔 폰트 크기 변경하기 SetCurrentConsoleFontEx
·
C#
C#의 콘솔 앱은 기본적으로 Consolas 폰트, 16픽셀 내외의 크기로 표시된다.하지만 콘솔 게임이나 텍스트 UI를 구현할 때는, 글자 폭과 높이를 세밀하게 조정해야 한다.이를 위해 Windows API(karnel32.dll)을 호출해 콘솔의 폰트를 직접 변경할 수 있다. 필자는 텍스트 셀의 크기를 많이 줄여서 실제 픽셀처럼 사용하기 위해 이 기능을 사용했다. Windows API를 통한 콘솔 제어C#의 System.Console 클래스는 기본적인 출력 기능만 제공한다.폰트 크기, 폭, 이름 등을 직접 바꾸는 기능은 없다. 따라서 폰트를 조정하기 위해선 Win32 API를 직접 호출해야 하는데이때 C#에서 C/C++ DLL 함수를 호출하기 위해 사용하는 기능이 바로 P/Invoke (Platfor..
C# - 메모리 구조, GC
·
C#
Memory 구조프로그램 실행 시 메모리는 4개의 주요 영역으로 나뉨코드 (Code Segment) : 실행할 프로그램 코드 저장데이터 (Data Segment) : static 변수 저장스택 (Stack) : 함수 호출 시 생성되는 프레임, 지역변수 / 매개변수 / 반환 주소 저장힙 (Heap) : 동적으로 할당된 객체 저장C# 관점스택 : 함수 호출과 로컬 변수 관리힙 : 동적 객체 저장, 참조형 타입 대부분 저장 Stack함수 호출 시 생성되는 메모리 프레임 관리저장 내용매개변수지역변수반환주소특징LIFO 구조 (Last In First Out) 후입 선출자동 할당/해제 → 빠름함수 종료 시 프레임 제거void Foo(){ int x = 10; // x는 스택에 저장 iny y = 20;} cl..
C# - 정렬 알고리즘 (Sorting Algoritm) : 버블/선택/삽입/병합/퀵 정렬
·
C#
배열을 효율적으로 정렬하기 위한 여러 알고리즘 적 시도가 있었다. 버블 정렬 (Bubble Sort)선택 정렬 (Selection Sort)삽입 정렬 (Insertion Sort)병합 정렬 (Merge Sort)퀵 정렬 (Quick Sort)힙 정렬 (Heap Sort) 이번 글에서는 위의 유명한 5가지 정렬에 대해 정리해볼 것이다. 버블 정렬 (Bubble Sort)인접한 두 원소를 비교해 잘못된 순서면 스왑한다.한 패스가 끝나면 가장 큰 값이 맨 뒤로 이동하게 되며, 이를 정렬 될 때까지 반복한다. public static void BubbleSort(int[] arr){ int n = arr.Length; for (int i = 0; i arr[j + 1]) { ..