DocumentationユーザーガイドUnity SDK β版クイックスタート(Windows)

🚀 クイックスタート

SkyWay のメディア通信を体験できるシンプルなサンプルアプリケーションを作成します。

ここでは、デバイスのマイク音源とテクスチャを SFU サーバーに送信し、それぞれを自分が受信して音声の再生と映像の描画するというアプリケーションを作ります。

開発環境

  • Unity: 2022.3.2f1
  • Windows 10以降(x64)

アプリケーション ID とシークレットキーを取得する

※SkyWay への登録がまだの方はこちらから

SkyWay コンソールへログインし、以下の 3 つを行います。

  1. 「アプリケーションを作成」ボタンを押す Peer
  2. アプリケーション名を入力して作成ボタンを押す
  3. アプリケーション一覧からアプリケーション ID とシークレットキーをコピーする(後の手順で利用するため、控えておいてください)。

SkyWay Auth Token を作成する

SkyWay Auth Token とは、SkyWay を利用するための JWT 形式のトークンです。

トークンごとに権限を細かく設定することでき、例えば Channel ごとの入室を特定ユーザーに制限する、といったことができます。

SkyWay Auth Token はサーバーサイドでの生成になるので、Unity SDK にはトークンの生成機能はございません。ここでは JavaScript SDK で配布している Token ライブラリを利用し、サーバーから認可された後トークンを取得してきたとしましょう。

npm がインストールされた環境でライブラリをインストールします。

$ mkdir skyway_token && cd skyway_token $ npm i @skyway-sdk/token

次に token.js を作成します。

$ touch token.js

ファイルを開き以下のコードをペーストします。

先ほど作成したアプリケーション ID とシークレットキーをスコープの app.idencode メソッドの引数にペーストしてください。

const { SkyWayAuthToken, uuidV4 } = require('@skyway-sdk/token'); const token = new SkyWayAuthToken({ jti: uuidV4(), iat: Math.floor(Date.now() / 1000), exp: Math.floor(Date.now() / 1000) + 60 * 60 * 24, scope: { app: { id: 'ここにアプリケーションIDをペーストしてください', turn: true, actions: ['read'], channels: [ { id: '*', name: '*', actions: ['write'], members: [ { id: '*', name: '*', actions: ['write'], publication: { actions: ['write'], }, subscription: { actions: ['write'], }, }, ], sfuBots: [ { actions: ['write'], forwardings: [ { actions: ['write'], }, ], }, ], }, ], }, }, }).encode('ここにシークレットキーをペーストしてください'); console.log(token);

node で token.js を実行すると SkyWay Auth Token が生成されます。このトークンは後程使うのでコピーしてください。

// こちらの出力結果はサンプルのため、コピーして用いないようにしてください。 $ node token.js eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIxOTA1MzU5Yi0xOGY3LTRhOWMtYmU4Zi1kMTgxMTQ0OTY1MjMiLCJpYXQiOjE2NzQxOTg3MDQsImV4cCI6MTY3NDI4NTEwNCwic2NvcGUiOnsiYXBwIjp7ImlkIjoi44GT44GT44Gr44Ki44OX44Oq44Kx44O844K344On44OzSUTjgpLjg5rjg7zjgrnjg4jjgZfjgabjgY_jgaDjgZXjgYQiLCJ0dXJuIjp0cnVlLCJhY3Rpb25zIjpbInJlYWQiXSwiY2hhbm5lbHMiOlt7ImlkIjoiKiIsIm5hbWUiOiIqIiwiYWN0aW9ucyI6WyJ3cml0ZSJdLCJtZW1iZXJzIjpbeyJpZCI6IioiLCJuYW1lIjoiKiIsImFjdGlvbnMiOlsid3JpdGUiXSwicHVibGljYXRpb24iOnsiYWN0aW9ucyI6WyJ3cml0ZSJdfSwic3Vic2NyaXB0aW9uIjp7ImFjdGlvbnMiOlsid3JpdGUiXX19XSwic2Z1Qm90cyI6W3siYWN0aW9ucyI6WyJ3cml0ZSJdLCJmb3J3YXJkaW5ncyI6W3siYWN0aW9ucyI6WyJ3cml0ZSJdfV19XX1dfX19.qmLpoOjou0S5JwxAiaBvH0KaGzZqN4-0t1xq708_b3M

なお、上記の例ではトークンの有効期限は生成から1日間です。

UnityProjectを作成する

新規で UnityProject を作成してください。

依存ライブラリをインストールする

  1. 上部ツールバーの Window から Package Manager を開きます。
  2. + ボタンをクリックし、Add package from git URL をクリックします。
  3. 以下のUniTaskの URL を入力します。 https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask#2.4.1
  4. Add をクリックします。

Install UniTask

以上で、依存ライブラリの設定は完了です。

unitypackageをダウンロードする

  1. SkyWay Unity SDKにアクセスします。
  2. SkyWayRoom.unitypackage をダウンロードします。

以上でダウンロードが完了します。

プロジェクトにSkyWay Unity SDKをインポートする

  1. プロジェクトの Assets をクリックします。
  2. ポップアップメニューから import package をクリックし、Custom Package をクリックします。
  3. ダウンロードした SkyWayRoom.unitypackage を選択し、Import をクリックします。

以上でセットアップは完了です。

オブジェクトを配置する

音声出力用のオブジェクトの配置

受信した音声を再生する Audio Source を配置します。

  1. Unity Scene ペインで右クリックをしてポップアップメニューを開き、Audio->Audio Source を選択します。

Scriptをアタッチする

  1. Scene ペインから Main Camera を選択した状態で、Inspector の最下層の Add Component をクリックします。
  2. New scripts をクリックし、任意の名前を入力します。
  3. Create and Add をクリックすると、Script が生成されます。
  4. Assets フォルダで、ポップアップメニューを開き、Create->Assembly Definition Reference を選択します。
  5. Inspector の Assembly DefinitionSkyWayRoom を選択します。

Assembly Definition

必要なメンバー変数の宣言とオブジェクトのアタッチを行う

using Com.Ntt.SkyWay.Coreusing Com.Ntt.SkyWay.Room で SkyWay をインポートし、前節で作成した Script に必要なメンバー変数を宣言します。

using UnityEngine; using UnityEngine.UI; using Com.Ntt.SkyWay.Core; using Com.Ntt.SkyWay.Room; class SampleScript : MonoBehaviour { // 受信した音声を再生するAudio Source public AudioSource remoteOutputAudioSource; // 以下略

次に Unity の Scene に戻り、Main Camera を選択します。

Inspector 最下層の Script コンポーネントに移動し、作成した AudioSource を remoteOutputAudioSource にアタッチします。

attachObject

SkyWayの利用を開始する

ここでは、簡易的に Start に SkyWay のロジックを記述していきます。

SWContext.Setup(SWContextOptions options, Action<string>? onErrorHandler) で SkyWay のセットアップを行います。先ほど生成した JWT を引数に入れてください。 このメソッドを await するため、 Start() メソッドを async にしてください。

async void Start() { var authToken = "トークンを入力"; // SkyWayのセットアップ await SWContext.Setup(this, authToken); }

Roomを作成する

SkyWay のセットアップが完了したら Room を作成します。 SWSFURoom.Create(string? name = null, string? metadata = null) で Room を作成できます。

var sfuRoom = await SWSFURoom.Create();

Roomへ参加する

SWSFURoom.Join(SWRoomMemberOptions? memberInit) でルームに参加し、メンバーを作成します。

var memberInit = new SWRoomMemberOptions { name = "Alice" // Memberに名前をつけることができます。 }; var localMember = await sfuRoom.Join(memberInit);

音声を送受信する

マイク音源のAudioStreamの作成とRoomへのPublish

マイクを音声入力として Stream を作成します。

Publish をするための LocalStream を作成するためには、Source が必要です。

SWAudioSource のインスタンスを作成し、CreateStream() で LocalStream を作成します。

LocalSFUMember.Publish(SWLocalStream localStream, SWRoomPublicationOptions? options) で Room に Publish します。

// AudioStreamの作成 var audioSource = new SWAudioSource(); var localAudiostream = audioSource.CreateStream(); // audioをPublishします var audioPublication = await localMember.Publish(localAudiostream, null);

AudioStreamのSubscribe

LocalSFUMember.Subscribe(SWRoomPublication publication, SWRoomSubscriptionOptions? options = null) を実行し、Subscription を受け取ります。 その後、Subscription から SWRemoteAudioStream を入手し、出力用の Audio Source と紐づけます。

// audioをSubscribeします var audioSubscription = await localMember.Subscribe(audioPublication); // 受信した音声をAudio Sourceから出力します var remoteAudioStream = audioSubscription.Stream as SWRemoteAudioStream; remoteAudioStream.SetAudioSource(remoteOutputAudioSource);

実行し、受信した音声がデバイスのスピーカーから出力されれば完成です。

QuickStartの完成コード

using UnityEngine; using UnityEngine.UI; using Com.Ntt.SkyWay.Core; using Com.Ntt.SkyWay.Room; public class SampleScript : MonoBehaviour { // 受信した音声を再生するAudio Source public AudioSource remoteOutputAudioSource; async void Start() { var authToken = "トークンを入力してください。"; // SkyWayのセットアップ await SWContext.Setup(authToken); var sfuRoom = await SWSFURoom.Create(); var memberInit = new SWRoomMemberOptions { name = "Alice" // Memberに名前をつけることができます。 }; var localMember = await sfuRoom.Join(memberInit); // AudioStreamの作成 var audioSource = new SWAudioSource(); var localAudiostream = audioSource.CreateStream(); // audioをPublishします var audioPublication = await localMember.Publish(localAudiostream, null); // audioをSubscribeします var audioSubscription = await localMember.Subscribe(audioPublication); // 受信した音声をAudio Sourceから出力します var remoteAudioStream = audioSubscription.Stream as SWRemoteAudioStream; remoteAudioStream.SetAudioSource(remoteOutputAudioSource); } }