유니티/ECS

[ECS] 2. 오브젝트 생성

나는야 개발자 2025. 4. 14. 06:39
반응형

이전시간

- 바로가기

 

[ECS] 유니티6 ECS 설치 및 패키지 에러 수정

▶ ECS 공식 문서- 바로가기 1. 패키지 설치- Pacakge Manager -> URL을 이용해 com.unity.entities 설치 진행- Pacakge Manager -> URL을 이용해 com.unity.entities.graphics 설치 진행 ▶ 유니티6 ECS 설치 에러 발생시 "[pa

lhy-info.tistory.com

 

 

1. 서브 씬 만들기

- Hierarchy  -> New Sub Scene -> Empty Scene -> SpawnerSubScene로 이름 저장하여 생성

 

▶ SubScene 사용 목적

 

ECS 변환 위해 SubScene 필수

- 일반 GameObject들은 SubScene 안에서 Entity로 자동 변환됨
- SubScene 없이 GameObject를 Entity로 변환하기 어려움

 

최적화를 위해 중요합니다
- 메모리 관리가 효율적임
- 대량의 Entity들을 더 빠르게 처리 가능
- 씬을 작은 단위로 나눠서 필요할 때만 로드 가능

 

3. Spawner Prefab 스크립트 추가 

using Unity.Entities;
using Unity.Mathematics;
using UnityEngine;

// MonoBehaviour를 상속받아 Unity 에디터에서 설정 가능한 컴포넌트
public class SpawnerAuthoring : MonoBehaviour
{
    public float2 SpawnPosition;    // 생성될 위치 (x,y 좌표)
    public float SpawnInterval = 1f; // 생성 간격 (기본값 1초)
    public GameObject Prefab;       // 생성할 프리팹 객체
}

// Entity로 변환을 담당하는 Baker 클래스
public class SpawnerBaker : Baker<SpawnerAuthoring>
{
    public override void Bake(SpawnerAuthoring authoring)
    {
        // MonoBehaviour의 데이터를 Entity Component로 변환
        AddComponent(new SpawnerComponent
        {
            SpawnPosition = authoring.SpawnPosition,  // 위치 복사
            SpawnTimer = 0f,                         // 타이머 초기화
            SpawnInterval = authoring.SpawnInterval, // 간격 복사
            Prefab = GetEntity(authoring.Prefab)     // GameObject를 Entity로 변환
        });
    }
}
using Unity.Entities;
using Unity.Mathematics;

public struct SpawnerComponent : IComponentData
{
    public float2 SpawnPosition;    // 생성 위치
    public float SpawnTimer;        // 생성 타이머
    public float SpawnInterval;     // 생성 간격
    public Entity Prefab;           // 생성할 프리팹
}

- IComponentData: ECS의 컴포넌트를 만들기 위한 인터페이스
- struct 사용: 클래스가 아닌 구조체로 만들어 메모리 최적화
- Unity.Mathematics: 성능 최적화된 수학 라이브러리 사용

 

- 2D Object > Sprites > Square 오브젝트 생성

 

- 이름을 SpawnObject로 설정

 

 

- 빈 오브젝트 추가 후 "Spawner"로 이름 지정

- Entity Backing Prefivew에서 Converted Scene: 'SpanwerSubScene' 클릭하여 Entity로 변환

 

- Spawner Authoring 컴퍼넌트 추가 후 -> 만들어둔 Prefab 할당

 

3. Spawner 스크립트 추가 

using Unity.Burst;
using Unity.Entities;
using Unity.Transforms;

[BurstCompile]
public partial struct SpawnerSystem : ISystem
{
    [BurstCompile]
    public void OnUpdate(ref SystemState state)
    {
        foreach (var (spawner, transform) in SystemAPI.Query<RefRW<SpawnerComponent>, RefRW<LocalTransform>>())
        {
            spawner.ValueRW.SpawnTimer += SystemAPI.Time.DeltaTime;
            
            if (spawner.ValueRW.SpawnTimer >= spawner.ValueRW.SpawnInterval)
            {
                spawner.ValueRW.SpawnTimer = 0;
                
                var instance = state.EntityManager.Instantiate(spawner.ValueRW.Prefab);
                var instanceTransform = SystemAPI.GetComponentRW<LocalTransform>(instance);
                instanceTransform.ValueRW.Position = new(spawner.ValueRW.SpawnPosition.x, spawner.ValueRW.SpawnPosition.y, 0);
            }
        }
    }
}

- [BurstCompile]: 성능 최적화를 위한 속성
- ISystem: ECS의 시스템 인터페이스
- OnUpdate: 매 프레임 실행되는 함수
- SystemAPI.Query: 특정 컴포넌트를 가진 Entity들을 찾음
- RefRW: 읽기/쓰기 가능한 참조

 

4. 테스트

- 실행 시 오브젝트가 1초마다 생성됨

- SpawnObject에 Spawn Position을 변경하면 다른 위치에도 생성 가능

단, ECS로 생성한 오브젝트는 Hierarchy에서 보이지 않음

 

5. ECS로 생성한 오브젝트 보는 법

- 하이라키를 볼 수 있음 

반응형

'유니티 > ECS' 카테고리의 다른 글

[ECS] 유니티6 ECS 설치 및 패키지 에러 수정  (0) 2025.04.13