このページには、経験豊富な Unity 開発者が Roblox を始めるための情報が含まれており、基本的なオリエンテーション、概念的な比較、および両プラットフォーム間の主な違いが説明されています。
オリエンテーション


Unity の Hierarchy ウィンドウと Roblox Studio の Explorer は、3D シーン内の要素を整理するための主要なウィンドウです:
- 両方とも、オブジェクト(たとえば、キャラクターや環境アセット)を管理および整理することができます。
- 両方とも、オブジェクト間の親子関係に対してツリー構造を使用します。
ただし、Hierarchy ウィンドウには事前定義された構造がないのに対し、Explorer ウィンドウには厳格な構造があります。Explorer ウィンドウは、Unity の Hierarchy と Project ウィンドウの組み合わせとして考えると良いかもしれません。Workspace フォルダーが最も認識しやすい要素です。
同様に、Roblox Studio の Asset Manager と Toolbox は、Unity の Project ウィンドウと重なります。Asset Manager はゲーム内のすべてのアセットを管理することを可能にし、Toolbox は公開したアセットにアクセスすることを可能にします。Toolbox では、Unity の Asset Store に似て、Roblox やコミュニティからのアセットを Creator Store で検索することもできます。
哲学的な違い
Roblox は従来のゲームエンジンではなく「シミュレーションエンジン」です。Unity の GameObjects と Roblox の Parts は、3D 環境内でオブジェクトを作成するための基本的なビルディングブロックとして機能しますが、実際には両者はかなり異なります:
- 表現: Unity の GameObjects はシーン内の任意のオブジェクトのための高レベルの概念ですが、Roblox の Parts は木製のブロックやプラスチックの球体などの物理オブジェクトを表現するために設計されています。Unity の原始的なオブジェクトのような抽象的なジオメトリではありません。
- 物理: Unity で物理シミュレーションを実行するには、GameObject に Rigidbody や Collider などのコンポーネントをアタッチします。Roblox では、物理が Parts データ型に組み込まれており、エンジンが自動的に相互作用を処理します。
GameObject と Part を作成すると、すぐに違いがわかります。GameObject には位置、回転、スケール以外の情報はありません。Part には同じ情報に加えて、マテリアルや色、反射率や透明度の値、質量や形状など、さらに多くの情報があります。Part を空の GameObject に似たものにするには、多くの組み込みプロパティを 削除 する必要があります。逆に、GameObject に MeshFilter、MeshRenderer、Collider、Rigidbody コンポーネントを追加することで、Part に非常に似たものを作成することができます。
スクリプトの観点から見ると、GameObject は Roblox の Instance に最も似ています。Instance は他のすべての Roblox クラスの基本クラスですが、Instance 型のオブジェクトを作成することはできないため、比較は特に実用的ではありません。
もう一つの比較は、Unity の GameObject と Roblox の Model です。モデルは、Unity で多くの GameObjects の間に親子関係を確立するのと同じように、相互接続されたパーツのコレクションのコンテナとして機能します。モデルの一部を プライマリパート として指定して、ピボットポイントを定義します。モデルはまた、スクリプト、アニメーション、サウンドエフェクト、プロンプト、制約、パーティクルエミッターなどを保持します。
たとえば、Unity の GameObject には ParticleSystem、Physics3D、SpringConstraint、およびスクリプトのコンポーネントがあるかもしれません。Hierarchy ウィンドウには、SpringyFireball という名前の単一の GameObject が表示されます。Inspector ウィンドウには、コンポーネントとプロパティのコレクションが表示されます。
Roblox では、Explorer ウィンドウ内の同等の SpringyFireball モデルは次のように見えるかもしれません:
Model
|- ParticleEmitter
|- MeshPart
|- SpringConstraint
|- ClickDetector
| |- ScriptRoblox の物理デフォルト哲学は、3D モデルを構築するプロセスにも拡張されます。Roblox では、複数のパーツを アセンブリ に溶接することが、迅速に物を構築する優れた方法です。なぜなら、Roblox は溶接されたパーツを単一の剛体として扱うからです。このアプローチは Unity では利用できません。
長さと質量の標準メートル法単位を使用するのではなく、Roblox はスタッドと Roblox 質量単位 (RMU) と呼ばれる概念的な単位を使用します。おおよそのメートル法への変換と使用に関する推奨事項については、Units を参照してください。
位置が重要
Roblox ゲームはデフォルトでマルチプレイヤーであるため、Roblox Studio には特定の動作を持つさまざまなストレージロケーションが含まれています。詳細については、クライアント-サーバーランタイム および オブジェクトの整理 を参照してください。
| Location | Description |
|---|---|
| Workspace | ゲームの3Dワールドを表します。オブジェクトに直接アタッチしてその動作を制御するサーバースクリプトを実行できます。 |
| ReplicatedFirst | 他の何よりも先にクライアントに複製されるオブジェクトを含みます。この場所は、ローディングスクリーンを表示するために必要な最小限のオブジェクトとクライアントスクリプトに最適です。 |
| ReplicatedStorage | クライアントとサーバーの両方に複製されるオブジェクトを含みます。この場所は、Scripts の RunContext が Client のクライアント ModuleScripts およびサーバーとクライアントの両方で使用したい ModuleScripts に最適です。LocalScripts はこの場所から実行されません。 |
| ServerScriptService | サーバースクリプトを含みます。この場所は、ゲームロジックやクラウドストレージなど、サーバー側の機能やオブジェクトにアクセスする必要があるスクリプトに最適です。 |
| ServerStorage | サーバー側のオブジェクトを含みます。この場所は、ゲームに参加したときにクライアントに即座に複製する必要のない大きなオブジェクトに最適です。スクリプトはこの場所から実行されませんが、サーバー側の ModuleScripts をここに保存できます。 |
| StarterPlayer ⟩ StarterCharacterScripts | キャラクターがスポーンするときに実行される LocalScripts を含みます。 |
| StarterPlayer ⟩ StarterPlayerScripts | プレイヤーがゲームに参加するときに実行される LocalScripts を含みます。 |
| StarterGui | クライアントがゲームをロードするときに表示するGUI要素を含みます。LocalScripts はこの場所から実行できます。 |
| StarterPack | 一般的には Tools のみを含みますが、プレイヤーバックパックを設定するための LocalScripts も含むことができます。 |
スクリプティング
Robloxゲームは、3種類の異なるLuauスクリプトをサポートしています。
クライアントスクリプト
これらのスクリプトはクライアント上で実行され、サーバーはその動作を可視化することができません。レガシーの理由から、これらのスクリプトはLocalScriptsまたはScriptsの形式を取り、RunContextの値はClientです。クライアントスクリプトは通常、ReplicatedStorage、StarterPlayerScripts、またはStarterCharacterScriptsに配置されます。
サーバースクリプト
これらのスクリプトはサーバー上で実行され、クライアントはその動作を可視化することができません。サーバースクリプトは、RunContextの値がServerであり、通常はServerScriptServiceに存在し、その内容はクライアントに複製されることはありません。
モジュールスクリプト
これらのスクリプトは再利用可能なコードの単位で、正確に1つの値、通常は関数またはテーブル(または関数のテーブル)を返します。クライアントとサーバースクリプトのコードを重複させるのではなく、モジュールスクリプトを使用して両者間でコードとデータを共有してください。モジュールスクリプトは通常、ReplicatedStorageに存在しますが、クライアントとサーバーの境界の同じ側にあるスクリプト間でコードを共有したい場合は、他の場所に配置することもできます。
Unity には異なるスクリプトタイプの概念がありません。マルチプレイヤーゲームを作成することを選択した場合、Unity はネットワーキングライブラリを使用して、GameObject(およびそのスクリプト)がサーバー専用であるべき時期を示します。
Unity では、エンジンの機能の多くは MonoBehaviour のメソッドを通じて利用可能です。たとえば、レンダーループの前にコードを実行するには、Update() メソッドにコードを追加します。物理衝突イベントを処理するには、OnCollideEnter() メソッドにコードを追加します。
Roblox スクリプトはよりイベント駆動型です。サービスにサブスクライブし、更新をリッスンすることで、同様の機能にアクセスします。
C# と Luau
スクリプティングには、Unity は C# を使用します。Roblox は Luau を使用しており、これは Lua 5.1 に由来するスクリプト言語です。
C# と比較して、Luau は徐々に型付けされ、一般的に冗長性の少ない構文を持っています。ただし、大規模なプロジェクトでは、徐々に型付けを行うことで、C# のような強い型付けの言語が回避するバグのカテゴリが導入される可能性があるため、Roblox スクリプトで 厳密な型チェック を有効にすることを検討してください。
スクリプト言語間の基本的な構文の違いについては、Luau と C# の比較 を参照してください。
Luau コードサンプル
次のLuauコードサンプルは、プレイヤーが釣り竿を装備した後に、ユーザー入力(この場合はEキー)をリスンし、追加の関数を呼び出す方法を示しています:
local ContextActionService = game:GetService("ContextActionService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- ReplicatedStorageから単一の関数を返すモジュールスクリプトを取得
local performSomeAction = require(ReplicatedStorage.performSomeAction)
-- このスクリプトが釣り竿の子であることを前提としています
local fishingPole = script.Parent
local ACTION_CAST = "Cast"
-- キーが押されているか確認し、別の関数を呼び出します
local function castLine(_actionName, inputState, _inputObject)
if inputState == Enum.UserInputState.Begin then
performSomeAction()
end
end
-- プレイヤーが釣り竿を装備しているときだけアクションを有効にする
fishingPole.Equipped:Connect(function()
ContextActionService:BindAction(ACTION_CAST, castLine, true, Enum.KeyCode.E)
end)
-- プレイヤーが釣り竿を非装備にしたときにアクションを無効にする
fishingPole.Unequipped:Connect(function()
ContextActionService:UnbindAction(ACTION_CAST)
end)Roblox スクリプトは、Roblox が多くの組み込みの仮定を持っているため、比較的簡潔です:サーバーに接続された Player と Humanoid キャラクターがあり、Tools を装備できます。これらの仮定は Unity には存在しないため、実装は非常に異なるでしょう。
アセット
Unity と Roblox の両方は、カスタムメッシュとモデルを .fbx 形式でインポートすることをサポートしています。特定のタイプのアセットには、サードパーティのモデリングソフトウェアからの特定の構成やエクスポート設定が必要な場合があります。詳細については、次のページを参照してください:
Unity では、オブジェクトは Project ウィンドウに表示される Assets ディレクトリにインポートされます。Roblox では、アセットは Workspace と Toolbox または Asset Manager にインポートされます。
Roblox では、インポートプロセスを簡素化するためのオープンソースの Blender プラグイン も提供しています。
トランスフォーム
Unityの変換とRobloxのCFramesは、オブジェクトの3D変換を表現する上で類似の目的を果たします:
- 変換とCFramesは、どちらも3D空間におけるオブジェクトの位置と回転を表します。変換にはスケールが含まれますが、RobloxではBasePart.Sizeプロパティが使用されており、これはCFrameの一部ではありません。
- 両者は複雑な変換のための乗算をサポートしており、他の操作のための組み込みメソッドを持っています。
コラボレーション
Unity では、標準のバージョン管理システムや Unity Version Control のような有料サービスを使用してコラボレーションします。
Roblox ファイルはクラウドに保存されているため(コピーをエクスポートすることはできますが)、Roblox Studio は同時編集、グループ管理、権限、スクリプトのドラフト作成などのための組み込みのコラボレーションワークフローを提供します。詳細については、Collaboration を参照してください。
プラグイン
Unity ツールと同様に、Roblox Studio はさまざまな開発プロセスの側面を簡素化したり、追加の制御を提供したりする プラグイン をサポートしています。プラグインは、アセットと同様に Creator Store で入手可能で、多くは無料です。
用語集
| Unity | Roblox | Notes |
|---|---|---|
| Scene | Place | |
| GameObject | Part または Model | 哲学的な違い を参照してください。 |
| Prefab | Package | |
| Transform | CFrame | CFrame にはスケール情報が含まれていません。 Transforms を参照してください。 |
| Hierarchy | Explorer | |
| Inspector | Properties | |
| Scene view | 3D viewport | |
| Game view | 3D viewport | ビューポートは、ゲームをテストするときにゲームプレイビューに移行します。 |
| Project window | Asset Manager または Toolbox | |
| Terrain Inspector | Terrain Editor | |
| Spawn point | SpawnLocation | |
| Console | Output | |
| Asset Store | Creator Store | |
| Overlays | Toolbar | |
| Tool | Plugin |