Unity から LINE Notify にスクリーンショットの画像メッセージを送るメモ

Unity から LINE Notify にスクリーンショットの画像メッセージを送るメモです。
以前の知見の合わせ技
https://www.1ft-seabass.jp/memo/2023/09/04/unity-screenshot-texture2d-tips/
こちらのスクリーンショットを撮影して画像データを取得する記事と
https://www.1ft-seabass.jp/memo/2023/08/30/unity-line-notify-send-tips/
こちらの 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 にスクリーンショットの画像メッセージが届きます!