[Unity, C#] ScriptableObject - 스크립터블 오브젝트
·
Unity,C#/Unity 정보
■ ScriptableObject 스크립터블 오브젝트(Scriptable Object)는 유니티에서 제공하는 Mono와 다른 경량 데이터 컨테이너 클래스이다.말 그대로 스크립팅 가능한 Object, 즉 코드로 정의된 데이터 저장용 객체를 의미한다.스크립터블 오브젝트는 씬에 존재하지 않으며, 데이터를 독립적으로 저장하고 재사용 할 수 있는 “에셋 파일(.asset)”로 저장된 직렬화 가능한 데이터 객체이다.스크립터블 오브젝트는 다음과 같은 상황에서 사용된다.게임 내 설정값 관리.무기, 아이템, 능력치 등 고정된 데이터를 관리할 때.동일한 데이터를 여러 오브젝트가 공유해야 할 때.씬이 변경되어도 데이터가 유지되어야 할 때. ▼ 몬스터에 관련된 데이터 클래스를 만들 때, Monobehaviour와 Script..
[Unity, C#] EditorWindow - 커스텀 에디터 윈도우
·
Unity,C#/Unity 정보
■ EditorWindow - 커스텀 윈도우 CustomEditor를 통해 기존 컴포넌트의 인스펙터를 꾸민다면, Custom Editor Window는 Unity 상단 메뉴에서 열 수 있는 독립적인 창을 만들 수 있다.툴 제작, 데이터 편집 등 전용 유틸리티를 만들 때 유용하다. ■ EditorWindow 생성using UnityEditor;using UnityEngine;public class CustomWindowTest : EditorWindow{ [MenuItem("Tools/Window Test", validate = false, priority = 100)] private static void Init() { var window = GetWindow(); ..
[Unity, C#] Editor - 커스텀 인스펙터
·
Unity,C#/Unity 정보
■ Editor - 커스텀 인스펙터 public class SizeController : MonoBehaviour{ // Do Something...}유니티에서 MonoBehaviour를 상속받는 스크립트는 게임 오브젝트에 부착할 수 있으며, 부착 시 모든 public 필드와 [SerializeField] 변수를 인스펙터에 자동으로 노출한다. 하지만 이러한 기본 기능 외에도, 버튼을 눌러 특정 함수를 실행하거나, 에디터 모드(Edit Mode)에서도 실시간으로 값을 반영하고 조작하고 싶을 때가 있다.이럴 때 CustomEditor를 사용하면 원하는 형태로 인스펙터를 자유롭게 커스터마이징 할 수 있다. 1. Custom Editor 생성public class SizeController : MonoBehav..
[C#, Unity, 절차적 생성] 절차적 던전 생성 - 5. 벽 생성
·
Unity,C#/절차적생성(PCG)
■ 벽 생성 이제 BSP 알고리즘으로 생성한 던전에 벽을 배치하여 마무리한다.벽은 Mesh를 사용해서 통으로 생성하는 것이 아니라, 벽 오브젝트를 1 유닛 단위로 배치하여 맵 전체를 감싸는 방식으로 구현한다. ■ 상세 구현벽 생성 로직 자체는 비교적 단순하다.각 방의 좌하단→우하단(수평), 좌하단 → 좌상단(수직) 방향으로 1씩 좌표를 증가시키며, 벽을 배치할 좌표를 저장한다.동일하게 반대 방향(좌상단→ 우상단(수평), 우하단 → 우상단(수직)) 방향도 기록한다.좌표 기록은 바닥 Mesh를 생성할 때 같이 진행한다.단, 복도와 겹치는 구간에는 벽을 생성하면 안 된다.따라서 벽을 배치할 좌표를 저장할 때, 이미 기록된 좌표가 넘어온다면 복도와 겹치는 공간이므로 저장된 좌표를 삭제한다.public class..
[C#, Unity, 절차적 생성] 절차적 던전 생성 - 4. 복도 생성
·
Unity,C#/절차적생성(PCG)
■ 복도 생성 BSP로 완성된 이진트리를 역방향으로 순회하며, 자식 노드에 생성된 방 사이를 복도로 연결한다. 복도 생성은 다음과 같은 흐름으로 진행된다. 복도 생성 절차트리의 가장 깊은 곳부터 시작하여, 자식 노드를 가진 부모 노드를 찾는다.두 자식 노드의 상대적인 위치(상,하,좌,우)를 파악한다.두 방이 연결 가능한 위치에 있는지 확인한다.연결이 가능하다면 복도를 생성한다. 연결이 불가능하다면, 다른 노드를 대상으로 연결 가능 여부를 다시 체크한다. ■ 상세 구현 내용1. 연결 대상 찾기using System.Collections.Generic;using System.Linq;public class CorridorGenerator{ private List _roomNodes; private..
[C#, Unity, 절차적 생성] 절차적 던전 생성 - 2. 방 생성
·
Unity,C#/절차적생성(PCG)
■ 방 생성 BSP 알고리즘을 통해 공갈이 분할되면, 자식이 없는 단말(리프) 노드에 실제 방을 생성해야 한다. 단말 노드들은 더 이상 분할되지 않는 영역이기 때문이다.private List GetAllLeafNode(){ var leafNodes = new List(); var queue = new Queue(new[] { _roomNodeList[0] }); while (queue.Count > 0) { var node = queue.Dequeue(); if (node.ChildNode.Count 너비 우선 탐색(BFS) 방식으로 트리를 순회하며, 자식 노드가 없는 경우(단말 노드)만 리스트에 추가한다. ■ 방 생성 구현public class RoomGenerator{ private..
[C#, Unity, 절차적 생성] 절차적 지형 생성 - 1.PerlinNoise
·
Unity,C#/절차적생성(PCG)
■ PerlinNoise PerlinNoise는 1983년 Ken Perlin이 개발한 그래디언트 기반의 노이즈(Gradient Noise)함수로, 지형의 절차적 생성, 텍스처 생성, 구름이나 연기 같은 자연 현상 표현 등 다양한 절차적 콘텐츠 생성에 활용된다. 1. Noise함수 Noise함수는 입력값에 따라 “의사 난수(Pseudo-random)”값을 반환하는 함수다. 일반적인 난수와 달리, 입력값이 비슷할수록 결과값도 유사해지는 부드러운 변화를 가진다.// 호출할 때마다 완전히 다른 값.Random.Range(0f, 1f);// 항상 같은 입력에 같은 결과.Mathf.PerlinNoise(x, y);// 입력이 조금 달라지면, 출력도 조금만 변화 -> 부드러운 노이즈Mathf.PerlinNoise..
[C#, Unity, 최단경로(PathFinding)] TileMap A* 알고리즘
·
Unity,C#/알고리즘
■ A* 알고리즘“BFS에서 발전한 알고리즘이 다익스트라라면, 다익스트라에서 한 단계 더 발전한 것이 바로 A 알고리즘이다.” 다익스트라와 동작 방식은 비슷하지만, 목표 노드(n)까지의 거리 측정값인 휴리스틱(Heuristic)을 추가로 사용한다. 각 타일에는 다음과 같은 정보가 저장된다. 이름설명 g(n) 현재 노드까지의 누적 비용. 가중치가 없다면 상하좌우 이동은 10(또는 1), 대각선 이동은 14(또는 1.4)로 계산한다. h(n) 목표 지점까지의 예상 비용(휴리스틱). 맨해튼 거리 방식이나 정수 근사 휴리스틱(10/14)을 사용해 계산한다. f(n) g(n) + h(n). A* 알고리즘에서 우선순위를 결정할 때 사용하는 총 비용. 다익스트라에서는 우선순위 큐의 기준이 g(n) 값(누적..
[C#, Unity, 최단경로(PathFinding)] TileMap 다익스트라(Dijkstra) 알고리즘
·
Unity,C#/알고리즘
■ 다익스트라(Dijkstra) 알고리즘다익스트라 알고리즘은 가중치 있는 그래프에서 시작 노드부터 다른 노드들까지의 최단 경로를 찾는다.시작 노드로부터 모든 노드에 대한 최단 경로를 계산한다.가중치는 음수일 수 없다.다익스트라는 그라디(Greedy) 알고리즘이며, 동적 배열 갱신 과정에서 다이내믹 프로그래밍의 성격도 일부 포함된다그라디 알고리즘과 다이나믹 프로그래밍에 대해 정리한 부분은 아래에서 참조할 수 있다. ▼ 그라디 알고리즘2025.04.10 - [Unity,C#/알고리즘] - [C#, Algorithm] 그라디(탐욕, 욕심쟁이) 알고리즘 [C#, Algorithm] 그라디(탐욕, 욕심쟁이) 알고리즘■ 그라디(Greedy) 알고리즘그라디(탐욕, 욕심쟁이) 알고리즘은 매 단계에서 “가장 좋아 보이는..