이전에 구현에 대해 대충 감만 잡았고 이번에는 대충 어느 정도 구현해보고 앞으로 어떻게 프로젝트해보면서 공부해봐야 할지 정리를 해봤습니다.
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 차근차근 공부해보며 추가할 예정입니다.
'Study Log' 카테고리의 다른 글
Unity ECS Study Log - 6 (0) | 2023.01.15 |
---|---|
Unity ECS Study Log - 5 (0) | 2023.01.14 |
Unity ECS Study Log - 4 (0) | 2023.01.09 |
Unity ECS Study Log - 3 (1) | 2023.01.07 |
Unity ECS Study Log - 1 (0) | 2023.01.01 |