今回はWAAPIのサンプルアプリを通して、WAAPIについて説明します。使うサンプルは簡単なウェブアプリケーションで、1つの可動ポイントでXYパッドの2次元座標に存在する2つのゲームパラメータを同時にコントロールできます。このアプリケーションは現在開いているプロジェクトに接続して、操作可能なゲームパラメータオブジェクトを表示させます。
このサンプルでは、次の機能を確認できます。
- プロジェクトからオブジェクトの取得
- オブジェクトのプロパティ値の設定
- プロパティ値変更の更新
Wwiseプロジェクトの作成
このデモの長所は、どんなWwiseプロジェクトにでも使えることです。今回はまず、楽器のテルミンの実装の、簡単なWwiseプロジェクトを作ります。
新規プロジェクトの作成
テルミン音の作成
Project Explorerを開いて
- 新しい Sound SFX オブジェクトを作成する
- オブジェクト名をThereminとする
- この新しいオブジェクトを選択する
- Contents Editorで、Add Source >>ボタンをクリックする
- Wwise Synth Oneを選択する
- オブジェクトThereminのProperty Editorで、Loopを有効にする
ゲームパラメータをアサインする
- オブジェクトThereminのRTPC タブを開く
- “Volume”と“Pitch”の2つの新しいゲームパラメータを、Voice VolumeとVoice Pitchのプロパティにアサインする
- Voice Pitchのカーブを、下図のように変更する:
以上です。プロジェクトを保存してください!
WwiseでWAAPIを有効にする
WAAPIを使い始める前に、必ずUser PreferencesでWAAPIを有効にしてください:
- メニューでProject > User Preferencesをクリックする
- Enable Wwise Authoring APIをクリックする
- OKをクリックする
- Wwiseを再起動する
WAAPIクライアント
それでは、ウェブアプリケーションの解説です。
Wwiseに接続しながら、アプリケーションで表示される青い点を使って2つのゲームパラメータ値を変更します。一旦接続すると、サンプルアプリがプロジェクトからゲームパラメータのリストを取得します。今回の例で取得されるのは、 Pitch と Volumeの2つのゲームパラメータです。あとは、WwiseでPlayを押してから青い点を動せば、先ほどのテルミンを演奏することができます。
ソースコード
それでは、どのようにWAAPIを応用したのかを説明します。
なお、このアプリケーションの完全なソースコードは、Wwise 2017.1のSDKサンプルに入っています:
SDK/samples/WwiseAuthoringAPI/js/xy-pad.
是非readme.mdファイルを一読して、依存性(dependencies)のインストール方法やサンプルアプリの実行方法などを確認してください。依存性をインストールしないとサンプルは動かないので、これは重要なポイントです。
このアプリケーションのコードの大部分が、js/app.jsにあります。
WAAPIに接続する
WAAPIに接続するのは、簡単です。この例では autobahn.jsが使われ、JavaScriptで完全なWAMPインプリが提供されています。一番大事な要素が、WAAPIに接続するためのURLとなります。WAAPIサーバはWwiseオーサリングアプリケーションに組み込まれているので、接続する前にWwiseが稼働中であることを必ず確認してください。ここでは、ポート番号8080にlocalhostへの接続オブジェクトを作成しました。
ここから、接続します:
接続が確立されると、WAMPは以下の2種類のメカニズムを使ってやり取りします:
- Remote Procedure Call (RPC): 引数を使ってファンクションをリモートで実行して、結果を取得する。
- Subscribe/Publish (Pub/Sub): 特定のトピックに登録して、そのトピックについて何かがパブリッシュされた時に、通知を受領する。
autobahn.js を使ってRPCファンクションをコールするのも、とても簡単です。以下のエレメントを指定する必要があります:
- Uri: RPCファンクションの固有名称
- Args: ファンクションに対する引数で、JSONオブジェクトとして記載。各RPCコールに必要な全ての引数がWwise SDKドキュメンテーションに記載されています。
- Options: ファンクションのオプション。空オブジェクトでも可。
コールファンクションでPromiseオブジェクトが返却されるので、これを使えば、サクセスコールバックを指定して結果を受領したり、エラーコールバックを指定してエラーを受領したりできます。
以下は、典型的なコールの例です:
ゲームパラメータの取得
このサンプルの初期のコールの1つが、プロジェクトのゲームパラメータを全て取得するものです:
リモートでURI ak.wwise.core.object.getをコールして、クエリオブジェクトを引数として扱い、指定されたオプションのオブジェクトのリストを返却します。このシナリオでは、クエリがソースを指定する(タイプが“GameParameter”である全てのオブジェクトの中から)と、全てのゲームパラメータが返却されます。
次にオプションコンポ―ントで、これらのオブジェクトから何を返却させるかを指定します。1回のクエリで情報を充分にキャプチャできます。
プロパティの設定
青い点をユーザーインターフェースで動かすと、RPCのuri ak.wwise.core.object.setPropertyがコールされますが、これは、全てのWwiseオブジェクトの全てのプロパティを変更できるものです。今回のシナリオでは、オブジェクトのID、変更するプロパティ、そして新しい設定値を指定します:
プロパティ変更の通知
Wwise内で直接ゲームパラメータのシミュレーション値を変更すると、XYパッドのアプリケーションが自動的に更新されますが、これはトピック ak.wwise.core.object.propertyChangedにサブスクライブしているためです。青い点は、実際のGame Paremeter値に2方向バインディング(two-way bound)しています。
トピックにサブスクライブするのは簡単で、トピックのURLとサブスクリプションのオプションを提示するだけです。今回の場合は、欲しいオブジェクトとプロパティを指定します。以下のように、コールバックで何を返却させるかを指定することもできます:
まとめ
今回のサンプルで取り上げたWAAPI機能は、氷山のほんの一角です。WAAPIドキュメンテーションに、利用できる全てのファンクションや、それに必要な引数と返される内容などが記載されています。
なお、WAAPIはランゲージやプラットフォームに依存しないので、様々なランゲージで、実質的にどのプラットフォームでも、クライアントをインプリできます。また、コミュニケーションプロトコルのWAMPを採用して、利便性やパフォーマンスを向上させることもできます。文字列だけのHTTP(bare HTTP)もサポートされています。実際、以下のようにコマンドラインにcURLを入れてHTTPでWAAPIを使うこともできます:
curl -H "Content-Type: application/json" -X POST -d "{\"args\":{},\"options\":{},\"uri\":\"ak.wwise.core.getInfo\"}" http://localhost:8090/waapi
宿題
サンプルの変更
同じサンプルを使った演習問題です:
- Play/Stopボタンを追加する(トランスポートの例を参考)。
- XYビューに、グリッドを表示させる。
もっと知るには
javascriptクライアントアプリケーションの実装が、おもしろくてたまらない人もいれば、昔ながらのc++開発者にとっては不安の対象かもしれません。以下の分野について、ウェブでも勉強できます:
- JavaScript、Promise、非同期コード(asynchronous code)。
- Node.js: コマンドラインでJavaScriptを実行、ウェブサーバを実行。
- Typescript: 安全なJavaScriptにするため。
- Javascriptクライアントフレームワーク: React、Angular.js、Vue.js、aureliaなど。
コメント