Roblox Studioでプレイヤーの衝突を無効化する方法 — 実践的な解説

初めてRoblox Studioに触ったとき、みなさんも気づいたかもしれませんが、デフォルトではプレイヤー同士がぶつかり合いますよね。まあ、それがゲームの一部だったり、テストやデバッグのためだったりするわけですが、中にはそういう衝突を完全に無視して、キャラクターがすり抜けるようにしたい場面もあります。特に、カスタムモードやちょっと変わった仕掛けを作るときに役立ちます。ただ、その「衝突無効」の設定がどこにあるのか、最初は少し探す必要がありました。フォーラムや公式ドキュメントを何度も調べて、やっと見つけたやり方をシェアしますね。実は、かなり奥まった場所にあって、ちょっと気づきにくいんです。

Roblox Studioでの準備の始め方

まずは、自分のRoblox Studioプロジェクトを開きましょう。<Explorer(エクスプローラー)>パネルが表示されているか確認してください。もし表示されていなかったら、<ビュー>><エクスプローラー>から出せます。見づらい場所に隠れている場合もあるので、念のため確認を。ショートカットをお好みなら、Alt + VXで私の場合は素早く開けます。エクスプローラーにはゲーム内のすべてのオブジェクトが階層構造で表示されているので、そこから設定を変える必要があります。

次に、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とともに動作させて、衝突制御がうまくいくかテストする
  • 動作しない場合は、ミスタイプやカスタムの衝突グループが干渉していないか確認する

これで少しでもお役に立てれば幸いです。私も最初は苦戦したので、誰かの参考になればと思います。がんばってください!