Unity 開発者向け Wonderland Engine
このページでは、UnityからWonderland Engineへのスクリプティングのマッピングを提供し、ソリューション構築のための違いをリストアップします。
ビデオ形式を好む場合は、YouTube チャンネルの切り替えガイドをチェックしてみてください。
スクリプティング
Wonderland Engine はブラウザで動作し、JavaScript ランタイムがすでに組み込まれています。これにより、追加のダウンロードが不要であり、Web エンジンのスクリプト言語として最適です。
スクリプトを作成するには、Wonderland Editor のアセットブラウザで右クリックし、新しい JavaScript / TypeScript コンポーネントを作成します。開始のための基本的なテンプレートが含まれています。
JS/TS に適した IDE は Visual Studio Code です。
Wonderland Engine の API が Unity のものとどのように違うのかについては、コードセクションをご覧ください。
TypeScript と JavaScript
TypeScript は JavaScript に静的型チェックを追加し、C# に近づけます。これにより、IDE のコード補完が大幅に向上します。Unity に慣れた開発者には TypeScript を推奨します。
Wonderland Engine は tsconfig.json
のセットアップを自動で行います。アセットブラウザから TypeScript コンポーネントを作成するだけです。
パッケージング
Unity のワークフローでは通常、エディタ内のプレビューを使用しますが、Wonderland Engine では最終パッケージングプロセスが非常に速いため(1 秒未満)、ブラウザ内の最終アプリをプレビューとして使用できます。
リパッケージするたびにページがブラウザでリロードされ、Views > Preferences
で保存後に自動的に実行するように設定できます。
アプリケーションをデプロイするには、プロジェクトの deploy
フォルダーの内容を Web サーバーにアップロードするだけです。また、Views > Plugins
にてアクティブ化できる “Wonderland Cloud Publish” プラグインを使用してアップロードすることも可能です。
複数のシーン
Wonderland Engine では、multiple project files(.wlp) で作成された複数のシーン間の切り替えが可能です。シーン切り替えチュートリアルを参照してください。
さらに、ランタイム中にシーンの一部をストリームすることができます。Streaming .bin Files チュートリアルもご覧ください。
プレハブ
Wonderland Engine にはプレハブに相当するものがまだありません。代わりに、シーンでプロトタイプを設定し、object.clone()
でその階層とすべてのコンポーネントを複製します。
または、プレハブオブジェクトを別のシーンに移動し、ランタイム中に engine.loadPrefab(…) を使用してロードし、インスタンス化します。
アセットのインポート
Wonderland Engine では、シーンファイルがインポートされると(アセットブラウザからドラッグ&ドロップして Scene View や Scene Outline に、または画像ファイルをマテリアルのテクスチャスロットにドラッグして)、変更があればリンクされて監視されます。シーンファイルで見つかったリソースはプロジェクト内で利用可能になり、「Resources」ビューで表示できます。
アセットブラウザからファイルがインポートされるまで、そのファイルはプロジェクトで使用できません。「Asset Browser」は、Unity のものとは異なるファイルブラウザと考えられます。
アセットの最適化
インポートされたアセットはさらに最適化できます:
- メッシュは頂点数を削減するために自動的にデシメートされます
- メッシュは均一にスケーリングできます
- 画像は自動的に圧縮されます
- 画像は縮小が可能です
これらの設定は「Resources」ビューで見つけられます。
ディレクトリ
deploy
にはパッケージングの最終結果が含まれています。static
にはそのままデプロイされるファイルが含まれています。cache
はキャッシュされたアセットコンパイル結果を含みます。通常削除しても安全ですが、再生成に時間を要します。
これらの設定は「Resources」ビューで見つけられます。
アニメーション
アニメーションは animation
コンポーネントタイプを通じて再生されます。スキンアニメーションは retarget
チェックボックスを使用してターゲットスキンの骨/ジョイントの1つにコンポーネントが添付されている場合にリターゲットされます。
ブレンディング、キーフレーム編集やキーフレームイベントはまだサポートされていません。
物理演算
リジッドボディは physx
コンポーネントタイプを通じて作成されます。シーンはエディタで Debug > Simulate Physics (Alt + S)
を使用してシミュレーションできます。
ネットワーキング
ピアツーピアネットワーキングは、コミュニティサポートによる Wonderland Engine PeerJS Networking で実現可能です。
WebRTC を使用しており、一定の規模までデフォルトの PeerJS サーバーインフラを利用できます。
また、コミュニティはマルチユーザー用に Colyseus を統合しています。
UI
ユーザーインターフェースは cursor、cursor-target、「collider」コンポーネントを使用して手動でセットアップされます。
以下の HTML5 Canvas ベースの2D UIはコミュニティによって維持されています:Lazy Widgets project。
用語
用語 | Unity | Wonderland Engine |
---|---|---|
プロジェクト | プロジェクトファイル。 | 複数のプロジェクトファイルが単一のプロジェクトルートディレクトリを共有する可能性があります。 |
インスペクタービュー | プロパティビュー |
コード
以下に、一般的なコードパターンと、それに対応する Wonderland Engine の例を示します。
カスタムビヘイビア
Wonderland Engine では「Component」を使用します。「MonoBehaviour」の代わりに、Component クラスを拡張します:
Unity | Wonderland Engine (JavaScript) | Wonderland Engine (TypeScript) |
|
|
|
Unity と同様に、いくつかの UI 要素はパラメータのために生成されます。
ゲームオブジェクトにあるコンポーネントを取得
Unity | Wonderland Engine |
|
オブジェクトにコンポーネントを追加
Unity | Wonderland Engine |
子オブジェクトを取得
親オブジェクトを取得
マテリアルプロパティを設定
色やテクスチャなど様々なマテリアルプロパティを設定します。
Unity | Wonderland Engine |
数学
JavaScript は operator overloading をサポートしていないため、数学コードに対して別のアプローチをとります。
多くの場合、Wonderland Engine の Object3D API には変換を操作するための多くの関数があり、これらは WebAssembly で効率的に実装されています。
ガベージコレクション
JavaScript はガベージコレクションを使用する言語であり、自動ガベージコレクションによる予期しない中断が発生する可能性があります。リストやベクトル、または簡単に収集されないオブジェクトをメモリに追加することは避けるのがベストプラクティスです。
カスタムコンポーネントのコンストラクタまたはボディ内で、一時的なベクトルやクォータニオンを作成し再利用するか、慎重に使用する場合は、コンポーネントのモジュールスコープ内に置くことをお勧めします(クラスの上)。 [0, 1, 0]
のような定数ベクトルは、スコープ内に const AxisY = [0, 1, 0]
として宣言するのが理想的です。
数学ライブラリ
JavaScript/TypeScript 向けの性能とガベージコレクションに配慮した数学ライブラリ glMatrix の使用をお勧めします。このライブラリは、デフォルトテンプレートとデフォルトコンポーネントにすでにインストールされているため、自分でインストールする必要はありません。
glMatrix
が計算するベクトルやクォータニオンは、新たに割り当てられたベクトルを返すのではなく、結果をどこに書き込むかを最初のパラメータとして指定します。プリミティブを返す関数は通常通り結果を返します。
glMatrix 数学ライブラリの完全なドキュメントはこちらを参照してください。
Unity | Wonderland Engine |
JavaScript と C# の比較
C# から移行してくる際の顕著な違いは以下の通りです:
- メンバー変数にアクセスする際には常に
this.
をプレフィックスに追加します。 var
は「グローバル」を作成し、現在のスコープに制限されません。最善の方法はlet
またはconst
を使用してスコープされた変数を作成することです。