C# 如何将实体传递到作业以添加组件?
(编辑:请参见下面的“我的编辑”) 为了减少使用ECS时的样板文件,我将此代码转换为: 之前:C# 如何将实体传递到作业以添加组件?,c#,unity3d,jobs,entity-component-system,C#,Unity3d,Jobs,Entity Component System,(编辑:请参见下面的“我的编辑”) 为了减少使用ECS时的样板文件,我将此代码转换为: 之前: public class MySystem : JobComponentSystem { public struct Group { // A long list of different ComponentDataArray // Eg. public ComponentDataArray<Position> Positions;
public class MySystem : JobComponentSystem
{
public struct Group
{
// A long list of different ComponentDataArray
// Eg.
public ComponentDataArray<Position> Positions;
public int Length;
}
[Inject] private Group _Group;
protected override JobHandle OnUpdate(JobHandle inputDeps)
{
MyJob job = new Job()
{
DeltaTime = Time.deltaTime,
// That same long list of ComponentDataArray
};
return job.Schedule(_Group.Positions.Length, 64, inputDeps);
}
[BurstCompile]
struct MyJob : IJobParallelFor
{
public float DeltaTime;
// That same long list of ComponentDataArray AGAIN.
public void Execute(int i)
{
// MyJob code
}
}
}
这不是我们应该怎么做的吗?在这里完成:
EDIT2:我在他的代码中发现的唯一区别是
[ReadOnly]public EntityArray Entities;
public EntityCommandBuffer CommandBuffer;
并使用EndFrameBarrier
。我升级了代码,但收到:
InvalidOperationException:MyJob.CommandBuffer未在IJobParallelFor作业中声明为[ReadOnly]。容器不支持并行写入。请使用更合适的容器类型
因此,我首先将其设置为“只读”。我找到了一种方法,但我不确定它是否安全,或者是否是这样做的方法,但是:
// In your job
[NativeDisableParallelForRestriction] public EntityCommandBuffer CommandBuffer;
可在此处找到:
无论您是使用
EndFrameBarrier
还是自己继承它。(我真的不知道有什么区别)我自己还没有尝试过ECS,但我发现TwoStickShooter示例项目()中解决了一个类似的问题,也许它可以帮助您。
public class MySystem : JobComponentSystem
{
public struct Group
{
// A long list of different ComponentDataArray
// Eg.
public ComponentDataArray<Position> Positions;
public SubtractiveComponent<Initialized> Initialized;
public int Length;
public EntityArray Entities;
}
[Inject] private Group _Group;
public class EntityBarrier : BarrierSystem { }
[Inject] private EntityBarrier _EntityBarrier;
protected override JobHandle OnUpdate(JobHandle inputDeps)
{
MyJob job = new Job()
{
DeltaTime = Time.deltaTime,
Entities = _Group.Entities,
CommandBuffer = _EntityBarrier.CreateCommandBuffer(),
// That same long list of ComponentDataArray
};
return job.Schedule(_Group.Positions.Length, 64, inputDeps);
}
[BurstCompile]
struct MyJob : IJobParallelFor
{
public float DeltaTime;
public EntityArray Entities;
// That same long list of ComponentDataArray AGAIN.
public void Execute(int i)
{
CommandBuffer.AddComponent(Entities[i], new Initialized());
// MyJob code
}
}
}
[ReadOnly]public EntityArray Entities;
public EntityCommandBuffer CommandBuffer;
// In your job
[NativeDisableParallelForRestriction] public EntityCommandBuffer CommandBuffer;