DOTY
ECS (Entity Component System) - Setup 본문
이번에 진행할 프로젝트에 오브젝트를 엄청 많이 소환하기 위해서 ECS를 공부하고자 한다.
유니티에서는 DOTS 기술 중 하나로 소개가 되어있고 유튜브에서는 Job System도 함께 소개를 했다.
https://www.youtube.com/watch?v=WLfhUKp2gag
Unity 공식 유튜브 채널에 소개되어있어 이를 보고 혼자서 깔짝깔짝 해볼 예정.
ECS (Entity Component System) ?
Entity
- 고유 식별자 ID
- 데이터를 보유하지 않고 컴포넌트를 결합하여 정의
Component
- 순수 데이터
- MonoBehavior 기반 컴포넌트와는 다른 방식을 사용.
- MonoBehavior은 데이터와 동작을 함께 사용하는데 목적이 있다면 ECS의 Component는 순수한 데이터만을 위한다
using Unity.Entities;
public struct Health : IComponentData
{
public int Value;
}
System
- .Component를 처리하는 로직
ECS는 병렬로 일을 처리하기 때문에 CPU의 활용을 극대화할 수 있다.
하지만 ECS는 엄청 많은 오브젝트들을 처리하는 것이 목적이기 때문에 오브젝트가 많지 않을경우 굳이 사용할 필요는 없다.
Package Manger
사용 전에 Package Manager에서 설치를 진행해주자.
https://docs.unity3d.com/Packages/com.unity.entities@1.0/manual/getting-started-installation.html
Entities project setup | Entities | 1.0.16
Entities project setup When you set up an Entities project, there are additional steps you must follow. Recommended packages Check the overview of the available DOTS packages. You should add the following recommended set of core packages to your project: I
docs.unity3d.com

com.unity.entities
com.unity.entities.graphics
설치하다가 계속 빨간 느낌표가 뜨길래 계속 삽질하다가 재부팅하니 해결된건 비밀..
찾아보니 ECS는 URP와 HDRP만 지원한다고 한다. 없다면 PackageManager에서 받으면 되니까~

Setup 설명을 보면
Edit > Project Settings > Editor menu, and enable the Enter Play Mode Options setting, but leave the Reload Domain and Reload Scene boxes disabled.
라고 했으니 위 처럼 Do not Reload Domain과 Scene로 설정해주자.
※ Domain과 Scene을 껐기 때문에 static 값들의 수정이 불가능하게 되니까 나중에 무슨 일 생기면 먼저 확인해보기로....
세팅 끝!!

Sub Scene을 하나 만들고 가지고 놀아보자!
+ Reload Domain or Scene?
https://docs.unity3d.com/kr/2020.1/Manual/ConfigurableEnterPlayModeDetails.html
도메인 및 씬 재로드 비활성화에 대한 세부 정보 - Unity 매뉴얼
높은 수준의 관점에서 플레이 모드 시작은 다음의 주요 단계로 구성됩니다.
docs.unity3d.com
더욱 자세히 설명되어 있기 때문에 참고하면 좋을 것 같다!
플레이 모드에서의 설정이다.
예를 바로 들어보면 이해가 빠를 듯 하다.
1. Reload Domain
public class Movement : MonoBehaviour
{
static float Data = 1;
float Data2 = 1;
// Update is called once per frame
void Update()
{
Data += Time.deltaTime;
Data2 += Time.deltaTime;
Debug.Log("static Data : " + Data + " Data : " + Data2);
}
}
Data와 Data2 변수에 deltaTime을 계속 더해주는 Movement Class가 있다.
이 때 정적인 float 형인 Data와 그냥 float 형인 Data2가 있다.
이를 실행해보면 어떻게 될까?

차이가 없다.....?
하지만 다시 플레이 버튼을 눌러 실행해본다면?

차이를 확인할 수 있다.
이는 Reload Domain과 관련이 있다. (Reload Domain은 Play 또는 Stop 버튼을 눌렀을 때 실행된다고 한다.)
Reload Domain의 역할을 씬이 실행될 때 모든 데이터들을 처음으로 되돌리는 역할을 한다.
다시말해서, 스크립팅 도메인을 다시 로드하여 초기화시킨다.
이때, static의 변수들도 Reload Domain을 통해서 초기화되는데 이를 건너뛰는 작업이기 때문에 Static 변수들의 초기화 또한 건너뛰게 되며 이전의 값이 이어지게 된다.
2. Reload Scene
LoadScene을 활용해서 씬을 불러낼 때 초기화를 시켜줄지 아닐지 결정한다.
비활성화를 한다면 오직 코드만 실행되며 Awake(), Start()는 무시된다.
(예시는 사용할 때 추가하겠슴)
'Unity' 카테고리의 다른 글
ML Agents 준비 (3) | 2024.11.14 |
---|---|
Behavior Tree (0) | 2024.11.14 |
HpProgressBar 체력에 따라 색 바꾸기 (0) | 2024.10.14 |
[Unity] err1. object reference not set to an instance of an object (0) | 2022.09.24 |
[Unity] 6. Scene 변경 ( + DontDestroyOnLoad ) (0) | 2022.09.07 |