Unity WAAPI Client

バージョン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 :(");
        }
    }
}
Wwise Unity Integrationに対してTue Dec 4 10:52:20 2018に生成されました。  doxygen 1.6.3