[Unity] 총알 시스템으로 알아보는 Object Pool
·
Unity,C#/Unity 정보
■ Object Pool게임 오브젝트를 생성하는 Instantiate() 메서드는 비용이 높은 연산이다. 이 메서드를 게임 플레이 중 반복적으로 호출하면 프레임 드롭이나 GC(Garbage Collection) 스파이크 등 다양한 성능 문제를 일으킬 수 있다. 이를 해결하기 위해 "필요할 때마다 생성하자"가 아닌, "미리 만들어 두고 꺼내 쓰자"라는 접근 방식을 취하는 것이 바로 Object Pool이다. 🤔Instantiate()가 비싼 이유Unity에서 우리가 작성하는 코드는 C#이지만, Unity 엔진의 내부(코어)는 C++로 작성되어 있다. 즉, 우리가 다루는 C# 코드는 C++ 코어를 조작하는 리모컨 같은 역할을 한다. Instantiate()를 호출하면, Unity는 하나의 게임 오브젝트를 ..
[Unity, C#] 델리게이트에 대한 모든것(Action, Func, Lambda)
·
Unity,C#/Unity 정보
■ 델리게이트(Delegate)게임 개발을 하다 보면 “어떤 일이 일어났을 때 이 코드를 실행해 줘”라는 패턴이 굉장히 많다. 예를 들어,private void OnTriggerEnter(Collider other){ if(other.Tag("Wall") == true) { //충돌된 오브젝트의 태그가 Wall이라면 실행... }}[간단한 충돌 코드]위 코드처럼 충돌 발생 시 실행할 코드를 작성한다. 하지만 충돌 시 실행할 동작이 상황에 따라 매번 달라져야 한다면 어떻게 될까?public class Bullet{ private Player _player; private Enemy _enemy; private Manager _manager; private void OnTriggerEnter(Collid..
1. 리치마작을 배워보자! - 마작의 기본
·
게임/리치마작
■ 마작 패마작의 패는 숫자가 적힌 수패(만수패, 통수패, 삭수패)와, 글자가 적힌 자패(동·남·서·북의 풍패와 백·발·중의 삼원패)로 구성된다. 각 패는 동일한 종류가 총 4장씩 존재한다.수패 중에서 1과 9는 노두패, 2~8은 중장패라고 부른다.마작은 기본적으로 4명(또는 규칙에 따라 3명)이 참여하며, 각 플레이어는 처음에 13장의 패를 받는다. 자신의 턴이 되면 패산(쌓아놓은 패 더미)에서 패를 한 장 뽑고, 그 후 패 한 장을 버리는 방식으로 게임을 진행한다. ■ 마작의 승리! 화료(和了)의 조건마작은 4개의 몸통(멘츠)과 1개의 머리(또이츠)를 완성하면 화료(승리)할 수 있다. 머리는 동일한 패 2개로 이루어지며, 몸통은 연속된 수패 3장(예: 2만·3만·4만) 또는 같은 패 3장(刻子-커쯔)..
[C++, 자료구조] 트리(Tree)
·
C++/자료구조
■ 비선형 자료구조 - 트리(Tree)우리가 여태까지 다룬 자료구조(배열, 리스트, 스택, 큐, 덱)는 각 데이터가 앞 뒤로 하나의 데이터와만 연결되는 구조를 가지는 “선형 자료구조”였다.이번 장에서 설명할 트리(Tree)는 하나의 데이터가 여러 개의 하위 데이터를 가질 수 있는 구조로, 계층적인 관계(Hierarchical Relationshipe)를 표현하는 비선형 자료구조인 트리에 대해 살펴보자. 자료구조를 단순히 “저장하고 꺼내는 도구”로 이해하기 쉽지만, 자료구조의 본질은 어떤 대상을 구조적으로 표현하는 도구이다.따라서, 트리의 추상 자료형(ADT)을 정의할 때도 “저장과 삭제가 편리한가?”보다 “계층 구조를 표현하기에 적절하게 정의되었는가?”의 관점에서 바라보는 것이 옳다. 1. 트리의 표현트..
[게임수학] 10-2. 깊이 값
·
게임수학
→ 이 글은 「이득우의 게임 수학」을 바탕으로 작성했습니다.■ 깊이 값3D 공간의 물체들을 화면이라는 2차원 평면에 투영하면, 화면 좌표에는 $x$와 $y$정보만 남게 된다. 이 상태에는 어떤 물체가 더 앞에 있고 뒤에 있는지를 구분할 수 없어 결국 나중에 그려진 물체가 화면의 앞에 보일 수밖에 없다. 따라서 물체가 카메라로부터 얼마나 떨어져 있는지 파악할 수 있는 데이터가 필요한데, 이를 깊이$^{Depth}$값 이라 한다.2차원 평면의 NDC에서 깊이 값을 추가하면 3차원 영역으로 확장된다. 깊이 값의 범위는 동일하게 $[-1,1]$이다.NDC영역과 마찬가지로 카메라에 부여한 시야각은 깊이값과 무관하기 때문에 근평면$^{Near plan}$과 원평면 $^{Fraplane}$이라는 추가 속성을 부여해야..
[게임수학] 10-1. 원근 투영
·
게임수학
→ 이 글은 「이득우의 게임 수학」을 바탕으로 작성했습니다.■ 원근 투영 변환 원리우리 눈은 멀리 있는 물체일수록 작게 보이는 구조를 가지고 있다. 이는 눈이 외부의 빛을 한 점(망막)으로 모아 받아들이기 때문이다. 르네상스 시대의 화가들은 이 원리를 그림에 적용해 입체감을 표현하는 기법을 만들었고, 이를 투시 원근법(Perspective projection drawing)이라 한다.우리가 만드는 3D 공간은 결국 2D화면(모니터)에 표현되어야 한다. 따라서 3차원 공간의 모든 점들을 2차원 화면 위에 자연스럽게 투영하기 위해, 멀리 있는 것은 작게, 가까운 것은 크게 보이도록 하는 변환 과정이 필요하다. 이 변환을 바로 “원근 투영 변환(Perspective projection transformatio..
[C++, 자료구조] 덱(Deque)
·
C++/자료구조
■ 덱(Deque)스택은 같은 한쪽(Top)에서 데이터를 넣고 빼는 구조였고, 큐는 뒤에서 데이터를 넣고 앞에서 데이터를 꺼내는 자료구조였다.덱은 앞으로도 뒤로도 넣을 수 있고, 앞으로도 뒤로도 뺄 수 있는, 스택과 큐의 특성을 모두 갖추고 있는 자료구조이다.Deque는 ‘디큐’로 읽기 쉬운데, 이러면 큐의 Dequeue연산과 발음이 같아져 “덱”으로 발음한다Double-Ended Queue의 줄임말이다.▶ 덱의 추상 자료형덱의 특성을 살펴봤으니, 이번엔 덱의 추상 자료형에 대해 살펴보자.정의설명void InitDeque(Deque* dq)덱의 초기화를 진행한다. 덱 생성 후 가장 먼저 호출한다.bool IsEmpty(Deque* dq)덱이 빈 경우 ture, 그렇지 않은 경우는 false를 반환한다.v..
[C++, 자료구조] 큐(Queue)
·
C++/자료구조
■ 큐(Queue)앞서 스택(Stack)은 먼저 들어온 것이 나중에 나가는 “선입후출(FILO)” 구조를 지녔다. 그리고 이걸 “쌓여있는 접시”, “프링글스 통 안의 감자칩”에 비유했었다, 반대로 큐(Queue)는 “줄을 서 있는 사람들”처럼 먼저 들어온 것이 먼저 나가는 “선입선출(FIFO)”의 구조를 지닌다.큐의 개념은 일상생활에서도 쉽게 찾을 수 있다. 고무호스, 터널, 극장표 예매처 등은 모두 큐의 동작 방식과 유사한 구조이다.▶ 큐의 추상 자료형스택과 마찬가지로 큐의 추상 자료형도 정형화된 편이다.enqueue : 큐에 데이터를 넣는 연산.dequeue : 큐에서 데이터를 빼는 연산. 정의 의미 void InitQueue(Queue* pq)큐의 초기화를 진행한다.bool IsEmpty(Queu..
[Unity, C#] SOLID 원칙
·
Unity,C#/Unity 정보
■ SOLID 원칙프로그래밍에서 널리 사용되는 디자인 패턴(Design Patterns)은 Gang of Four(GOF) 라 불리는 4명의 저자가 정리한 책에서 시작되었다. 디자인 패턴을 공부해본 사람이라면 알겠지만, 대부분의 책은 SOLID 원칙부터 소개하고, 대부분의 디자인 패턴 역시 이 SOLID 원칙을 준수하도록 설계되어 있다. ▶ SOLID 원칙Single responsibility : 단일 책임 원칙Open-closed : 개방-폐쇄 원칙Liskov substitution : 리스코프 치환 원칙Interface segregation : 인터페이스 분리 원칙Dependency inversion : 의존 역전 원칙위 5가지 원칙의 앞 글자를 따서 “SOLID” 원칙이라 부른다. 물론 실제 프로그..