バージョン2018.1より、Wwise Authoring API (WAAPI) のサポートをUnityインテグレーションに組み込みました(詳しくは Wwise Authoring API (WAAPI)を使用する を参照)。
AkWaapiClient というクラスが提供され、WAAPIに接続しWAAPIコールを開始するために使います。以下のラインで、WAAPIにport 8080のlocalhostを使い接続できます。
AkWaapiClient.Connect("127.0.0.1", 8080);
WAAPIコールを出しレスポンスを受領するには、JSON引数を構築しパースする必要があります。Unity JsonUtility クラスで、C#クラスとJSON文字列の間の翻訳が簡単にできます。以下のクラスが、JSON文字列をクラスから作成したり、その逆を行ったりするための機能を提供します。
public class WaapiJsonClassBase<T> { public override string ToString() { return JsonUtility.ToJson(this); } public static implicit operator string(WaapiJsonClassBase<T> obj) { return obj.ToString(); } public static T Create(string FromJson) { return JsonUtility.FromJson<T>(FromJson); } }
次にこのクラスを拡張すれば、特定のWAAPIスキーマ用にC#ラッパーを提供できます。例えば、以下のクラスを使い、 ak.wwise.core.object.get へのコールのためのargとoptionのJSON文字列を構築できます(詳細は ak.wwise.core.object.get を参照)。
[System.Serializable] public class ObjectGetArgs : WaapiJsonClassBase<ObjectGetArgs> { [System.Serializable] public class From { public string[] id; } public From from = new From(); } [System.Serializable] public class CallOptions : WaapiJsonClassBase<CallOptions> { public string[] @return; }
次に、以下のクラスを使い、結果をパースできます。
[System.Serializable] public class CallReturn : WaapiJsonClassBase<CallReturn> { [System.Serializable] public class ReturnContents { public string name; public string type; public string path; } public ReturnContents[] @return; }
以下のコードを見ると、これらの例や、ほかの似たクラスを使い、WAAPに接続するシンプルなスクリプトを作成し、Wwiseでオブジェクトが作成されたときのためのコールバックを登録する方法が分かります。Wwiseをインテグレートした既存のUnityプロジェクトにこのコードを追加すると、Editorにメニューオプションが追加されるので、そこでWAAPIとの接続をテストできます。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class WaapiJsonClassBase<T> { public override string ToString() { return JsonUtility.ToJson(this); } public static implicit operator string(WaapiJsonClassBase<T> obj) { return obj.ToString(); } public static T Create(string FromJson) { return JsonUtility.FromJson<T>(FromJson); } } [System.Serializable] public class ProjectInfo : WaapiJsonClassBase<ProjectInfo> { [System.Serializable] public class ProjectInfoDirectories { public string authoring; public string bin; public string help; public string install; public string log; public string user; } [System.Serializable] public class VersionInfo { public int build; public string displayName; public int major; public int minor; public string nickname; public int schema; public int year; } public int apiVersion; public string branch; public string configuration; public string copyright; public ProjectInfoDirectories directories; public string displayName; public bool isCommandLine; public string platform; public int processId; public string processPath; public VersionInfo version; } [System.Serializable] public class ObjectCreatedJsonObject : WaapiJsonClassBase<ObjectCreatedJsonObject> { [System.Serializable] public class subObject { public string id; } public subObject @object; } [System.Serializable] public class ObjectGetArgs : WaapiJsonClassBase<ObjectGetArgs> { [System.Serializable] public class From { public string[] id; } public From from = new From(); } [System.Serializable] public class CallOptions : WaapiJsonClassBase<CallOptions> { public string[] @return; } [System.Serializable] public class CallReturn : WaapiJsonClassBase<CallReturn> { [System.Serializable] public class ReturnContents { public string name; public string type; public string path; } public ReturnContents[] @return; } [System.Serializable] public class WaapiTest : MonoBehaviour { public static void OnObjectCreated(ulong subID, string Json) { ObjectCreatedJsonObject CreatedObject = ObjectCreatedJsonObject.Create(Json); if(CreatedObject != null) { string Result; var Args = new ObjectGetArgs { from = new ObjectGetArgs.From { id = new[] { CreatedObject.@object.id } } }; var Options = new CallOptions { @return = new[]{ "name", "type", "path" } }; AkWaapiClient.Call("ak.wwise.core.object.get", Args, Options, out Result); var ReturnedObject = CallReturn.Create(Result); Debug.Log("New object of type " + ReturnedObject.@return[0].type + " named " + ReturnedObject.@return[0].name + " with ID " + CreatedObject.@object.id + " created at path " + ReturnedObject.@return[0].path); } } [MenuItem("WWISE/TEST WAAPI")] public static void WaapiClientTest() { if (AkWaapiClient.Connect("127.0.0.1", 8080)) { Debug.Log("Connect Success!"); string WaapiResult = string.Empty; bool res = AkWaapiClient.Call("ak.wwise.core.getInfo", "{}", "{}", out WaapiResult); if (res) { var projectInfo = ProjectInfo.Create(WaapiResult); Debug.Log(projectInfo); } else { Debug.Log("Call failed :("); } var Options = new CallOptions { @return = new[] { "id" } }; ulong subId = 0; res = AkWaapiClient.Subscribe("ak.wwise.core.object.created", Options, OnObjectCreated, out subId, out WaapiResult); if (res) { Debug.Log("Subscribe success!" + WaapiResult); } else { Debug.Log("Subscribe failed :("); } } else { Debug.Log("Connect fail :("); } } }
1.6.3