Roblox Studioでプレイヤーの衝突を無効にする方法:完全ガイド
Roblox Studioでプレイヤーの衝突を無効化する方法 — 実践的な解説
初めてRoblox Studioに触ったとき、みなさんも気づいたかもしれませんが、デフォルトではプレイヤー同士がぶつかり合いますよね。まあ、それがゲームの一部だったり、テストやデバッグのためだったりするわけですが、中にはそういう衝突を完全に無視して、キャラクターがすり抜けるようにしたい場面もあります。特に、カスタムモードやちょっと変わった仕掛けを作るときに役立ちます。ただ、その「衝突無効」の設定がどこにあるのか、最初は少し探す必要がありました。フォーラムや公式ドキュメントを何度も調べて、やっと見つけたやり方をシェアしますね。実は、かなり奥まった場所にあって、ちょっと気づきにくいんです。
Roblox Studioでの準備の始め方
まずは、自分のRoblox Studioプロジェクトを開きましょう。<Explorer(エクスプローラー)>パネルが表示されているか確認してください。もし表示されていなかったら、<ビュー>><エクスプローラー>から出せます。見づらい場所に隠れている場合もあるので、念のため確認を。ショートカットをお好みなら、Alt + V → Xで私の場合は素早く開けます。エクスプローラーにはゲーム内のすべてのオブジェクトが階層構造で表示されているので、そこから設定を変える必要があります。
次に、ServerScriptService
を探します。もし見つからなかったら、エクスプローラーがきちんと展開されているか確認してください。時々、折りたたまれていたり、隠れていることがあって、「どこにスクリプトを置けばいいの?」と迷うこともあります。その場合は、ServerScriptService
を右クリックして、オブジェクトの挿入 > Scriptを選びます。スクリプトにはわかりやすい名前、たとえば「DisablePlayerCollisions」と付けておくと、後で見返すときに便利です。そこに、次に示すコードを貼り付けてくださいね。こうすれば、衝突をきちんと制御できるようになります。
衝突無効化のためのコード例
こちらのコードを使っています。ちょっと乱暴な感じに見えますが、ちゃんと機能します。すべてのプレイヤーをループして、それぞれについてCanCollide
の値を切り替えます。シンプルに書いてありますが、動作は確実です:
lua
-- プレイヤー間の衝突を無効にする
local Players = game:GetService("Players")
local function setCollision(enable)
for _, player in pairs(Players:GetPlayers()) do
local character = player.Character
if character and character:FindFirstChild("HumanoidRootPart") then
local hrp = character.HumanoidRootPart
-- 他のプレイヤーと比較
for _, otherPlayer in pairs(Players:GetPlayers()) do
if otherPlayer ~= player then
local otherChar = otherPlayer.Character
if otherChar and otherChar:FindFirstChild("HumanoidRootPart") then
local otherHrp = otherChar.HumanoidRootPart
if enable then
-- 衝突を元に戻す
hrp.CanCollide = true
otherHrp.CanCollide = true
else
-- 衝突を無効にする
hrp.CanCollide = false
otherHrp.CanCollide = false
end
end
end
end
end
end
end
-- 衝突を無効にしたいときはfalseを渡す
setCollision(false)
確かに、全員のCanCollide
をループで切り替えるのは少し大袈裟に見えるかもしれません。でも、テストにはとても便利で、意外と安定しています。衝突が無効の状態で、新しいプレイヤーが参加した場合は、もう一度setCollision(true)
を呼び出して、普通に戻す必要があります。また、あなたのゲームがPhysicsService
や衝突グループを使っている場合は、この方法が思ったように働かないこともあるので注意です。私は何度も試行錯誤しました。衝突グループの設定を工夫した方が良い場合もありますが、とりあえずこの手軽な切り替え方法でも十分に役立ちました。
動作確認と仕上げのポイント
コードを貼り付けたら、スクリプトを一旦閉じておくのがおすすめです。たまに忘れてそのまま放置してしまうと、デバッグが複雑になったりします。次に、実際にゲームを再生(スタートやプレイ)して、二人のキャラクターを動かしてみてください。正常に動いていれば、お互いすり抜けるはずです。ぶつかり合ったり妨害されたりしません。もし動かない場合は、スクリプトの配置や記述ミスを再度確認しましょう。読み間違いや型式のミスなど、基本的なことが原因だったりします。
注意点と追加のヒント
この方法はちょっとした工夫(ハック)です。Robloxには、公式に簡易な切り替え機能は用意されていません。衝突グループを使っている場合は、それらを適切に設定した方が確実です。特に複雑なゲームになればなるほど、このスクリプトだけでは不十分なケースもあります。また、CanCollide
を途中で変えると、他の部分が干渉して動かなくなることもあるので注意しましょう。特に、ゲーム中にプレイヤーが途中参加した場合は、必ずsetCollision(true)
を再実行して正常に戻す必要があります。
最後に、この方法はデバッグや試験目的には非常に便利ですが、実際のゲームプレイ中は通常通りの衝突設定を使うのが基本です。モード切り替えを行うためのボタンや管理者コマンドに連動させれば、リアルタイムで衝突のON/OFFを切り替えられて便利です。
最後に、この記事のポイントをまとめておきます。これを確認すれば、設定のミスも減るはずです:
- スクリプトは
ServerScriptService
内か、サーバー側の適切な場所に置く - スクリプトを追加・編集したら必ずゲームを再生して動作確認を行う
- 複数のプレイヤーやNPCとともに動作させて、衝突制御がうまくいくかテストする
- 動作しない場合は、ミスタイプやカスタムの衝突グループが干渉していないか確認する
これで少しでもお役に立てれば幸いです。私も最初は苦戦したので、誰かの参考になればと思います。がんばってください!