I'm trying to create Compound Collider of Convex Colliders for a dynamic entity.
Creating compound collider with native array of convex colliders:
var colliders = new NativeArray<CompoundCollider.ColliderBlobInstance>(4, Allocator.Temp, NativeArrayOptions.UninitializedMemory);
colliders[0] = new CompoundCollider.ColliderBlobInstance {Collider = collider0};
colliders[1] = new CompoundCollider.ColliderBlobInstance {Collider = collider1};
colliders[2] = new CompoundCollider.ColliderBlobInstance {Collider = collider2};
colliders[3] = new CompoundCollider.ColliderBlobInstance {Collider = collider3};
var compoundCollider = CompoundCollider.Create(colliders);
colliders.Dispose();
// Is there a safe way to convert Collider to CompoundCollider? I found it inside "DeferredResolutionJobHandleJob : IJobEntity"
CompoundCollider compCollider;
unsafe
{
compCollider = *(CompoundCollider*)compoundCollider.GetUnsafePtr();
}
return new Preset(view, new PhysicsCollider{Value = compoundCollider}, compCollider);
System for set new collider:
var ecbSingleton = SystemAPI.GetSingleton<BeginSimulationEntityCommandBufferSystem.Singleton>();
var ecb = ecbSingleton.CreateCommandBuffer(state.WorldUnmanaged);
var entities = query.ToEntityArray(Allocator.Temp);
var preset = Generator.GetPreset();
foreach (var ent in entities)
{
ecb.SetComponent(ent, preset.Collider); // Set PhysicsCollider
ecb.RemoveComponent<UpdateMeshPreset>(ent);
// Is it really needed? all colliders on the same entity
var buffer = ecb.AddBuffer<PhysicsColliderKeyEntityPair>(ent);
for (var i = 0; i < preset.CompoundCollider.NumChildren; ++i)
buffer.Add(new PhysicsColliderKeyEntityPair {Entity = ent, Key = preset.CompoundCollider.ConvertChildIndexToColliderKey(i)});
}
entities.Dispose();
It works properly only with one Convex Collider instead of Compound Collider.
With Compound Collider the physics of body are weird or non-collidable