ECS: ComponentSystem Best Way um zwischen Entities zu interagieren?
Ich möchte viele Objekte auf einander reagieren lassen, wobei die Entfernung keine Rolle spielt. Das heißt, ich möchte, dass jedes Objekt auf jedes andere Objekt reagiert und das möglichst effizient. Dabei bin ich über das ECS (Entity Component System) gestolpert.
Meine Idee war es nun sämtliche Objekte als Entities umzuwandeln (automatisch) und diese in einem ComponentSystem zu iterieren.
// in ComponentSystem.onUpdate()
// pseudo code
Entities.ForEach((ref ModelComponentData a, ref Translation at) => {
Entities.ForEach((ref ModelComponentData b, ref Translation bt) => {
if(a.id != b.id) {
// do something with bt based on ModelComponentData in a
// ...
}
});
});
Leider ist die doppelte Iteration nicht so schön effizient und ich werde wohl weitere Einschränkungen machen müssen. Ich hatte auch noch die Idee ein Job zu starten in der inneren ForEach, aber meine Frage ist, ob es nicht noch einen besseren Weg gibt?
Answer by andrew-lukasik · May 29, 2020 at 08:08 PM
public class ThisSystem : SystemBase
var query = GetEntityQuery(
ComponentType.ReadOnly<Translation>() ,
ComponentType.ReadOnly<ModelComponentData>()
);
var translations = query.ToComponentDataArray<Translation>( Allocator.TempJob );
var models = query.ToComponentDataArray<ModelComponentData>( Allocator.TempJob );
int len = translations.Length;
Job.WithName("my_iteration_job")
.WithDeallocateOnJobCompletion( translations )
.WithDeallocateOnJobCompletion( models )
.WithCode( ()=>
{
for( int ia=0 ; ia<len ; ia++ )
for( int ib=len-1 ; ib!=-1 ; ib-- )
{
if( ia!=ib )
{
var ma = models[ia];
var bt = translations[ib];
/* (∩^o^)⊃━☆ */
}
}
}
).Schedule();
Your answer
Follow this Question
Related Questions
how to make transparent iOS grabber in unity 0 Answers
Can i change defualt target framework in .csproj to 4.7.2? 0 Answers
how to connect WEBRTC in unity ? 2 Answers
C# Script for 3rd Person Camera? 1 Answer
Plane character selector unity problem 0 Answers