土鍋で雑多煮

UnityでXR・ゲーム開発をしています。学んだことや備忘録、趣味の記録などを書いていきます。

MENU

UnityECSでのPhysicsで一番近いオブジェクト取得したい

どうも、土鍋です。

UnityECSでの物理シミュレーションではPhysicsというライブラリが使用されます。

youtu.be

以下をインポート - com.unity.physics

このPhysicsを使用してプレイヤーに一番近いオブジェクト取得を従来のPhysicsのように行いたいと思ったのですが、ググると

_buildPhysicsWorld = World.GetOrCreateSystem<BuildPhysicsWorld>();
_stepPhysicsWorld = World.GetOrCreateSystem<StepPhysicsWorld>();

などのような記述部分があったのですが、最新版(Unity6)ではBuildPhysicsWorldはこのように取得できないですし、StepPhysicsWorldはそもそも存在していませんでした。

そこで自力でいろいろ調べているのですが、以下の感じでできそうなんですが、まだうまくいっていません。

void Execute(ref CitizenBase citizen, ref LocalTransform transform, ref PhysicsWorld physicsWorld)
{
     float3 currentPosition = transform.Position;
            
     // 探索範囲の設定
    float searchRadius = 10f;
    var distanceHits = new NativeList<DistanceHit>();

    var collisionWorld = physicsWorld.CollisionWorld;
            
    // Sphereキャストで最も近いオブジェクトを探す
    collisionWorld.OverlapSphere(currentPosition, searchRadius, ref distanceHits, 
 CollisionFilter.Default);

   var closestHit = GetClosestHit(distanceHits, currentPosition);
            
     Debug.Log(closestHit.Entity);
}

static DistanceHit GetClosestHit(NativeList<DistanceHit> hits, float3 userPosition)
        {
            DistanceHit closestHit = default;
            float closestDistance = float.MaxValue;

            foreach (var hit in hits)
            {
                float distance = math.distance(userPosition, hit.Position); // 距離計算
                if (distance < closestDistance)
                {
                    closestDistance = distance;
                    closestHit = hit;
                }
            }

            return closestHit;
        }

まだ調査中。