このページには、経験豊富な Unity 開発者が Roblox を開始するのを助ける情報が含まれています:基本的な方向性、概念的な比較、および 2 つのプラットフォーム間の主要な違い。
方向性を得る
Unity の階層ウィンドウと Roblox Studio の エクスプローラー は、3D シーンで要素を整理するためのメインウィンドウです:
- 両方ともオブジェクトの管理と整理 (例: キャラクターと環境資産) を可能にします。
- 両方とも、オブジェクト間の親子関係のためのツリー構造を使用します。
しかし、階層ウィンドウには事前定義された構造がなく、エクスプローラーウィンドウには厳格な構造があります。エクスプローラーウィンドウをユニティの階層とプロジェクトウィンドウの組み合わせ、ワークスペースフォルダを最も認識できる要素として考えると、役に立つかもしれません。
同様に、Roblox Studio アセットマネージャー と ツールボックス は、Unity プロジェクトウィンドウと重複します。アセットマネージャでは、エクスペリエンス内のすべてのアセットを管理できますが、ツールボックスでは、公開したアセットにアクセスできます。ツールボックスは、Roblox またはコミュニティからのアセットを検索することもできます [Unity アセットストア] のように。
哲学的な違い
Roblox は伝統的なゲームエンジンではなく「シミュレーションエンジン」です。Unity GameObjects と Roblox Parts は、3D 環境でオブジェクトを作成するための基本的なブロックですが、実際には、2つはかなり異なっています:
- 表現 : GameObjects は、Unity のシーン内のすべてのオブジェクトに対する高レベルのコンセプトであり、Roblox の Parts は、木のブロックやプラスチックの球などの物理オブジェクトを表現するために設計されていますが、Unity の基本的なオブジェクトのような抽象的な幾何学ではありません。
- 物理 : Unity で物理シミュレーションを実行するには、Rigidbody や Collider のようなコンポーネントを GameObject に付けます。Roblox では、物理は Parts データタイプに組み込まれています;エンジンは自動的にインタラクションを処理します。
GameObject と Part を作成すると、すぐに違いが見えます。The GameObject には、位置、回転、およびスケール以上のものはありません。Part には、同じ情報があります—プラス素材と色、反射率と透明度、質量と形状など、さらに多くのものがあります。Part を空の GameObject により似たものに変換すると、削除 多くの組み込みプロパティを削除することになります。逆に、GameObject を追加して、Part 、MeshFilter 、MeshRenderer 、および Collider コンポーネントを追加することで、Rigidbody に非常に似た外観を作ることができます。
スクリプトの観点から、 GameObject は Roblox の Instance に最も似ていますが、あなたが Instance のタイプのオブジェクトを作成できない (そして作成できない)ため、比較は特に実用的ではありません。
別の比較は、Unity GameObject と Roblox Model です。モデルは、Unity の多くの GameObjects の間で親子関係を設定するように、同じように集合のインターコネクティングパーツのコンテナとして機能します。モデルのパーツの 1つを、その 主要パーツ として指定して、ピボットポイントを定義します。モデルには、スクリプト、アニメーション、サウンド効果、プロンプト、制約、パーティクルエミッターなどが保存されています。
たとえば、Unity GameObject には、ParticleSystem 、Physics3D 、SpringConstraint 、およびスクリプトが含まれている可能性があります。階層ウィンドウでは、GameObject という名前のシングルを見ますSpringyFireball。インスペクタウィンドウは、コンポーネントとプロパティのコレクションを表示します。
Roblox では、エクスプローラ ウィンドウで同様の SpringyFireball モデルが次のように表示される可能性があります:
Model|- ParticleEmitter|- MeshPart|- SpringConstraint|- ClickDetector| |- Script
Roblox(ロブロックス)blox のデフォルトの物理学の哲学は、3D モデルのビルドプロセスに拡張されます。Roblox では、複数のパーツを組み立てて アセンブリ に結合することは、Roblox が接合部品を単一の剛ボディとして扱うため、物を迅速に作成するのに最適な方法です。このアプローチは、Unity では利用できません。
長さと質量の標準メトリック単位を使用するのではなく、Roblox は studs と Roblox Mass Units (RMUs) という想定の単位を使用します。推定メトリック変換と使用周辺の推奨事項については、ユニット を参照してください。
場所が重要
Roblox の経験はデフォルトでマルチプレイヤーですが、Roblox Studio には、特定の動作を持つ多くの異なるストレージロケーションが含まれています。たとえば、スクリプトは ReplicatedStorage に入れたときに実行するかもしれませんが、StarterPlayerScripts に入れたときには実行しません。詳しくは、クライアント-サーバーランタイム と オブジェクト組織 を参照してください。
場所 | 説明 :--- | :--- ワークスペース | ゲームワールドを表現します。この場所は、オブジェクトに直接付属して動作を制御するサーバースクリプトに最適です。ReplicatedFirst | 他の何よりも先にクライアントに複製するオブジェクトを含みます。この場所は、ロードスクリーンを表示するために必要な絶対最小限のオブジェクトとクライアントスクリプトのセットに最適です。ReplicatedStorage | クライアントとサーバーの両方に複製されるオブジェクトを含みます。この場所は、サーバーとクライアントの両方で使用したい Class.ModuleScript\|ModuleScripts に最適です。Class.LocalScript\|LocalScripts この場所から実行しないが、Class.Script\|Scripts は、Client の実行コンテキストで実行する。ServerScriptService | サーバースクリプトサービス | サーバースクリプトを含むこの場所は、ゲームロジックやクラウドストレージなど、サーバー側の機能やオブジェクトにアクセスする必要があるスクリプトに最適です。ServerStorage | サーバー側のオブジェクトを含みます。この場所は、エクスペリエンスに参加するとすぐにクライアントにレプリケートする必要がない大きなオブジェクトに最適です。スクリプトはこの場所から実行しませんが、サーバー側の Class.ModuleScript\|ModuleScripts をここに保存できます。StarterPlayer.StarterCharacterScripts | キャラクターがスポーンするときに実行する Class.LocalScript\|LocalScripts が含まれています。StarterPlayer.StarterPlayerScripts | プレイヤーがエクスペリエンスに参加すると実行される一般的な目的の Class.LocalScript\|LocalScripts が含まれています。StarterGui | ゲームをロードするとクライアントが表示する GUI 要素を含みます。Class.LocalScript\|LocalScripts この場所から走ることができます。この場所は、ボタン、メニュー、ポップアップなど、ゲームのユーザーインターフェイスを変更するスクリプトに最適です。スターターパック | 一般的には Class.Tool\|Tools のみを含みますが、プレイヤーバックパックの設定に Class.LocalScript\|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 では、オブジェクトは Assets ディレクトリにインポートされ、プロジェクトウィンドウで表示されます。Roblox では、アセットはワークスペースおよび ツールボックス または インベントリ セクションの アセットマネージャ にインポートされます。
Roblox はまた、オープンソースの Blender プラグイン を提供して、インポートプロセスをスムーズにします。
変形
props.engine の変換と Roblox の CFrames は、オブジェクトの 3D 変形を表現する際に、同様の目的を果たします:
- 両方の変換と CFrames は、3D 空間におけるオブジェクトの位置と回転を表します。変換にはスケールが含まれますが、Roblox は BasePart.Size の一部ではない CFrame プロパティを使用します。
- 両方とも、複雑な変換に対する倍数 (つまり、構成) をサポートし、他の操作に内蔵された方法を持っています。
共同作業
Unity では、標準のバージョン管理システムや Unity バージョン管理のような有料サービスと協力します。
Roblox ファイルはクラウド上でライブです (複製をエクスポートできますが) ので、Roblox Studio は同時編集、グループ管理、権限、スクリプト作成などの内蔵コラボレーションワークフローを提供します。参照してください コラボレーション。
プラグイン
Unity ツールと同様、Roblox Studio は プラグイン をサポートしており、開発プロセスの各側面を簡素化したり、追加の制御を提供したりできます。プラグインはクリエイターストアで利用可能で、アセットと同様、無料のものが多くあります。
用語集
| Unity | Roblox | ノート | | :--- | :--- | :--- | | シーン | 場所 | | | ゲームオブジェクト | Part または Model | 見る 哲学的な違い .| | Prefab | パッケージ | | | Transform | CFrame | CFrame スケール情報は含まれていません。参照してください 変換。| | 階層ウィンドウ | エクスプローラーウィンドウ | | | インスペクター | プロパティウィンドウ | | シーンビュー | ビューポート | | ゲームビュー | ビューポート | ゲームビューがテストされると、ビューポートはゲームプレイビューに移行します。| | プロジェクトウィンドウ | アセットマネージャー または ツールボックス | | | 地形インスペクター | 地形エディタ | | | スポーンポイント | SpawnLocation | | | コンソール | 出力 | | | アセットストア | クリエイターストア | | | オーバーレイ | メニューバー | | | ツール | プラグイン | |