C# 如何将实体传递到作业以添加组件?

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;

编辑:请参见下面的“我的编辑”)

为了减少使用ECS时的样板文件,我将此代码转换为:

之前:

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;