動くオブジェクトは、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オブジェクトは、全体のアセンブリに力を加えて一定の線形速度を維持するモーバー制約の一種です。アセンブリの位置を移動中に軸に固定しないことで、アセンブリは3D空間内の他のオブジェクトと衝突する際に回転する自由があります。このタイプの動きは、プレイヤーが予測するのが難しい驚くべきゲームプレイシナリオを生み出します。
アセンブリを移動させるには、LinearVelocity制約が以下の情報を知る必要があります:
- 力を加えるポイントと正または負の方向。
- アセンブリが1秒間に移動するスタッドの量。
- アセンブリが一定の線形速度に達するためにエンジンが加えることができる最大の力。
このプロセスを示すために、スイレンの葉を設定し、LinearVelocity制約が参照するアタッチメントを使用して、スイレンの葉を世界の負のX軸に沿って1秒間に15スタッドの一定の線形速度で移動させます。

アタッチメントを追加する
力を加えるポイントを指定するには、アセンブリにAttachmentオブジェクトを追加し、3D空間内のアタッチメントの位置を設定します。サンプルの動くオブジェクトゲームでは、スイレンの葉の中心にアタッチメントを配置し、制約がアタッチメントからメッシュを特定の軸に沿って移動できるようにしています。
アタッチメントには、動作軸を視覚化するための視覚的補助が含まれています。黄色の矢印はアタッチメントの主軸を示し、オレンジの矢印はアタッチメントの副軸を示します。この技術のステップでは、どちらの動作軸もスイレンの葉の動きに影響を与えませんが、将来の参照のためにこれらの視覚的補助を理解することは重要です。なぜなら、次の技術でのPrismaticConstraintのような異なるタイプの制約に対する理想的な動作を決定するのに役立つからです。

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

制約を設定する
メッシュにスイレンの葉を移動させるための固定ポイントができたので、LinearVelocity制約のプロパティを設定して、一定の線形速度の方向と大きさ、メッシュが1秒間に移動するスタッドの量、メッシュが一定の線形速度に達するためにエンジンが加えることができる最大の力を指定できます。
サンプルの動くオブジェクトゲームでは、スイレンの葉を世界の負のX軸に沿って1秒間に15スタッドの一定の線形速度で移動させるために、最大5000ロウトンの一定の力を加えます。ロウトンは、力を測定するためのRobloxの主要な物理単位です。Robloxの物理単位とそれがメートル法単位に変換される方法については、Robloxの単位を参照してください。
LinearVelocity制約を設定するには:
ビューポートで制約の線形方向を参照できるように、スタジオのViewメニューからShow Constraint Detailsを有効にします。
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軸に沿って1秒間に15スタッド移動させることを確認します。
メザニンのドロップダウンメニューからRunシミュレーションモードを選択し、Playボタンをクリックして開始します。スタジオは、3D空間内でアバターなしで現在のカメラ位置でゲームをシミュレートします。

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

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

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

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

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

制約を設定する
アタッチメントが同じ軸に整列し、ログが移動する方向を向いているので、PrismaticConstraint制約のプロパティを設定して、各アタッチメントの主軸の正または負の方向に目標の一定の線形速度を適用するか、アタッチメントが1秒間に移動するスタッドの量、ログが一定の線形速度に達するためにエンジンが加えることができる最大の力を指定できます。
自分の使用ケースに応じて異なる値を選択できますが、サンプルの動くオブジェクトゲームでは、アタッチメントを世界の負のX軸に沿って1秒間に40スタッドの一定の線形速度で移動させるために、最大50000ロウトンの一定の力を加えます。ただし、アタッチメントが固定されたオブジェクトにあるため、ログのアタッチメントのみが移動できます。
PrismaticConstraintを設定するには:
LogメッシュにPrismaticConstraintオブジェクトを挿入します。
- Explorerウィンドウで、メッシュの上にカーソルを合わせて⊕アイコンをクリックします。コンテキストメニューが表示されます。
- コンテキストメニューからPrismaticConstraintを挿入します。
ログのアタッチメントを新しい制約に割り当てて、ログが固定ブロックパーツに対して移動するようにします。
- Explorerウィンドウで、制約を選択します。
- Propertiesウィンドウで、
- Attachment0をAnchorAttachmentに設定します。
- Attachment1をLogAttachmentに設定します。制約がビューポートに表示されます。

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

設定した力の量がログを世界の負のX軸に沿って1秒間に40スタッド移動させることを確認します。
メザニンのドロップダウンメニューからRunシミュレーションモードを選択し、Playボタンをクリックして開始します。スタジオは、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)