Study Log

Unity ECS Study Log - 2

종잇장 2023. 1. 1. 21:49

이전에 구현에 대해 대충 감만 잡았고 이번에는 대충 어느 정도 구현해보고 앞으로 어떻게 프로젝트해보면서 공부해봐야 할지 정리를 해봤습니다.

 


 

1. 직접 구현해보기

 

public struct TransformTargetData : IComponentData
{
    public float moveSpeed;
}

public class TransformTargetAuthoring : MonoBehaviour
{
    public float moveSpeed = 1.0f;
}

public class TransformTargetBaker : Baker<TransformTargetAuthoring>
{
    public override void Bake(TransformTargetAuthoring authoring)
    {
        AddComponent(new TransformTargetData()
        {
            moveSpeed = authoring.moveSpeed,
        });
    }
}

저번에 Spawner코드를 참고해서 오브젝트를 이동시키는 코드를 짜봤습니다.

 

 

public partial struct TransformTargetSystem : ISystem
{
    public void OnCreate(ref SystemState state) { }

    public void OnDestroy(ref SystemState state) { }

    public void OnUpdate(ref SystemState state)
    {
        foreach (var (transform, transformTarget) in SystemAPI.Query<RefRW<LocalTransform>, RefRO<TransformTargetData>>())
        {
            Vector3 dir = Vector3.zero;
            if (Input.GetKey(KeyCode.UpArrow)) dir += Vector3.forward;
            if (Input.GetKey(KeyCode.DownArrow)) dir += Vector3.back;
            if (Input.GetKey(KeyCode.LeftArrow)) dir += Vector3.left;
            if (Input.GetKey(KeyCode.RightArrow)) dir += Vector3.right;
            if (dir == Vector3.zero) continue;

            dir = dir.normalized;
            var transformValue = transform.ValueRW;
            transformValue.Rotation = Quaternion.Euler(0f, 90f - Mathf.Atan2(dir.z, dir.x) * Mathf.Rad2Deg, 0f);
            transformValue = transformValue.Translate(dir * transformTarget.ValueRO.moveSpeed * SystemAPI.Time.DeltaTime);
            transform.ValueRW = transformValue;
        }
    }
}

Input 클래스는 접근이 가능하길래 사용해서 간단하게 이동하는 코드를 짜봤습니다.

RW, RO가 ReadWrite, ReadOnly의 약자로 보이는데, 제한하는 것 외에도 구분한 특별한 이유가 있지 않을까 싶네요.

시간이 된다면 읽기만 하는 코드에서 rw, ro 각각 사용을 비교해보도록 하겠습니다.

 

 

 

 


 

 

다음에 할 일.

이 샘플 프로젝트처럼 Input을 받아서 움직이고 투사체를 발사하는 간단한 슈팅게임을 만들어볼까 합니다.

이후에는 Physics 관련 코드도 추가해 보고, JobSystem, BurstCompiler 차근차근 공부해보며 추가할 예정입니다.