[Unity] 다수의 적을 어떻게 움직일까(3) - 객체 이동 코드
·
Unity,C#
■ 객체 이동WaveManager에서 구한 군집 분리력과 장애물 반발력, 그리고 FlowField에 저장된 이동 방향을 합쳐 최종 이동 벡터를 만들어 움직인다.■ DummyEnemy.csusing UnityEngine;public class DummyEnemy : MonoBehaviour, ISpatialItem{ public Vector3 Position => transform.position; public float Radius => separationRadius; [HideInInspector] public Vector3 Separation; [HideInInspector] public Vector3 ObstacleForce; [HideInInspector] public ..
[Unity] 다수의 적을 어떻게 움직일까(2) - 공간 해시 그리드
·
Unity,C#/Unity 정보
■ 공간 해시 그리드(Spatial Hash)Flow Field의 방향을 따라 이동하는 적들은 동일한 방향으로 이동하기 때문에 뭉쳐서 오게 된다.따라서 분리 및 조향을 통해 서로 겹치지 않게 처리해주어야 한다.적의 주변에 있는 다른 적들을 파악하기 위해 OverlapSphere + 태그 방식을 쓰면 결국 적의 객체 수(N)만큼 돌기 때문에 오버헤드가 심해지게 된다.따라서 서로의 분리에 필요한 건 “물리적인 충돌 정보”가 아닌, “근처에 같은 종류의 객체 어디 있나?”라는 위치 정보뿐이다. ⇒ 물리 엔진을 거칠 필요가 없음. ■ SpatialHash 구현공간 해싱 그리드의 핵심은 객체 스스로가 주변의 다른 객체를 일일이 찾는 것이 아니라, 등록 → 조회의 방식으로 이루어진다는 점이다. 모든 객체를 미리 격..
[Unity] 다수의 적을 어떻게 움직일까(1) - Flowfield 길찾기
·
Unity,C#/Unity 정보
■ Flow FieldFlow Field는 길 찾기 알고리즘의 한 종류로, 객체마다 경로를 따로 구하는 A*와 달리 맵 전체에 방향장을 한 번 깔아 다수가 공유하는 방식이다.Flow Field는 맵의 모든 칸에 “여기 서 있으면 어디로 가야 하는지” 화살표를 하나씩 미리 꽂아둔 지도이다.출발지를 신경 쓰지 않고, 목적지에서 거꾸로 맵 전체에 화살표를 한 번 깐다. 이 한 번의 계산 비용을 모든 객체가 공유하므로 “길 찾기 비용이 객체 수와 무관해진다.”플레이어 위치로부터 탐색을 시작해서 플레이어로 가는 방향을 그 타일에 미리 기록해 둔다.1. 거리 맵 (Integration Field)플레이어 칸을 0으로 두고, 너비 우선 탐색(BFS) 혹은 각 셀마다 가중치(이동 비용)가 있다면 다익스트라 알고리즘으로..
4. 절차적 도심 생성 - 건물 배치
·
Unity,C#/절차적생성(PCG)
▼ 이전 글 3. 절차적 도심 생성 - Perlin Noise로 경계면 다듬기▼ 이전 글 2. 절차적 도심 생성 - 가중치 Voronoi를 통한 구역 분할▼ 이전 글 1. 절차적 도심 생성 - 도로 생성■ 도로 생성 실제 도심을 내려다보면 도로가 격자 형태로 나 있고, 그 사이에 생긴 블hate-errorlog.tistory.com ■ 개요앞서 나눈 구역 위에 실제 건물을 배치한다. 건물 프리팹은 1x1, 2x3처럼 저마다 크기가 다르므로, 칸을 하나씩 훑으면서 그 자리에 들어갈 수 있는 크기를 골라 빈 구역을 채운다. ■ 건물 프리팹 로드하기인스펙터에서 타입별·크기별로 프리팹을 일일이 링크할 수도 있지만, 항목이 늘어날수록 잘못 연결하는 실수가 생기기 쉽다.그래서 프리팹 네이밍 컨벤션을 정하고, 이름만..
3. 절차적 도심 생성 - Perlin Noise로 경계면 다듬기
·
Unity,C#/절차적생성(PCG)
▼ 이전 글 2. 절차적 도심 생성 - 가중치 Voronoi를 통한 구역 분할▼ 이전 글 1. 절차적 도심 생성 - 도로 생성■ 도로 생성 실제 도심을 내려다보면 도로가 격자 형태로 나 있고, 그 사이에 생긴 블록마다 건물이 들어선다. 도시 생성의 기준이 되는 이 도로망을hate-errorlog.tistory.com▼ 참고 자료 [C#, Unity, 절차적 생성] 절차적 지형 생성 - 1.PerlinNoise■ PerlinNoise PerlinNoise는 1983년 Ken Perlin이 개발한 그래디언트 기반의 노이즈(Gradient Noise)함수로, 지형의 절차적 생성, 텍스처 생성, 구름이나 연기 같은 자연 현상 표현 등 다양한 절차적 콘텐츠 생hate-errorlog.tistory.com■ Per..
2. 절차적 도심 생성 - 가중치 Voronoi를 통한 구역 분할
·
Unity,C#/절차적생성(PCG)
▼ 이전 글 1. 절차적 도심 생성 - 도로 생성■ 도로 생성 실제 도심을 내려다보면 도로가 격자 형태로 나 있고, 그 사이에 생긴 블록마다 건물이 들어선다. 도시 생성의 기준이 되는 이 도로망을 먼저 만들어보자.1. CityLayout.csusing UnityEngine;hate-errorlog.tistory.com ■ Voronoi 알고리즘이란? 도시의 전경을 보면 건물들이 마구잡이로 들어선 것이 아니라, 거주·상업·공업 등 용도별 구역으로 나뉘고 각 구역에는 그 용도에 맞는 건물이 배치되어 있다. 따라서 도심을 절차적으로 생성할 때도 건물을 무작위로 흩뿌리는 것이 아니라, 먼저 구역을 나눈 뒤 그 구역에 맞는 건물을 배치해야 한다. 이 "구역 나누기"를 위해 Voronoi 알고리즘을 사용한다.보로노..
1. 절차적 도심 생성 - 도로 생성
·
Unity,C#/절차적생성(PCG)
■ 도로 생성 실제 도심을 내려다보면 도로가 격자 형태로 나 있고, 그 사이에 생긴 블록마다 건물이 들어선다. 도시 생성의 기준이 되는 이 도로망을 먼저 만들어보자.1. CityLayout.csusing UnityEngine;public class CityLayout{ public int Seed { get; private set; } public int Width { get; private set; } public int Height { get; private set; } public int CellSize { get; private set; } public ECellType[,] Cells; public CityLayout(int seed, int width, ..
[Unity] 이동 정리 - 벡터 개념부터 물리 이동까지(Transform, Rigidbody, CharacterController)
·
Unity,C#/Unity 정보
■ 벡터 - 이동의 토대Unity에서 물체를 이동시키는 방법을 이해하려면 먼저 벡터를 알아야 한다.벡터(Vector)를 쉽게 말하면 “어느 방향으로, 얼마나”를 나타낸 값이다. 즉 방향과 크기를 한데 묶은 값으로, 화살표를 떠올리면 된다.누군가 우체국이 어디예요?라고 물어봤을 때 저쪽 방향으로 10분(얼마나) 정도 걸어가면 됩니다. 이런 개념이 벡터인 것이다.2차원의 벡터라면 2개의 요소(스칼라)로 표현되고, 3차원의 벡터라면 3개의 요소로 표현된다. 여기서 스칼라는 크기만 있는 값 하나(예: 속도 5, 온도 20)를 의미하고, 벡터는 이 스칼라를 여러 개 묶어 방향까지 표현한 것이다.위 벡터는 x축으로 3, y축으로 2만큼 뻗은 화살표이다. 1. 위치 벡터와 방향 벡터이름에서 알 수 있듯이 위치 벡터는..
[Unity] 총알 시스템으로 알아보는 Object Pool
·
Unity,C#/Unity 정보
■ Object Pool게임 오브젝트를 생성하는 Instantiate() 메서드는 비용이 높은 연산이다. 이 메서드를 게임 플레이 중 반복적으로 호출하면 프레임 드롭이나 GC(Garbage Collection) 스파이크 등 다양한 성능 문제를 일으킬 수 있다. 이를 해결하기 위해 "필요할 때마다 생성하자"가 아닌, "미리 만들어 두고 꺼내 쓰자"라는 접근 방식을 취하는 것이 바로 Object Pool이다. 🤔Instantiate()가 비싼 이유Unity에서 우리가 작성하는 코드는 C#이지만, Unity 엔진의 내부(코어)는 C++로 작성되어 있다. 즉, 우리가 다루는 C# 코드는 C++ 코어를 조작하는 리모컨 같은 역할을 한다. Instantiate()를 호출하면, Unity는 하나의 게임 오브젝트를 ..