LoginSignup
10
11

More than 3 years have passed since last update.

【Unity】ビルドしたアプリの実行時エラーをSlackに通知する

Last updated at Posted at 2020-01-31

はじめに

ダウンロード (2).png

リモートで実行時のエラーを確認できる機能があると便利だなーと思い、簡単に実装してみました。インターネットに繋がっていればプラットフォームによらずに使えて便利な方法です。開発環境とかだと気軽に導入できると思うので、良かったら参考にしてみてください。

環境

  • Windows 10 Home
  • Unity 2019.2.17f1

手順

こちらの記事を参考に、[Incoming Webhooks]を導入してください。現在は[Integrations]でなく[Apps]という名称になっています。画面に従いポストするチャンネルや、投稿するbotのアイコンを設定しておいてください。また、この画面に表示されるWebhook URLは今後使うのでメモしておいてください。
Slack API (Incoming Webhooks) が簡単すぎた - Psycho Frame

次にUnity側でエラーログをフックしていきます。Application.logMessageReceivedに対してイベントを登録することで、ログ出力のタイミングに処理を差し込むことができます。
参考: Application-logMessageReceived - Unity スクリプトリファレンス

今回はその仕組みを利用して、こんな感じのコンポーネントを作成してあげます。これを通知させたいシーン上でアタッチしておいてください(用途に応じてDontDestroyOnLoadや通常のクラス化などすると良いかと思います)。

SlackNotificatior.cs
// 動作確認していないコードなのでご了承ください
using System;
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public sealed class SlackNotificatior : MonoBehaviour
{
    void Awake()
    {
        Application.logMessageReceived += OutputLogMessage;
    }

    void OnDestroy()
    {
        Application.logMessageReceived -= OutputLogMessage;
    }

    void OutputLogMessage(string text, string stackTrace, LogType type)
    {
// Editorでエラーログを通知していたらきりがないので除外する
#if !UNITY_EDITOR
            if (type == LogType.Error || type == LogType.Exception)
            {
                PostText(text, type.ToString());
            }
#endif
    }

    // TODO: ここにWebhook URLを入れる
    const string url = "";
    public void PostText(string text, string type)
    {
        var data = new PostData()
        {
            username = Application.platform.ToString(),
            color = "#D00000",
            fields = new PostData.Field[] { new PostData.Field() { title = type, value = text } }
        };
        var json = JsonUtility.ToJson(data);
        StartCoroutine(Post(url, json));
    }

    IEnumerator Post(string url, string json)
    {
        var postData = System.Text.Encoding.UTF8.GetBytes(json);
        var request = new UnityWebRequest(url, "POST");
        request.uploadHandler = (UploadHandler)new UploadHandlerRaw(postData);
        request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json");
        yield return request.SendWebRequest();
    }

    [Serializable]
    class PostData
    {
        public string username;
        public string color;
        public Field[] fields;
        [Serializable] public class Field { public string title; public string value; }
    }
}

後半ではjsonをWebhook URLに投げる処理を書いてあります。[Incoming Webhooks]のページに載っている[Attachment Formatting]を参考に、いい感じにフォーマットすることができます。赤いバーが出るとそれっぽいですよね。

ダウンロード (1).png

ポイントとして、botの名前部分に実行環境を入れています。こうすることでクロスプラットフォーム開発でもどの環境でのエラーかどうかを区別することができるようになります。その他ビルドや端末の情報を埋め込んでも良いと思います。

参考

UnityからSlack投稿する - Qiita

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11