using Unity.Physics.Systems;
using UnityEngine.Rendering;
public class PointCacheToGameObjects : MonoBehaviour
private EntityManager entityManager;
private RenderMeshArray rma;
private RenderMeshDescription rmd;
private Entity prototype;
private EntityQuery oldEntitiesQuery;
world = World.DefaultGameObjectInjectionWorld;
entityManager = world.EntityManager;
rmd = new RenderMeshDescription(
shadowCastingMode: ShadowCastingMode.Off,
rma = new RenderMeshArray(new Material[] { mat }, new Mesh[] { mesh });
// Call raycasting test on mouse click
if (Input.GetMouseButtonDown(0))
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
PerformRaycast(ray.origin, ray.direction);
private void CreateSpheresFromTexture(PointCache pc)
oldEntitiesQuery = entityManager.CreateEntityQuery(typeof(SphereColliderData), typeof(SelectableTag));
if (oldEntitiesQuery.CalculateEntityCount() > 0)
entityManager.DestroyEntity(oldEntitiesQuery);
prototype = entityManager.CreateEntity();
RenderMeshUtility.AddComponents(
MaterialMeshInfo.FromRenderMeshArrayIndices(0, 0));
entityManager.AddComponentData(prototype, new LocalToWorld());
entityManager.AddComponent<SphereColliderData>(prototype);
entityManager.AddComponent<SelectableTag>(prototype);
// Add PhysicsCollider to the entity
var sphereCollider = Unity.Physics.SphereCollider.Create(new SphereGeometry
Radius = 1.0f // Adjust radius
entityManager.AddComponentData(prototype, new PhysicsCollider
var ecb = new EntityCommandBuffer(Allocator.TempJob);
var spawnJob = new SpawnJob
Ecb = ecb.AsParallelWriter(),
EntityCount = pc.PointCount,
Positions = pc.surfaces[0].GetRawTextureData<half4>()
var spawnHandle = spawnJob.Schedule(pc.PointCount, 128);
ecb.Playback(entityManager);
entityManager.DestroyEntity(prototype);
public void ReceivePointCache(PointCache pc)
CreateSpheresFromTexture(pc);
// Perform raycast in the physics world
void PerformRaycast(float3 rayOrigin, float3 rayDirection)
var physicsWorldSystem = World.DefaultGameObjectInjectionWorld.GetExistingSystem<BuildPhysicsWorld>();
var collisionWorld = physicsWorldSystem.PhysicsWorld.CollisionWorld;
var raycastInput = new RaycastInput
End = rayOrigin + rayDirection * 1000f, // Long ray length
Filter = CollisionFilter.Default
Debug.DrawRay(rayOrigin, rayDirection * 1000f, Color.red, 5f);
if (collisionWorld.CastRay(raycastInput, out Unity.Physics.RaycastHit hit))
Entity hitEntity = physicsWorldSystem.PhysicsWorld.Bodies[hit.RigidBodyIndex].Entity;
if (entityManager.HasComponent<SphereColliderData>(hitEntity))
SphereColliderData sphereData = entityManager.GetComponentData<SphereColliderData>(hitEntity);
Debug.Log($"Hit entity at position: {sphereData.Position}, radius: {sphereData.Radius}");
Debug.Log("Raycast did not hit any entity.");
public struct SphereColliderData : IComponentData
public struct SelectableTag : IComponentData { }
public struct SpawnJob : IJobParallelFor
public EntityCommandBuffer.ParallelWriter Ecb;
[ReadOnly] public NativeArray<half4> Positions;
public void Execute(int index)
var entity = Ecb.Instantiate(index, Prototype);
var p = Positions[index];
var position = new float3(p.x, p.y, p.z);
Ecb.SetComponent(index, entity, new LocalToWorld { Value = float4x4.Translate(position) });
Ecb.SetComponent(index, entity, new SphereColliderData { Position = position, Radius = 1 });