public partial struct RotationSystem : ISystem
{
[BurstCompile]
public void OnCreate(ref SystemState state)
{
//update需要等待ExecuteAspects组件初始化完成,之后执行update
state.RequireForUpdate<ExecuteAspects>();
}
[BurstCompile]
public void OnUpdate(ref SystemState state)
{
float deltaTime = SystemAPI.Time.DeltaTime;
double elapsedTime = SystemAPI.Time.ElapsedTime;
//使用IComponentData接口进行实体的旋转
foreach (var (transform, speed) in
SystemAPI.Query<RefRW<LocalTransform>, RefRO<RotationSpeed>>())
{
transform.ValueRW = transform.ValueRO.RotateY(speed.ValueRO.RadiansPerSecond * deltaTime);
}
//使用这个IAspect接口进行实体的移动
foreach (var movement in
SystemAPI.Query<VerticalMovementAspect>())
{
movement.Move(elapsedTime);
}
}
}
//此方面的实例包装单个实体的LocalTransform和RotationSpeed组件。
//IAspect和IComponentData一样都是继承自 IQueryTypeParameter,说明在系统中可以使用SystemAPI.Query查询到
//查询的条件就是包含这两个组件的RefRW<LocalTransform> ,RefRO<RotationSpeed>的实体
//我的理解是IAspect这个接口像是实体所有组件的一个管理
readonly partial struct VerticalMovementAspect : IAspect
{
readonly RefRW<LocalTransform> m_Transform;
readonly RefRO<RotationSpeed> m_Speed;
public void Move(double elapsedTime)
{
m_Transform.ValueRW.Position.y = (float)math.sin(elapsedTime * m_Speed.ValueRO.RadiansPerSecond);
}
}
该示例重点是解释Aspects接口的使用,定义的VerticalMovementAspect结构体,只能是只读的结构体,成员也是只读的
SystemAPI.Query<VerticalMovementAspect>()和
SystemAPI.Query<RefRW<LocalTransform>, RefRO<RotationSpeed>>()的作用是一模一样的
使用VerticalMovementAspect结构可以简化代码,和组织组件之间的数据