Skip to content

Instantly share code, notes, and snippets.

@mattdymott
Last active November 8, 2022 20:10
Show Gist options
  • Save mattdymott/4aaf1aa645b6aab2ebfa577430fea500 to your computer and use it in GitHub Desktop.
Save mattdymott/4aaf1aa645b6aab2ebfa577430fea500 to your computer and use it in GitHub Desktop.
Creates a Unity.Physics Mesh Collider from a Unity.CompositeCollider2D in Entities exp1.0 without using SubScenes
public class TilemapData : IComponentData
{
public Grid Grid;
public Tilemap CollisionMap;
}
public struct TilemapData_TAG : IComponentData {}
// Runtime conversion. DO NOT PUT IN SUB-SCENE.
public class TilemapDataAuthoring : MonoBehaviour
{
public Grid Grid;
public Tilemap CollisionMap;
public PhysicsCategoryTags BelongsTo;
public PhysicsCategoryTags CollidesWith;
private void Awake()
{
var entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
var entity = entityManager.CreateEntity();
entityManager.SetName(entity, "TILEMAP_DATA");
entityManager.AddComponent<TilemapData_TAG>(entity);
entityManager.AddComponentData(entity, new TilemapData
{
Grid = Grid,
CollisionMap = CollisionMap
});
entityManager.AddComponentData(entity, new Translation { Value = float3.zero });
entityManager.AddComponentData(entity, new Rotation { Value = quaternion.identity });
entityManager.AddComponentData(entity, new Scale { Value = 1f });
entityManager.AddComponent<LocalToWorld>(entity);
var compositeCollider2D = CollisionMap.GetComponent<CompositeCollider2D>();
var collisionMesh = compositeCollider2D.CreateMesh(false, false);
var vertices = new NativeArray<Vector3>(collisionMesh.vertices, Allocator.Temp);
var triangles = new NativeArray<int3>(collisionMesh.triangles.Length / 3, Allocator.Temp);
var ii = 0;
for(var i=0; i<collisionMesh.triangles.Length; i += 3)
{
triangles[ii++] = new int3(
collisionMesh.triangles[i],
collisionMesh.triangles[i+1],
collisionMesh.triangles[i+2]
);
}
var meshBlob = Unity.Physics.MeshCollider.Create(
vertices.Reinterpret<float3>(),
triangles,
new CollisionFilter
{
BelongsTo = BelongsTo.Value,
CollidesWith = CollidesWith.Value
}
);
entityManager.AddComponentData(entity, new PhysicsCollider
{
Value = meshBlob
});
entityManager.AddSharedComponent(entity, new PhysicsWorldIndex());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment