すべてのプレイスはデータモデルによって表され、プレイスに関するすべてを説明するオブジェクトの階層です。データモデルには、パーツ、地形、照明、その他の環境要素など、3D世界を構成するすべてのオブジェクトが含まれています。また、プロパティを変更したり、メソッドや関数を呼び出したり、動的な動作やインタラクティブ性を可能にするイベントに応答したりするスクリプトなど、ランタイムの動作を制御できるオブジェクトも含まれています。
Robloxエンジンは、プレイスの状態の真実の源としてデータモデルを使用し、クライアントデバイス上でそれをシミュレートおよびレンダリングします。データモデルの解釈方法についての詳細は、クライアント-サーバーランタイムを参照してください。
オブジェクト
Robloxのデータモデルにオブジェクトを配置して整理し、プレイスを説明します。Robloxのすべてのオブジェクトは、すべてのオブジェクトに共通する一般的なプロパティ、メソッド、およびイベントを定義するInstanceクラスから継承されます。オブジェクトは、オブジェクトが提供する機能に応じて独自の特性も定義します。オブジェクトには多くのカテゴリがあり、さまざまな用途がありますが、BasePartおよびLuaSourceContainerオブジェクト(一般的にパーツおよびスクリプトと呼ばれます)を頻繁に使用します。
Robloxエンジンのすべての機能の包括的なリストについては、リファレンスドキュメントを参照してください。
3Dビルディングブロック
BasePartは、物理的にシミュレートされた3Dビルディングブロックのコアクラスです。位置、サイズ、向きなどのプロパティを持つすべての物理オブジェクトに共通するプロパティとメソッドを定義します。
| オブジェクト | 説明 |
|---|---|
| Part | ブロック、ボール、シリンダー、くさび、またはコーナーくさびの形を取ることができる原始的なパーツです。 |
| MeshPart | MayaやBlenderなどの3Dモデリングソフトウェアからインポートされたメッシュです。 |
| TrussPart | キャラクターが梯子のように登ることができるトラスビームです。 |
理論的には、単純なパーツだけを使用して完全に機能するRobloxゲームを作成できますが、実際にはメッシュをインポートし、原始的なパーツを組み合わせて、ソリッドモデリングを通じてより複雑なオブジェクトや構造を作成することが最も一般的です。
スクリプト
スクリプトを使用して、プレイスの3D世界にインタラクティブ性と動作を追加し、ロジックを定義できます。スクリプトはLuauプログラミング言語で記述し、パーツを移動させたり、他のスクリプトを呼び出したり、イベントに応答したりすることができます。Robloxはクライアント-サーバーモデルで動作するため、スクリプトをサーバー、クライアントで実行するか、ネットワーク境界を越えて通信させることができます。
- Scriptオブジェクトは、サーバーでのみ実行できるスクリプトを表します。
- LocalScriptオブジェクトは、クライアントでのみ実行できるスクリプトを表します。
- ModuleScriptオブジェクトは、サーバーおよびクライアントスクリプトの両方からrequire()できる再利用可能なスクリプトを表します。
スクリプトが正しく動作するためには、データモデル内の正しいコンテナに配置する必要があります。詳細については、サーバーおよびクライアントのセクションを参照してください。
オブジェクトの整理
データモデルを整理する方法には多くの柔軟性がありますが、Robloxエンジンは特定のオブジェクトが特定のコンテナサービスに存在することを期待しています。これらは特定の動作を持ち、含まれるオブジェクトの動作に影響を与えることができるオブジェクトです。コンテナサービスの主なカテゴリには以下が含まれます。
- Workspace — Workspaceは、3D世界にレンダリングされるすべてのオブジェクトを格納します。
さらに、以下のオブジェクトを使用してオブジェクトを整理することもできます。
- フォルダー — Folderは組織目的のためのもので、動作を定義しません。たとえば、サーバーストレージ内のスクリプトのセットのように、類似のオブジェクトをグループ化するためにフォルダーを使用できます。
- モデル — Modelは、パーツの幾何学的なグループ化を主に目的としています。たとえば、椅子、テーブル、ランプを含むデスクセットをグループ化することができます。より複雑なセットを整理するために、モデル内にモデルをネストすることもできます。
Workspace
Workspaceは、プレイスの3D世界を構成するすべてのオブジェクトを含みます。ベースパーツ、メッシュパーツ、モデルなど、3D世界をカスタマイズするためにオブジェクトをワークスペースに追加できます。クライアントはこのコンテナに表示されるすべてのものをレンダリングし、それ以外のものは何も表示しないため、ユーザーがプレイスで見るものやインタラクションするものを制御できます。実際にはレンダリングされませんが、関連するパーツやモデルに親子関係を持つスクリプトを追加することもできます。デフォルトでは、ワークスペースにはTerrainおよびCameraオブジェクトが事前に配置されています。
カメラ
Cameraは、クライアントが3D世界をどのように見るかを決定します。デフォルトでは、ワークスペースに1つのカメラがありますが、異なる視点やビューを作成するために複数のカメラオブジェクトを追加できます。すべてのクライアントはこれらの設定を取り込み、サーバーが直接変更できない独自のカメラビューを作成します。
たとえば、カメラをユーザーの動きに追従させたり、特定の位置に固定したりすることができます。また、視野、距離、角度を調整して、ユーザーが3D世界をどのように見るかの視覚効果を作成できます。
詳細については、カメラのカスタマイズを参照してください。
地形
Terrainを使用すると、プレイスの風景を作成できます。地形にマテリアルを適用して、草、水、砂、またはカスタムマテリアルなどの望ましい自然環境をシミュレートできます。3D世界には1つの地形オブジェクトしか持てず、その地形に1つのマテリアルを適用できますが、Terrain Editorを使用して地形の領域を編集できます。
詳細については、環境地形を参照してください。
環境
カスタム照明は、3D世界をより没入感のあるリアルなものにすることができます。Lightingサービスには、Atmosphereのようなプレイスのグローバル照明設定を制御するオブジェクトが含まれており、雰囲気効果をシミュレートしたり、Skyを使用して環境内の太陽、月、星を変更したりできます。さらに、特定のオブジェクトから光を放出するために光源を使用できます。
ゲームにオーディオを追加することも、ゲームを新たな高みへと引き上げるために重要です。位置情報オーディオと非位置情報オーディオを戦略的に使用することで、プレイヤーをあなたの世界に没入させ、彼らの行動に対する有用なフィードバックを提供し、成功するために必要なことに注意を向けさせることができます。
複製
複製は、サーバーがプレイスの状態をすべての接続されたクライアントと同期させるプロセスです。Robloxエンジンは、サーバーとクライアント間でデータ、物理、チャットメッセージを多くのケースでインテリジェントに自動的に複製しますが、特定のオブジェクトを特定のコンテナに配置することで、複製するオブジェクトを指定することもできます。
ReplicatedFirst
ReplicatedFirstには、クライアントがプレイスに参加したときに複製したいオブジェクトが含まれています。通常、クライアント側のLocalScriptオブジェクトやスクリプトに関連するオブジェクトなど、プレイヤーを初期化するために不可欠なオブジェクトが含まれています。このコンテナ内のすべてのコンテンツは、サーバーからクライアントに一度だけ複製されます。
ReplicatedStorage
ReplicatedStorageには、サーバーと接続されたクライアントの両方で利用可能なオブジェクトが含まれています。クライアントで発生した変更は持続しますが、サーバーには複製されません。サーバーは、一貫性を維持するためにクライアントの変更を上書きすることができます。このコンテナは、Script(サーバー側)およびLocalScript(クライアント側)オブジェクトの両方から共有およびアクセスする必要があるModuleScriptオブジェクトに通常使用されます。さらに、このコンテナを使用して、必要になるまで3D世界に存在する必要のないオブジェクト(たとえば、すべてのキャラクターモデルにクローンして親子関係を持たせるためのParticleEmitter)を複製できます。
複製がどのように機能するかについての詳細は、クライアント-サーバーランタイムを参照してください。
サーバー
データモデルは、クライアントに複製されないサーバー側専用のオブジェクトのための専用コンテナを定義します。これにより、サーバーはクライアントにサーバーのオブジェクトやロジックを公開することなく、クライアントの動作や状態に影響を与えることができます。
ServerScriptService
ServerScriptServiceには、Scriptオブジェクト、サーバースクリプトによって必要とされるModuleScriptオブジェクト、およびサーバー専用のその他のスクリプト関連オブジェクトが含まれています。スクリプトが他の非スクリプトオブジェクトを必要とする場合、それらをServerStorageに配置する必要があります。このコンテナ内のスクリプトはクライアントに複製されることはなく、安全なサーバー側のロジックを持つことができます。
ServerStorage
ServerStorageには、サーバー専用のオブジェクトが含まれています。このコンテナを使用して、ランタイムでワークスペースや他のコンテナにクローンして親子関係を持たせたいオブジェクトを保存できます。たとえば、大きなオブジェクト(地図など)をこのコンテナに保存し、必要なときにワークスペースに移動することができます。これにより、初回参加時のクライアントのネットワークトラフィックを減少させることができます。
クライアント
クライアントコンテナサービスは、すべての接続されたクライアントに複製されるオブジェクトを対象としています。このカテゴリのコンテナは、すべての接続されたクライアントに複製され、通常は3Dオブジェクトと関連するLocalScriptオブジェクトを含みます。これらのコンテナに格納されたすべてのオブジェクトは、セッション間で持続せず、クライアントが再参加するたびにリセットされます。プレイヤーGUI、クライアント側スクリプト、クライアントにのみ関連するその他のオブジェクトなど、これらのコンテナにオブジェクトを配置できます。
クライアントがサーバーに接続すると、Playersコンテナサービスはプレイスに参加するユーザーをリッスンし、各クライアントのためにPlayerオブジェクトを作成します。サーバーは、編集データモデル内のクライアントコンテナからオブジェクトをコピーし、Playersオブジェクト内のランタイムデータモデルの対応する場所にコピーします。以下の表は、元のコンテナとクライアントにコピーされる結果のコンテナを説明しています。
| 編集データモデル | ランタイムデータモデル | ノート |
|---|---|---|
| StarterPack | Player.Backpack | プレイヤーのインベントリを設定するスクリプトで、一般的にToolオブジェクトを含みますが、ローカルスクリプトも含まれることがよくあります。 |
| StarterGui | Player.PlayerGui | プレイヤーのローカルGUIを管理できるスクリプトです。プレイヤーが再出現すると、PlayerGuiの内容は空になります。サーバーはStarterGui内のオブジェクトをPlayerGuiにコピーします。 |
| StarterPlayerScripts | Player.PlayerScripts | クライアント用の一般的なスクリプトです。たとえば、特定の条件が満たされたときにクライアントで特別な効果を作成したい場合、このコンテナにローカルスクリプトを配置してそれを行うことができます。サーバーはこのコンテナにアクセスできません。 |
| StarterCharacterScripts | Player.Character | プレイヤーが出現するときにクライアントにコピーされるスクリプトです。これらのスクリプトは、プレイヤーが再出現するときに持続しません。 |
| ReplicatedFirst | このコンテナの内容は、他の何よりも先にすべてのクライアントに複製されます(ただし、サーバーには戻りません)。 |
チャット
TextChatService
TextChatServiceは、チャネルの管理、メッセージの装飾、テキストのフィルタリング、コマンドの作成、カスタムチャットインターフェースの開発など、さまざまなゲーム内テキストチャットタスクを処理するサービスを表します。
詳細については、テキストチャットの概要を参照してください。
VoiceChatService
VoiceChatServiceは、他のユーザーにどれだけ近いかに基づいてリアルなコミュニケーションをシミュレートする近接ベースのボイスチャット機能を表します。このサービスを使用して、機能をオンまたはオフに切り替えることができます。
詳細については、ボイスチャットを参照してください。
フォルダーとモデル
データモデル内のオブジェクトをグループ化するための主な方法は2つあります:フォルダーとモデルです。どちらもオブジェクトのコンテナですが、目的が異なります。
- フォルダーは、ロビーや戦闘アリーナなど、環境のセクションを保存するのに最適です。
- モデルは、椅子、テーブル、ランプを含むデスクセットなど、オブジェクトのセットに使用されます。より複雑なセットを整理するために、モデル内にモデルをネストします。
オブジェクトには常に説明的な名前を付けるべきです。これにより、後でオブジェクトを簡単に見つけて変更することができます。

