#How to properly create Compound Collider in runtime?

1 messages · Page 1 of 1 (latest)

solid maple
#

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