ECS 4

게임엔진/ECS(Unity) ECS Hybrid - Companion GameObject

ECS 관련 기초 글 :ECS (Entity Component System)DOTS 1.0 - 기본 (Component, System, Aspect, Job)Entities - 컴포넌트 구조왜 Hybrid가 필요한가ECS는 성능이 좋다. 데이터가 청크에 연속으로 저장되어 캐시 친화적이고, Burst 컴파일 + Job 시스템으로 병렬 처리도 된다. 그런데 문제가 있다.유니티의 모든 기능이 ECS로 제공되지는 않는다.Animator, ParticleSystem, Light, VFX Graph, AudioSource 같은 것들은 모두 MonoBehaviour 기반이다. 이것들은 managed 객체이며 ECS 청크에 struct처럼 넣을 수가 없다.예를 들어, ECS로 적 유닛 1000마리를 시뮬레이션한다고 치..

게임엔진/ECS(Unity) ECS에서 Behavior Tree 구현하기 (ft. xNode)

ECS Behavior Tree ECS환경에서 Behavior Tree를 구현하려면 마땅한 패키지(에셋)이 없다.나는 xNode를 이용하여 손쉽게 구현했다. (https://github.com/Siccity/xNode, 무료임) xNode 만들기public abstract class BTNode : Node { [Input] public BTNode parent; [Output] public BTNode children; public float randomWeight = 1f; public virtual NodeType Type => NodeType.Action; public virtual int GetNodeData() => 0; } 우선 기본이 ..

게임엔진/ECS(Unity) BlobAsset의 개념

상황 ECS로 심리스 오픈월드를 구현하고싶다. 자연스럽게 지역과 지역을 넘나드려면 로딩 속도가 생명이다. 게임 데이터에는 여러가지가 있겠지만 NavMesh만 우선 생각해보자. 게임 속에는 공중유닛, 수영할 수 있는 유닛, 지상유닛 등으로 나뉘어져 각각 NavMesh가 필요하다. NavMesh는 굉장히 간략하게 보자면 폴리곤의 집합과 인접 데이터의 모음이라 할 수 있으며 이 데이터들의 길이는 제각각이다. 그럼 이걸 어떻게 구현할 것인가? DynamicBuffer?public struct NavPolygonElement : IBufferElementData{ public int StartVertexIndex; public int VertexCount; public int NeighborS..

게임엔진/ECS(Unity) ECB + sortKey

ECB 유니티 ECS에는 EntityCommandBuffer(ECB)라는 개념이 있다. 엔티티의 생성/파괴, 컴포넌트 추가/제거 등은 구조변경(Structural Change)및 Sync Point를 만들어서 성능에 악 영향을 준다. 특히나 병렬 Job에서는 구조 변경 자체가 불가하다. 그래서 여러 Job등에서 구조변경을 유발하는 명령들을 ECB에 모아두고 한번에 Playback한다. 이렇게 하면 병렬 Job에서도 구조 변경이 안전하게 가능해지고, Sync Point를 한 번만 만들어내서 성능에도 좋다. ECB는 두 가지 방법으로 사용할 수 있는데, 다음과 같다.그때그때 직접 만들기이미 있는 걸 쓰기 아래와 같이 체력이 0이하인 Entity를 파괴하는 Job이 있다. 이 Job은 병렬로 실행할거라 ..