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

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

以前の知見の合わせ技

Unity で CaptureScreenshotAsTexture を使って後加工しやすいスクリーンショットをするメモ

こちらのスクリーンショットを撮影して画像データを取得する記事と

Unity から LINE Notify にシンプルにメッセージを送るメモ

こちらの LINE Notify の連携する記事の合わせ技です。

UnityWebRequest が標準は multipart/form-data でやり取りできるので、LINE Notify に素直に送ることができました。

さらに MultipartFormDataSection に画像データを流し込むと、そのままフォームデータとしての画像データを作成できるので画像も LINE Notify の API 仕様に合わせて送ることができます。

LINE Notify のトークンを取得

image

LINE Notify ページ にアクセスして トークンを取得しておきます。

Unity で Cube を準備

Unity で以下のように Cube を準備します。ほか EventSystem やカメラに Physics Raycaster を仕込んでいる状態で、クリックすれば動作する状態です。

image

プログラム

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 をクリックして動かしてみます。

image

クリックすると DoScreenshot リクエスト成功が返ってきます。System.Byte[] で JPEG 画像データがバイト列で取得できています。リクエスト成功で無事 LINE Notify が送られていることがわかります。

image

そして Unity から LINE Notify にスクリーンショットの画像メッセージが届きます!