動くオブジェクトは、3D空間内の1つまたは複数の軸に沿って移動するオブジェクトです。Robloxのシミュレーションエンジンの内蔵機能を使用して、オブジェクトが移動し、重力、空気力学、摩擦などのプレイヤーにとって直感的で馴染みのある現実世界の物理挙動を模倣する形で環境と相互作用するようにできます。
動くオブジェクトの.rbxlファイルを参照として、このチュートリアルでは、物理的な力がスタジオ内の直線運動にどのように影響するかを説明し、異なる移動挙動を持つオブジェクトをA地点からB地点に移動させるさまざまな手法を示します。具体的には以下のガイダンスを含みます:
- LinearVelocityモーバー制約を使用して、アセンブリ全体を一定の線速度で移動させる。
- PrismaticConstraintを使用して、アセンブリを単一の軸に制約し、3D空間内の特定の点に対して一定の線速度で移動させる。
- ApplyImpulseメソッドを使用して、物理的な力の初期インパルスでアセンブリを移動させ、時間とともに徐々に減速させる。
線形運動と物理的力
Roblox Studioは、現実世界の物理行動をリアルタイムでエミュレートするリアルワールドシミュレーションエンジンです。したがって、オブジェクトが線形に動く際にどのように振る舞うかを予測するには、現実世界でのオブジェクトの動きに対する高レベルの理解が重要です。
線形運動は、軸に沿った移動です。たとえば、ブロックが線形運動を持つ場合、特定の軸に沿って移動します。

線形運動は、外部の物理的力がオブジェクトを押したり引いたりして移動させることなしには存在できません。ニュートンの運動の第一法則によれば、静止したオブジェクトは静止し続け、動いているオブジェクトは外部の力が作用しない限り、一定の速度で動き続けます。たとえば、静止したブロックは風のような物理的力が押さない限り静止し続けます。
力は、物理的な押しや引きがオブジェクトの線速度を変える方向と大きさの測定です。速度の変化は加速度として知られています。この概念はスタジオ内でオブジェクトが移動するために特に重要です。オブジェクトに適用する力が大きいほど、より迅速に加速します。
これは、力が重力や摩擦のようにオブジェクトに対して押し返す物理的力を上回る必要があるためです。たとえば、ブロックを金属の板の上に置くと、風の物理的力はブロックを加速し続けるために金属板からの摩擦の量を上回る必要があります。風の力が金属板からの摩擦よりもあまりにも少ない場合、ブロックは加速しますが、以前の例よりも遅くなります。

線形速度はオブジェクトの動き、または時間の経過に伴いオブジェクトがどれだけ速く位置を変えるかの測定です。スタジオは、オブジェクトが1秒間に移動するスタッドの数に基づいて線形速度を測定します。スタッドは長さを測定するためのRobloxの基本的な物理単位であり、1つのスタッドは現実世界で約28cmに相当します。

線形速度を理解することは、ゲームプレイを設計する上で重要です。なぜなら、動くオブジェクトの特定の速度を達成するために必要な力を判断するのに役立つからです。たとえば、オブジェクトを上方向に押し出したいとき、環境内の重力を克服するために力をどのように調整を行う必要があるかを考慮することが重要です。
以下のセクションでは、安定した線速度または初期の線速度でオブジェクトを移動する方法を学び、環境内の反対の物理的力を克服するために必要な力について深く掘り下げていきます。今後の手法に従いながら、これらの物理の概念をレビューすることで、スタジオで理想的な線の運動の挙動を達成するために、プロパティの値を調整する方法をより正確に予測できます。
一定の線速度を維持する
オブジェクトが一定の線速度に達し、維持するためには、オブジェクトの線速度を減速させたり、静止させたりする反対の物理的力を克服するための力が必要です。たとえば、スタジオでオブジェクトが[0, 12, 0]の線速度を持つようにしたい場合、オブジェクトが環境内でY軸に沿って1秒間に12スタッド移動するために十分な力が必要です。
必要な力の量は、重力や摩擦など、環境内の対立する物理的な力だけでなく、オブジェクト自身にも依存します。たとえば、同じ軸に沿って移動する同じ形の2つのオブジェクトがある場合、より大きな質量を持つオブジェクトは、同じ線の加速を達成するためにより多くの力を必要とします。
次のサブセクションでは、異なる形状とサイズのアセンブリを使用して、アセンブリ全体を移動させるか、オブジェクトの一部のみを一定の線速度で移動させる方法を教えます。さまざまなプロパティの値を試しながら、独自の体験内で必要なアセンブリに対する最大の力を推定できるようになります。
LinearVelocity制約を使用する
LinearVelocityオブジェクトは、アセンブリ全体に力を適用して一定の線速度を維持するタイプのモーバー制約です。移動中にアセンブリの位置を軸に固定しないことで、他のオブジェクトと衝突する際にアセンブリが回転することが可能になり、このタイプの動きはプレイヤーが予測しにくい驚くべきゲームプレイシナリオを引き起こします。
アセンブリを移動させるには、LinearVelocity制約は以下の情報を必要とします:
- 力を適用する点とその正のまたは負の方向。
- 1秒間にアセンブリが移動するスタッドの量。
- エンジンがアセンブリに一定の線速度を達成するために適用できる最大の力。
このプロセスを実演するために、スイレンの葉を設定し、LinearVelocity制約が参照するアタッチメントでスイレンの葉を世界の負のX軸に沿って1秒間に15スタッド移動されるように配置します。

アタッチメントを追加する
力を適用する点を指定するには、アセンブリにAttachmentオブジェクトを追加し、アタッチメントの位置を3D空間内で設定します。サンプルの動くオブジェクト体験は、スイレンの葉の中央にアタッチメントを配置し、その制約がアタッチメントからメッシュを特定の軸に沿って移動できるようになります。
アタッチメントには、動作軸を視覚化するための視覚的な補助具が含まれています。黄色の矢印はアタッチメントの主な軸を示し、オレンジ色の矢印はアタッチメントの二次軸を示します。この技法のステップでアタッチメントの動きがスイレンの葉の動きに影響を与えない場合でも、将来の参考のためにこれらの視覚的補助具を理解することは重要です。なぜなら、PrismaticConstraintなど異なるタイプの制約に対する理想的な動作を判断するのに役立つからです。

アタッチメントを追加するには:
Explorerウィンドウで、LinearVelocityExampleフォルダを展開し、その子のLilyPad_DIYモデルを展開します。
Padメッシュにアタッチメントを挿入します。
- メッシュの上にカーソルを置き、⊕ボタンをクリックします。コンテキストメニューが表示されます。
- メニューからAttachmentを挿入します。アタッチメントはパートの中央に表示されます。
- アタッチメントの名前をMoveAttachmentに変更します。

制約を設定する
スイレンの葉を移動させる固定点ができたので、LinearVelocity制約のプロパティを設定して、一定の線速度の方向と大きさ、メッシュが1秒間に移動するスタッドの量、エンジンがメッシュに一定の線速度を達成するために適用できる最大の力を指定できます。
サンプルの動くオブジェクト体験では、スイレンの葉を世界の負のX軸に沿って15スタッド毎秒の一定の線速度で移動するために、最大5000ロウトンの力を適用します。ロウトンは力を測定するためのRobloxの基本的な物理単位です。Robloxの物理単位とそれがメトリック単位に変換される方法の参照については、Roblox Unitsをご覧ください。
LinearVelocity制約を設定するには:
制約の線方向を参照できるように、StudioのViewメニューから制約詳細を表示を有効にします。
PadメッシュにLinearVelocity制約を追加します。
- Explorerウィンドウで、メッシュの上にカーソルを置き、⊕アイコンをクリックします。コンテキストメニューが表示されます。
- メニューからLinearVelocityを挿入します。
メッシュのアタッチメントを新しい制約に割り当てます。
- Explorerウィンドウで制約を選択します。
- Propertiesウィンドウで、
- Attachment0にMoveAttachmentを設定します。
- MaxForceに5000を設定して、ターゲットの線速度を達成するために最大5000ロウトンの一定の力を適用します。
- RelativeToをWorldに保ち、スイレンの葉を世界の位置と方向に対して移動させます。
- VelocityConstraintをLineに設定し、そのアタッチメントからの線に沿った力を制約します。
- LineDirectionを-1, 0, 0に設定して、スイレンの葉を世界の負のX軸に沿って移動させます。このプロパティを1, 0, 0に設定した場合、スイレンの葉は世界の正のX軸に沿って移動します。
- LineVelocityを15に設定し、スイレンの葉を1秒間に15スタッド移動させます。

設定した力の量が、メッシュを世界の負のX軸に沿って15スタッド毎秒移動させることを確認します。
メザニンのドロップダウンメニューからRunシミュレーションモードを選択し、Playボタンをクリックして開始します。Studioは、カメラの現在の位置で体験をシミュレートし、3D空間内のアバターなしで動作します。

PrismaticConstraint制約を使用する
PrismaticConstraintオブジェクトは、二つのアタッチメントの間に剛性の関節を作成し、それらの親アセンブリが互いに一つの軸に沿って移動できるようにするタイプの機械的制約です。両方のアセンブリの位置を単一の軸に固定することで、各アセンブリは同じ方向にとも回転しない限りは回転できません。
このタイプの動きは、プレイヤーが予測しやすい安定したゲームプレイシナリオにつながります。たとえば、サンプルの動くオブジェクト体験では、PrismaticConstraintオブジェクトを使用して、プレイヤーが巨大な川を慎重に横切るために使用できる丸太のプラットフォームを移動させています。
PrismaticConstraint.ActuatorTypeをMotorに設定すると、この制約は二つのアタッチメントに力を適用し、アタッチメントが一定の線速度に達し、維持することを目指します。一つのアタッチメントの親アセンブリをアンカーした場合、力はアンカーされていないアセンブリを一定の線速度で移動し続ける一方で、アンカーされたアセンブリは静止します。
アセンブリを移動させるには、PrismaticConstraint制約は以下の情報を必要とします:
- 力を適用する点とその正のまたは負の方向。
- アタッチメントが1秒間に動くスタッドの量。
- アタッチメントとその親アセンブリが一定の線速度に到達するためにエンジンが適用できる最大の力。
このプロセスを示すために、ログアセンブリを設定し、PrismaticConstraintが参照する子アタッチメントを持つ2つのオブジェクトを持っていることで、ログを世界の負のX軸に沿って1秒間に40スタッドの一定の線速度で移動させます。

アタッチメントを設定する
アセンブリ内の特定のオブジェクトを移動する方向を指定するには、アセンブリ内に二つのAttachmentオブジェクトを追加し、それらの整列と方向を3D空間内で設定します。サンプルの動くオブジェクト体験は、アンカーログがアンカーされた部分と重複する位置の近くに、世界のX軸に沿って二つのアタッチメントを整列させ、各アタッチメントの主な軸を世界の負のX軸に向けます。
次のセクションであなたのPrismaticConstraint制約を設定する際、ログはアンカー部品に対して相対的に移動します。言い換えれば、ログは3D空間でアンカーされているために移動できない静止している部品から離れて動きます。
PrismaticConstraintのためのアタッチメントを設定するには:
Explorerウィンドウで、PrismaticConstraintExampleフォルダを展開し、その子のLog_DIYモデルを展開します。
Logメッシュにアタッチメントを挿入します。
- メッシュの上にカーソルを置き、⊕ボタンをクリックします。コンテキストメニューが表示されます。
- メニューからAttachmentを挿入します。アタッチメントはパートの中心に表示されます。
- アタッチメントの名前をLogAttachmentに変更します。

同じプロセスを用いて、Anchorパーツにアタッチメントを挿入し、アタッチメントの名前をAnchorAttachmentに変更します。

View Selectorツールを世界の座標の参照として使用して、各アタッチメントの主な軸が世界の負のX軸を向くようにLogAttachmentとAnchorAttachmentを回転させます。

AnchorAttachmentの位置を調整し、両方のアタッチメントが世界のX軸に沿うように配置します。

制約を設定する
アタッチメントが同じ軸に整列し、ログが移動する方向を向いているため、PrismaticConstraint制約のプロパティを設定して、各アタッチメントの主軸の正または負の方向にターゲットの線速度を適用するか、アタッチメントが1秒間に移動するスタッドの量、そしてログが一定の線速度に到達するためにエンジンが適用できる最大の力を指定できます。
独自のユースケースで異なる値を選択できますが、サンプルの動くオブジェクト体験では、アタッチメントを40ラジアン毎秒の一定の線速度で世界の負のX軸に沿って移動させるために最大50000ロウトンの一定の力を適用します。ただし、アンカーアタッチメントがアンカーされたオブジェクトにあるため、ログのアタッチメントのみが移動可能です。
PrismaticConstraintを構成するには:
LogメッシュにPrismaticConstraintオブジェクトを挿入します。
- Explorerウィンドウで、メッシュの上にカーソルを置き、⊕アイコンをクリックします。コンテキストメニューが表示されます。
- メニューからPrismaticConstraintを挿入します。
ログのアタッチメントを新しい制約に割り当てて、ログがアンカー部品に関連して移動するようにします。
- Explorerウィンドウで制約を選択します。
- Propertiesウィンドウで、
- Attachment0をAnchorAttachmentに設定します。
- Attachment1をLogAttachmentに設定します。制約がビューポートに表示されます。

Explorerウィンドウで制約を選択し、Propertiesウィンドウで:
- ActuatorTypeをMotorに設定します。新しいプロパティフィールドが表示されます。
- MotorMaxForceを50000に設定し、ターゲット線速度を達成するために最大50000ロウトンの一定の力を適用します。
- Velocityを40に設定し、ログを1秒間に40スタッド移動させます。

設定した力がログを世界の負のX軸に沿って40スタッド移動させることを確認します。
メザニンのドロップダウンメニューからRunシミュレーションモードを選択し、Playボタンをクリックして開始します。Studioは、カメラの現在の位置で体験をシミュレートし、3D空間内のアバターなしで動作します。

初期の線の力を適用する
オブジェクトの線速度を変更する別の方法は、力のインパルスを適用することです。力のインパルスの後、オブジェクトは摩擦のような反対の力がある場合は静止するまで減速するか、反対の力がない場合は一定の線速度で移動し続けます。
この技法は、爆発や影響を与える衝突などの重要なゲームプレイイベントの後にオブジェクトを移動させるのに便利です。なぜなら、プレイヤーに即時のフィードバックを提供するからです。これを示すために、次のサブセクションでは、プレイヤーがジャンプパッドに衝突したときに、初期のインパルスで空に向けてプレイヤーのキャラクターを発射する方法を教えます。このインパルスは、新しい値で調整して独自のゲームプレイ要件に合わせることができます。
ApplyImpulseを使用する
ApplyImpulseメソッドは、アセンブリ全体に力を適用して、反対の力がある場合は停止するまで、初期の線速度を得るために動作します。アセンブリを移動させるには、メソッドは以下の情報を知る必要があります:
- 移動させるアセンブリ。
- 初期の線速度を得るために力を適用する軸。
- 各軸に適用する力の量。
これらのすべての値をスクリプト内で定義できます。たとえば、サンプルスクリプトは、移動するアセンブリとしてプレイヤーキャラクターのHumanoidオブジェクトを定義し、プレイヤーを世界の正のY軸に沿って上方に発射するインパルスとして2500ロウトン秒の力を適用します。プレイヤーキャラクターは異なる質量を持っているため、より小さな質量のプレイヤーキャラクターを高く発射しすぎないように、この力を増やして調整する必要がある場合があります。
ApplyImpulseを使用してアセンブリを移動させるには:
Explorerウィンドウで、ApplyImpulseExampleフォルダを展開し、その子のJumpPad_DIYモデルを展開します。
JumpPadパーツにスクリプトを挿入します。
- パーツの上にカーソルを置き、⊕ボタンをクリックします。コンテキストメニューが表示されます。
- メニューからScriptを挿入します。アタッチメントはパートの中央に表示されます。
- スクリプトの名前をJumpScriptに変更します。
デフォルトのコードを次のコードに置き換えます:
local volume = script.Parentlocal function onTouched(other)local impulse = Vector3.new(0, 2500, 0)local character = other.Parentlocal humanoid = character:FindFirstChildWhichIsA("Humanoid")if humanoid and other.Name == "LeftFoot" thenother:ApplyImpulse(impulse)endendvolume.Touched:Connect(onTouched)