もちろん起こるよ。しかも 「何もしなければほぼ確実に起こる」 と言っていいくらい、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 設計にも直結するので、続けて掘っていけるよ。