チュートリアル
WebRTC パッケージの基本的な利用方法について説明します。
ネームスペースの追加
ネームスペースは Unity.WebRTC
を使用します。
using UnityEngine;
using Unity.WebRTC;
初期化
WebRTC.Initialize
メソッドを呼び出して初期化を行います。
public class MyPlayerScript : MonoBehaviour
{
private void Awake()
{
// WebRTC 初期化
WebRTC.Initialize();
}
}
ローカルピアの作成
ローカルピアを作成し RTCDataChannel
インスタンスを取得します。RTCDataChannel
はバイナリデータの通信が可能です。OnOpen
、OnClose
にそれぞれコールバックを登録することで、RTCDataChannel
の利用開始時と終了時に処理を実行できます。また、メッセージ受信時の処理を行うには OnMessage
にコールバックを登録します。
// ローカルピアの作成。
var localConnection = new RTCPeerConnection();
var sendChannel = localConnection.CreateDataChannel("sendChannel");
channel.OnOpen = handleSendChannelStatusChange;
channel.OnClose = handleSendChannelStatusChange;
リモートピアの作成
リモートピアを作成して OnDataChannel
にコールバックを設定します。
// リモートピアの作成
var remoteConnection = new RTCPeerConnection();
remoteConnection.OnDataChannel = ReceiveChannelCallback;
通信経路候補の登録
ICE (Interactive Connectivity Establishment) の交換はピア間の接続確立に必要です。ピアの通信経路の候補が発見された時点で OnIceCandidate
が呼び出されます。双方のピアが AddIceCandidate
メソッドを呼び出して、通信経路候補の登録を行います。
localConnection.OnIceCandidate = e =>
{
!string.IsNullOrEmpty(e.candidate) || remoteConnection.AddIceCandidate(e);
}
remoteConnection.OnIceCandidate = e =>
{
!string.IsNullOrEmpty(e.candidate) || localConnection.AddIceCandidate(e);
}
シグナリング処理
SDP の交換をピア間で行います。CreateOffer
を呼び出して Offer SDP を生成します。Offer SDP を取得したら、ローカルピアとリモートピアの双方が SDP を設定します。SDP 交換の際に SetLocalDescription
と SetRemoteDescription
を混同して使用しないように注意してください。
Offer SDP を設定したら, CreateAnswer
を呼び出して Answer SDP を生成します。Offer SDP と同様に、ローカルピアとリモートピアの双方で Answer SDP を登録します。
var op1 = localConnection.CreateOffer();
yield return op1;
var op2 = localConnection.SetLocalDescription(ref op1.desc);
yield return op2;
var op3 = remoteConnection.SetRemoteDescription(ref op1.desc);
yield return op3;
var op4 = remoteConnection.CreateAnswer();
yield return op4;
var op5 = remoteConnection.setLocalDescription(op4.desc);
yield return op5;
var op6 = localConnection.setRemoteDescription(op4.desc);
yield return op6;
ICE コネクションの状態の監視
SDP 交換の際に ICE の交換が行われます。ICE コネクションの状態を確認するには、 OnIceConnectionChange
コールバックを利用します。
localConnection.OnIceConnectionChange = state => {
Debug.Log(state);
}
DataChannel の接続
ICE の交換が終了すると OnDataChannel
が呼び出され RTCDataChannel
インスタンスが生成されます。
OnMessage
にコールバックを設定して、メッセージ受信時の処理を記述します。
RTCDataChannel receiveChannel;
void ReceiveChannelCallback(RTCDataChannel channel)
{
receiveChannel = channel;
receiveChannel.OnMessage = HandleReceiveMessage;
}
メッセージの送信
ピア双方の RTCDataChannel
がオープンしたら、メッセージの通信が可能になります。string
や byte[]
などの型のデータを送信できます。
void SendMessage(string message)
{
sendChannel.Send(message);
}
void SendBinary(byte[] bytes)
{
sendChannel.Send(bytes);
}
メッセージの受信
メッセージを受信したとき、OnMessage
に登録したコールバックが実行されます。byte[]
型のメッセージとして受け取るので、テキストとして扱う際には以下のように処理します。
void HandleReceiveMessage(byte[] bytes)
{
var message = System.Text.Encoding.UTF8.GetString(bytes);
Debug.Log(message);
}
終了処理
終了時には RTCDataChannel
と RTCPeerConnection
の Close
メソッドを呼び出す必要があります。オブジェクトを破棄した最後に WebRTC.Dispose
を呼び出します。
private void OnDestroy()
{
sendChannel.Close();
receiveChannel.Close();
localConnection.Close();
remoteConnection.Close();
WebRTC.Dispose();
}
次のステップ
このパッケージはビデオ/オーディオのストリーミングに関するサンプルを提供しています。このページ を参考に試してみてください。