Edit: This thread describes a different problem than it’s sibling, (Case 1287877) Raycasts not hitting anything - UnityEngine.Physics.Raycast does work! but if you run into one of the two, you should also read the other, as they both describe easy-to-run into scenarios with Dots, Physics and procedural generated colliders and their race conditions.
I create a test collider and then try to raycast it. The first time the raycast always misses. Anyone has any ideas why?
EntityManager em = World.DefaultGameObjectInjectionWorld.EntityManager;
var buildPhysicsWorld = World.DefaultGameObjectInjectionWorld.GetOrCreateSystem<BuildPhysicsWorld>();
ref PhysicsWorld physicsWorld = ref buildPhysicsWorld.PhysicsWorld;
ref CollisionWorld collisionWorld = ref physicsWorld.CollisionWorld;
// Sanity check to ensure it hits
var quad = em.CreateEntity();
var vertices = new NativeList<float3>(Allocator.Temp);
vertices.Add(new float3(-100, 0, -100));
vertices.Add(new float3(100, 0, -100));
vertices.Add(new float3(-100, 0, 100));
vertices.Add(new float3(100, 0, 100));
var triangles = new NativeList<int3>(Allocator.Temp);
triangles.Add(new int3(0, 2, 1));
triangles.Add(new int3(2, 3, 1));
em.AddComponent<PhysicsCollider>(quad);
var physicsCollider = new PhysicsCollider {
Value = MeshCollider.Create(vertices, triangles)
};
vertices.Dispose();
triangles.Dispose();
em.AddComponent<Unity.Transforms.LocalToWorld>(quad);
em.SetComponentData(quad, physicsCollider);
em.SetComponentData(quad, new LocalToWorld {Value = float4x4.identity});
em.SetName(quad, "quad");
var quadTestRaycastInput = new RaycastInput {
Start = new float3(0, 10, 0),
End = new float3(0, -10, 0),
Filter = CollisionFilter.Default
};
if (collisionWorld.CastRay(quadTestRaycastInput,
out Unity.Physics.RaycastHit quadTestHit))
{
this.LogDebug("Hit quad (forward):" + quadTestHit.Fraction);
Debug.DrawLine((Vector3) quadTestRaycastInput.Start, (Vector3) quadTestHit.Position, Color.green, 5);
}
else
{
this.LogDebug("missed quad");
Debug.DrawLine((Vector3) quadTestRaycastInput.Start, (Vector3) quadTestRaycastInput.End, Color.red, 5);
}
It seems like the first time the collider does not exist yet.