public static void CreateDynamicBody(Entity entity, float mass, float3 startAngularVelocity, float3 startLinearVelocity, float gravityFactor, float linearDamping, float angularDamping, ref PhysicsCollider colliderComponent, bool lockTo2DPhysics = true)
{
PhysicsMass physicsMass = PhysicsMass.CreateDynamic(colliderComponent.MassProperties, mass);
if (lockTo2DPhysics)
{
physicsMass.InverseInertia[0] = 0;
physicsMass.InverseInertia[1] = 0;
physicsMass.InverseInertia[2] = physicsMass.InverseInertia[2];
}
EntityManagerRef.AddComponentData(entity, physicsMass);
float3 angularVelocityLocal = math.mul(math.inverse(colliderComponent.MassProperties.MassDistribution.Transform.rot), startAngularVelocity);
EntityManagerRef.AddComponentData(entity, new PhysicsVelocity()
{
Linear = startLinearVelocity,
Angular = angularVelocityLocal
});
EntityManagerRef.AddComponentData(entity, new PhysicsDamping()
{
Linear = linearDamping,
Angular = angularDamping
});
if (gravityFactor != 1)
{
EntityManagerRef.AddComponentData(entity, new PhysicsGravityFactor()
{
Value = gravityFactor
});
}
}
List<int4> colliderBoxes = BuildColliderAssistant.BuildOptimizesColliders(newIndexListFromRootInstance, newInstance.MeshBoxes, newInstance.Width, newInstance.Height);
NativeArray<Unity.Physics.CompoundCollider.ColliderBlobInstance> Blobs = new NativeArray<Unity.Physics.CompoundCollider.ColliderBlobInstance>(colliderBoxes.Count, Allocator.Temp);
float massCalculator = 0;
for (int i = 0; i < colliderBoxes.Count; ++i)
{
Vector3 outColliderPosition, outColliderSize;
PixelMeshData.CreatePositionForBox(colliderBoxes[i], out outColliderPosition, out outColliderSize);
outColliderSize.z = PixelMeshData.GetPixelZSize(PixelCollisionType.Compound);
outColliderPosition.z = 0;
BlobAssetReference<Unity.Physics.Collider> boxCollider = PhysicsAssistant.CreateBoxCollider(float3.zero, outColliderSize, 0, newInstance.PhysicsMaterialTemplate);
Blobs[i] = new Unity.Physics.CompoundCollider.ColliderBlobInstance()
{
Collider = boxCollider,
CompoundFromChild = new Unity.Mathematics.RigidTransform(
Quaternion.identity,
outColliderPosition)
};
massCalculator += colliderBoxes[i].w * colliderBoxes[i].z;
}
massCalculator /= PixelMeshData.MassVolume;
BlobAssetReference<Unity.Physics.Collider> MyCollider = Unity.Physics.CompoundCollider.Create(Blobs);
Blobs.Dispose();
PhysicsCollider physicsCollider;
PhysicsAssistant.CreateCollider(ref newInstance.EntityRef, ref MyCollider, out physicsCollider);
PhysicsVelocity existingVelocity = new PhysicsVelocity() { Angular = newInstance.PhysicsBodyTemplate.InitialAngularVelocity, Linear = newInstance.PhysicsBodyTemplate.InitialLinearVelocity };
if (rootInstance.IsStaticOrDynamic == BlockPhysicsType.Dynamic)
{
existingVelocity = Game.Instance.EntityWorld.EntityManager.GetComponentData<PhysicsVelocity>(rootInstance.EntityRef);
}
PhysicsAssistant.CreateDynamicBody(newInstance.EntityRef, massCalculator,
existingVelocity.Angular,
existingVelocity.Linear,
newInstance.PhysicsBodyTemplate.GravityFactor,
newInstance.PhysicsBodyTemplate.LinearDamping,
newInstance.PhysicsBodyTemplate.AngularDamping,
ref physicsCollider,
true);
the create body function, which is similar to the samples and the code i use to create the collider and dynamic body