Unity から LINE Notify にスクリーンショットの画像メッセージを送るメモです。
以前の知見の合わせ技
Unity で CaptureScreenshotAsTexture を使って後加工しやすいスクリーンショットをするメモ
こちらのスクリーンショットを撮影して画像データを取得する記事と
こちらの LINE Notify の連携する記事の合わせ技です。
UnityWebRequest が標準は multipart/form-data でやり取りできるので、LINE Notify に素直に送ることができました。
さらに MultipartFormDataSection に画像データを流し込むと、そのままフォームデータとしての画像データを作成できるので画像も LINE Notify の API 仕様に合わせて送ることができます。
LINE Notify のトークンを取得
LINE Notify ページ にアクセスして トークンを取得しておきます。
Unity で Cube を準備
Unity で以下のように Cube を準備します。ほか EventSystem やカメラに Physics Raycaster を仕込んでいる状態で、クリックすれば動作する状態です。
プログラム
Cube に以下のように CubeEvent.cs を割り当てます。
using UnityEngine; using UnityEngine.EventSystems; using System.Collections; // IEnumerator のための参照 using UnityEngine.Networking; // UnityWebRequest のための参照 using System.Collections.Generic; // Listのため public class CubeEvent : MonoBehaviour, IPointerClickHandler { // LINE Notify のトークン string tokenLINENotify = "token"; byte[] dataImage; void Start() { } public void OnPointerClick(PointerEventData eventData) { // まずスクリーンショット StartCoroutine("DoScreenshot"); } IEnumerator PostLINENofify(string message) { // IMultipartFormSection で multipart/form-data のデータとして送れます // https://docs.unity3d.com/ja/2018.4/Manual/UnityWebRequest-SendingForm.html // https://docs.unity3d.com/ja/2019.4/ScriptReference/Networking.IMultipartFormSection.html // https://docs.unity3d.com/ja/2020.3/ScriptReference/Networking.MultipartFormDataSection.html List<IMultipartFormSection> formData = new List<IMultipartFormSection>(); formData.Add(new MultipartFormDataSection("message", message)); // 画像を入れる // https://notify-bot.line.me/doc/ja/ formData.Add(new MultipartFormFileSection("imageFile", dataImage, "01.jpg", "multipart/form-data")); // HTTP リクエストする(POST メソッド) UnityWebRequest を呼び出し // 第 2 引数で上記のフォームデータを割り当てて multipart/form-data のデータとして送ります UnityWebRequest request = UnityWebRequest.Post("https://notify-api.line.me/api/notify", formData); // LINE Notify の認証は Authorization ヘッダーで Bearer のあとに API トークンを入れる request.SetRequestHeader("Authorization", $"Bearer {tokenLINENotify}"); // ダウンロード(サーバ→Unity)のハンドラを作成 request.downloadHandler = new DownloadHandlerBuffer(); // リクエスト開始 yield return request.SendWebRequest(); // 結果によって分岐 switch (request.result) { case UnityWebRequest.Result.InProgress: Debug.Log("リクエスト中"); break; case UnityWebRequest.Result.ProtocolError: Debug.Log("ProtocolError"); Debug.Log(request.responseCode); Debug.Log(request.error); break; case UnityWebRequest.Result.ConnectionError: Debug.Log("ConnectionError"); break; case UnityWebRequest.Result.Success: Debug.Log("リクエスト成功"); // コンソールに表示 Debug.Log($"responseData: {request.downloadHandler.text}"); break; } } IEnumerator DoScreenshot() { Debug.Log($"DoScreenshot"); yield return new WaitForEndOfFrame(); Texture2D textureScreenCapture = ScreenCapture.CaptureScreenshotAsTexture(); dataImage = textureScreenCapture.EncodeToJPG(); Debug.Log($"{dataImage}"); UnityEngine.Object.Destroy(textureScreenCapture); // 第 2 引数で送りたい文言を入れる StartCoroutine("PostLINENofify", "Unityからテスト"); } void Update() { } }
こちらを保存します。
// LINE Notify のトークン string tokenLINENotify = "token";
こちらを今回取得した LINE Notify のトークンに token 部分を書き換えます。
動かしてみる
ここまで設定出来たら、Cube をクリックして動かしてみます。
クリックすると DoScreenshot リクエスト成功が返ってきます。System.Byte[] で JPEG 画像データがバイト列で取得できています。リクエスト成功で無事 LINE Notify が送られていることがわかります。
そして Unity から LINE Notify にスクリーンショットの画像メッセージが届きます!