もちろん起こるよ。しかも 「何もしなければほぼ確実に起こる」 と言っていいくらい、Roblox の標準挙動ではアバター同士は普通に重なる。

ここを少し OS 的に分解して説明するね。


🧩 Roblox のデフォルト挙動:アバターは“衝突しない”

Roblox の Humanoid キャラクターは、デフォルトで次の設定になっている:

  • HumanoidRootPart.CanCollide = false
  • 各 BodyPart(頭・胴体・手足)も基本的に CanCollide = false
  • Players.CharacterAutoLoads = true(スポーン位置が同じでも気にしない)

つまり Roblox は「アバター同士がぶつかって押し合う」ことを標準では想定していない。
だからスポーン地点が同じなら 完全に重なる


🎮 実際に起こる典型例

  • スポーン地点が 1 つ → 2 人同時にスポーン → 完全に重なる
  • 狭い通路で複数人が集まる → 体が重なって見える
  • NPC とプレイヤーが同じ位置に移動 → 重なる
  • R15 の細いパーツは特に重なりやすい

Roblox の物理エンジンは「キャラ同士の衝突」をデフォルトで無効にしているため、これは正常動作。


🛠️ 重ならないようにするには“プログラムで対処するしかない”

Roblox では、アバター同士の衝突を有効にしたい場合、必ずスクリプトで設定を変える必要がある

代表的な対処法

各パーツの CanCollide を true にする

for _, part in ipairs(character:GetDescendants()) do
    if part:IsA("BasePart") then
        part.CanCollide = true
    end
end

ただし、これだけだと歩行が不自然になったり、階段で引っかかったりする。


CollisionGroup を使って「プレイヤー同士だけ衝突させる」

Roblox の推奨方法。

local PhysicsService = game:GetService("PhysicsService")
PhysicsService:CreateCollisionGroup("Players")
PhysicsService:CollisionGroupSetCollidable("Players", "Players", true)

そして各パーツに割り当てる:

for _, part in ipairs(character:GetDescendants()) do
    if part:IsA("BasePart") then
        PhysicsService:SetPartCollisionGroup(part, "Players")
    end
end

スポーン位置をランダムにずらす

もっと軽量な方法:

character:MoveTo(spawnPos + Vector3.new(math.random(-3,3), 0, math.random(-3,3)))

🧠 あなたの OS 的視点でまとめると

Roblox のアバターは 「衝突しないプロセス」 として設計されている。
つまり:

  • デフォルトでは 重なるのが仕様
  • 衝突を有効化したいなら、開発者が OS レイヤーで設定を上書きする必要がある

あなたの「責務分離・明示的制御」の思想と完全に一致していて、
Roblox は「キャラ衝突はゲームデザインの責務だから、デフォルトでは無効」という設計になっている。


🔍 次に深掘りするなら

  • 衝突を有効にしたときの アニメーション・移動制御の副作用
  • RTS や GodView のような アバター非依存ゲームでの衝突設計
  • Spider-beam ゲームでの プレイヤー同士の干渉をどう扱うか

このあたり、あなたのプロジェクトの OS 設計にも直結するので、続けて掘っていけるよ。