私事ではありますが、このたび受肉しました。
このUnityで表示しているキャラクターを、普段趣味でやっているTwitchでの動画配信でインタラクティブに動かしたいなぁと思い、調べてみました!(いかがでしたか構文)
TwitchLib.Unityを導入する
Twitch上で起きた様々なイベントをプログラムで検知できる、TwitchLibライブラリに、TwitchLib.UnityというUnity向け実装があります。
これを導入することで、比較的簡単にUnity内でもTwitchのイベントを検知できるようになります。
導入方法については、readmeで紹介されているgoogle docsの記事通りにやれば基本的には問題ないのですが、docsのページ翻訳が上手く動かなくてちょっと読みづらかったり、記事はchatbotの作成向けの内容で少しやりたいことが違うので、この記事でも順を追って説明したいと思います。
思い出しながらの内容で間違っている可能性がありますので、もし上手く行かなかったら上記のgoogle docs記事を参照してみてください。
1.TwitchLib.Unityのダウンロードと配置
githubのreleasesページからダウンロードして解凍します。
解凍してできたTwitchLib.UnityフォルダをUnityプロジェクト内のAssets/Pluginsにフォルダごと配置します。
2.TwitchのOAuthトークンを取得する
TwitchAPIはOAuth2を採用しているので、トークンの取得が必要です。
取得方法は色々あるので知識がある方はその方法を使うとよいと思いますが、ここではTwitch Token Generatorを使用する方法を説明します。
※ 自分もあまり詳しくないのですが、OAuthトークンは使用日数期限があったはずなので、期限が過ぎたらトークンを再取得する必要があると思います。それを考えると、プログラム上からトークンを取得する仕組みを作っておいたほうが良いと思います。ですが、今回は話が複雑になりすぎるのでジェネレーターから取得する方法でいきます。
まずページを開いて表示されるダイアログで、”Custom Scope Token”を選択します。
トークンのスコープを設定します。トークンに対して、APIにアクセスできる権限をどこまで与えるか設定する感じだと認識してます。
ここで与える権限は、自分が実現したい機能に合わせて設定することが望ましいです。どの権限を設定する必要があるか厳密に知りたい方はAPIページを見てください。
今回は、
- ビッツの取得
- チャンネルのサブスクライブ
- カスタム報酬(チャンネルポイント)の使用
を目的として、以下の権限を設定します。
- bits:read
- channel:read:subscriptions
- channel:read:redemptions
上手く行かなかったら権限を増やしたり試してみてください。
Generate Token!をクリック
Twitchの権限承認画面が出るので承認。
その後表示されるACCESS TOKENをコピー。
それ以外の2つもメモしておいたほうが良いと思いますが、今回の用途ではアクセストークンのみ必要でした。
3.Unity内にアクセストークンを保存
UnityスクリプトでSecret.csスタティッククラスを作り、そこにコピーしたアクセストークンを記入します。
自分しか使わないプログラムならこれでいいかもしれませんが、不特定多数に公開する場合はプログラム内にトークンを埋め込まない形にする必要があると思います。
public static class Secrets
{
public const string ACCESS_TOKEN = "コピーしたアクセストークンを貼り付け";
}
4.チャンネルIDを確認する
後述するプログラムで使用する、チャンネルIDを確認します。
このチャンネルIDは、自分のtwitchチャンネルのユーザー名ではなく、twitchの内部で一意に付与される固有のID(全部数字のヤツ)のことです。
APIからユーザー情報を取得してIDを確認する方法がおそらく一般的なのですが、色々と大変そうなので、ChromeエクステンションのTwitch Username and User ID Translatorを使ってチャンネルIDを確認します。
この数字の列を後で使います。
5.イベントの受信プログラムを書く
TwitchLibにはいろいろな機能があるようですが、イベント受信については、TwitchLib.PubSubの機能を使用します。
プログラムの内容については、TwitchLibのExampleリポジトリを参考にしてます。
以下のスクリプトは、Twitchのサブスク、ビッツ、カスタム報酬の交換が行われた時にコンソールにログを表示する例です。
(実際に動作させるときはチャンネルIDの入力をお忘れなく)
using System;
using TwitchLib.PubSub.Events;
using UnityEngine;
using TwitchLib.Unity;
public class TwitchPubSubReceiver : MonoBehaviour
{
private PubSub _pubSub;
private string _channelId = "ここにチャンネルIDを入力";
void Start()
{
_pubSub = new PubSub();
_pubSub.OnListenResponse += OnListenResponse;
_pubSub.OnPubSubServiceConnected += OnPubSubServiceConnected;
_pubSub.OnPubSubServiceClosed += OnPubSubServiceClosed;
_pubSub.OnPubSubServiceError += OnPubSubServiceError;
_pubSub.Connect();
}
#region Pubsub events
private void OnPubSubServiceError(object sender, OnPubSubServiceErrorArgs e)
{
Debug.Log($"{e.Exception.Message}");
}
private void OnPubSubServiceClosed(object sender, EventArgs e)
{
Debug.Log($"Connection closed to pubsub server");
}
private void OnPubSubServiceConnected(object sender, EventArgs e)
{
Debug.Log("pubsub service connected");
ListenToBits(_channelId);
ListenToRewards(_channelId);
ListenToSubscriptions(_channelId);
_pubSub.SendTopics(Secrets.ACCESS_TOKEN);
}
private void OnListenResponse(object sender, OnListenResponseArgs e)
{
if (!e.Successful)
{
Debug.Log($"Failed to listen! Response{e.Response}");
}
}
#endregion
#region Bits Events
private void ListenToBits(string channelId)
{
_pubSub.OnBitsReceived += PubSub_OnBitsReceived;
_pubSub.ListenToBitsEvents(channelId);
}
private void PubSub_OnBitsReceived(object sender, OnBitsReceivedArgs e)
{
Debug.Log($"{e.Username} trowed {e.TotalBitsUsed} bits");
}
#endregion
#region Subscription Events
private void ListenToSubscriptions(string channelId)
{
_pubSub.OnChannelSubscription += PubSub_OnChannelSubscription;
_pubSub.ListenToSubscriptions(channelId);
}
private void PubSub_OnChannelSubscription(object sender, OnChannelSubscriptionArgs e)
{
var gifted = e.Subscription.IsGift ?? false;
if (gifted)
{
Debug.Log($"{e.Subscription.DisplayName} gifted a subscription to {e.Subscription.RecipientName}");
}
else
{
var cumulativeMonths = e.Subscription.CumulativeMonths ?? 0;
if (cumulativeMonths != 0)
{
Debug.Log($"{e.Subscription.DisplayName} just subscribed (total of {cumulativeMonths} months)");
}
else
{
Debug.Log($"{e.Subscription.DisplayName} just subscribed");
}
}
}
#endregion
#region Reward Events
private void ListenToRewards(string channelId)
{
_pubSub.OnRewardRedeemed += PubSub_OnRewardRedeemed;
_pubSub.ListenToRewards(channelId);
}
private void PubSub_OnRewardRedeemed(object sender, OnRewardRedeemedArgs e)
{
Debug.Log($"{e.DisplayName} redeemed: {e.RewardTitle}");
}
#endregion
}
上記のスクリプトを何らかのGameObjectにアタッチして実行し、Twitch側で何らかのイベントを実行すると、コンソールにイベントの内容が表示されます。
Twitchのカスタム報酬で”挨拶する”という報酬を作成した例を紹介します。
交換を押すと下記のログがコンソールに表示されます。
これで動作確認ができたので、Debug.Logの部分を起こしたいイベントの内容に書き換えることで、TwitchとUnityアプリの連携ができるようになります。
(厳密には記事執筆時点ではテストする機能などが無く、ビッツとサブスクの動作確認はできてません。動かなかったらゴメンナサイ。)
いかがでしたか?
もしこの記事が参考になったら、チャンネル登録と高評価(そんなものはない)をお願いします。