PrismaticConstraint

Written by:

日本語でコードのYouTubeのコメント欄に、「Robloxで電車のドアのように開閉ボタン付きのスライド式ドアを作るにはどうしたらいいのでしょうか。」と言う質問をいただきました。ありがとうございます。

今回は、プリズムコンストレイントを使用し2 つのアタッチメントを 1 つの軸に沿ってスライドさせることができる引き戸を作成したいと思います。以下の手順やビデオを参考にしてください。

公式のRobloxのサイトでは、プリズムコンストレインとについて下記の内容が記されています。

PrismaticConstraint を使用すると、2 つのアタッチメントを 1 つの軸に沿ってスライドさせることができますが、回転することはできません。引き戸やエレベーター などの機構に割り当てることができます。

その他のコンストレイント
  1. 基本的なモデルの作成:
  • Roblox Studioを開き、新しいプレースを作成します。
  • Partを使ってドアとドアのフレームを作成します。基本的にドアの形状は、ご自由に創作することができます。動画では、スタジオのカスタムメッシュパーツを使用します。
  1. 開閉ボタン作成: 
    • 青色と赤色のパーツにアンカーを追加し、グループ化をします。
    • AIアシストでAIで模様作成をします。
    • それぞれのパーツに名前をつけます。ここでは、青のパーツをOpenButton、赤のパーツをCloseButtonとします。
    • クリックディテクターを挿入します。またストリング値が必要になるので、詳しくは、ボタンアイテムを下のリンクからアクセスして内容をご覧ください。
  2. ドアの部品の配置:
    • ドアがスライドするための機構を作成します。左右のドアが平行してスライドできるようしたいので、2つパーツを作成、平行に配置し、その間にPrismaticConstraintを挿入します。
    • PrismaticConstraint を挿入します。
      • Explorerウインドで、1つ目の パーツをDoorL(左側)と名前を変更します。2つ目のパーツは、BaseLと設定します。この時、BaseLのプロパティーでアンカーをオン(後にオフにしますが)、CanCollideをオフに設定します。そうすることで、1つ目のパーツがスライドし、BaseLを通り抜けて行くことができます。
      • [モデル]タブで、[作成] ボタンのピッカー メニューにアクセスし、目的の制約タイプ ( Prismatic) を選択します。
      • DoorLの上にマウスを置き、クリックして、このとき、視覚化された黄色の矢印で示される方向は、Baseパーツ方向に向いている必要があります。BaseLをクリックし、DoorLとBaseLに新しいアタッチメントが追加されます。
      • PrismaticConstraint を構成します。
        • プリズムプロパティをSliderのActuatorTypeをNoneからServoに変更しドアの移動スピードを5に、ServoMaxForcを999999に変更し、ドアの動きを制御します
  3. ドアの動きをプログラム:
    • ドアを開閉するためのスクリプトを作成します。RobloxではLua言語が使われるので、Luaスクリプトを使います。 例:
-- Door Script, by Sonomi

local model = script.Parent

local openButton = game.Workspace.Button.OpenButton
local closeButton = game.Workspace.Button.CloseButton

-- Localize Objects
local doorRPart = model.DoorR
local prismaticConstraintR = doorRPart:FindFirstChildOfClass("PrismaticConstraint")
local doorLPart = model.DoorL
local prismaticConstraintL = doorLPart:FindFirstChildOfClass("PrismaticConstraint")

-- Start Properties
prismaticConstraintR.TargetPosition = 0
prismaticConstraintL.TargetPosition = 0


-- slide door values
local state = "Close"
local openRPosition = -4
local closeRPosition = 0
local openLPosition = -4
local closeLPosition = 0


-- Open Buttons
openButton.ClickDetector.MouseClick:Connect(function()
	if state ~= openButton.button.Value and state ~= "Moving" then
		state = "Moving"
		wait(1.5)

		if openButton.button.Value == "Open" then
			prismaticConstraintR.TargetPosition = openRPosition
			prismaticConstraintL.TargetPosition = openLPosition

			model["Door"]:Play()
			waitForSlide("Open")
		end
	end
end)


-- Close Button
closeButton.ClickDetector.MouseClick:Connect(function()
	if state ~= closeButton.button.Value and state ~= "Moving" then
		state = "Moving"
		wait(1.5)

		if closeButton.button.Value == "Close" then
			prismaticConstraintR.TargetPosition = closeRPosition
			prismaticConstraintL.TargetPosition = closeLPosition

			model["Door"]:Play()
			waitForSlide("Close")
		end
	end
end)

-- Wait for open or close the door
function waitForSlide(slide)
	local moving = true
	local firstPosition
	local secondPosition

	while moving do
		firstPosition = doorRPart.Position
		firstPosition = doorLPart.Position
		wait(.25)
		secondPosition = doorRPart.Position
		secondPosition = doorLPart.Position

		if firstPosition == secondPosition then
			moving = false
		end
	end

	if slide == "Open" then
		state = "Open"
	elseif slide == "Close" then
		state = "Close"
	end
end

このスクリプトは、1で作成した開くボタン、閉まるボタンそれぞれがクリックされると、スライドする動作を行います。

  1. WeldConstraintの配置:
    • DoorLおよびDoorRのWeldConstraintを配置し、MeshPartがDoorLとDoorRと同じように一緒に移動可能にしてください。 DoorLを選択した状態で、メッシュパーツもしくはご自分で作成したドアのパーツをクリックします。このときメッシュパーツは、DoorLの子オブジェクトになります。この任意のオブジェクトもアンアンカード(unanchored)である必要があります。DoorLの子オブジェクトになるようにExplorウィンドウで、オブジェクトを下に配置します。DoorRにも、同じことを行いましょう。
    • ドアの作成が完了したら、BaseL、BaseR、DoorLおよびDoorRをグループにしておきます。
    • ドアを電車に配置した後に、BaseL、BaseR、DoorLおよびDoorRの透明度を1または完全に透明に設定してください。
  2. 電車に配置:
    • ドアメッシュもしくは、ドアのパーツはCanCollideがオンになっているので、他のパーツに触れることで、スライドが機能しなくなります。配置する際は、他のパーツに触れないように上手く設定しましょう。
    • WeldConstraintを — BaseLを選択した状態で、電車のパーツに糊付けします。BaskeRも同じように電車のパーツに固定して下さい。このBaseLおよびBaseR、その他のオブジェクトもアンアンカード(unanchored)である必要があります。 そうでなければ、電車が固定されてしまい、操縦する際に動くことができませんね。
  3. 必要に応じてサウンドの追加:
    • ドアが開いたり閉じたりする際にサウンドを追加することで、リアリティを向上させることができます。上記のプログラムでは、model[“Door”]:Play()で記されているように、Door のサウンドが再生できます。
  4. テスト:
    • プレースを再生して、ドアが正しく動作するか確認します。
  5. Slide Doorモデル: 地面から少し離れた状態でお使い下さい。
  6. Buttonモデル:

動画(3分)

Leave a comment