이전시간
- 바로가기
[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 |
---|