Unity x Slack x Githubで効率の良いワークフローを作ろう!

はじめに

初めまして、Unityエンジニアの中国人のです。 カヤックUnityアドベントカレンダー2018の8日目の記事になります。 どうぞよろしくお願い致します。

概要

弊社でゲーム開発中によく使っているツールいくつかがあります。 例えばもう口と耳の代わりになりそうな Slack とか、 プロジェクトを管理することができる Github などです。

これらツールが開発チームに便利をもたらしていますが、 数が多いほど操作の切り替えも複雑になってくるかもしれません。 では今日はこれらのツールをUnityと連携することでなにか新しい便利さが生まれないかを、 みなさんと一緒に探してみましょう!

Unity x Slack

Slackがはいろんな api を用意してくれています。 今回はUnityWebRequestを使ってSlackへ送信する方法をご紹介していきたいと思います。

事前準備:

  • コードでチャンネル投稿するには ボットを登録 し、token発行することが必要になります。

  • チャットに投稿するapiはこちら: api/chat.postMessage

  • あと、正式導入前にどこかのチャンネルで実験したほうがいいのかもしれません。

では例をみてみましょう!

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class SlackPoster : MonoBehaviour
{
    public void OnClick()
    {
        StartCoroutine(SendToChat());
    }

    IEnumerator SendToChat()
    {
        var form = new WWWForm();

        // Slackのapi.slack.com/apps画面でBotを新規してtokenを発行できる
        form.AddField("token", "dummy-token-dummy-token");

        // チャンネルの名前だよ〜
        form.AddField("channel", "#channel-name");

        // これをfalseにすると、@誰かにしてもハイライトしてくれないよ〜
        form.AddField("link_names", "true");

        // ここはメッセージの本体
        form.AddField("text", "@you カヤックへようこそ!");

        // Botの名前
        form.AddField("username", "カヤック人事部");

        // チャットに投稿用api
        var request = UnityWebRequest.Post("https://slack.com/api/chat.postMessage", form);

        // 3,2,1 発射ッツ!
        yield return request.SendWebRequest();

        // 結果はどうなるかな、┣¨キ(〃゚3゚〃)┣¨キ
        if (request.isNetworkError || request.isHttpError)
        {
            Debug.Log("送信失敗:( \n" + request.error);
        }
        else
        {
            Debug.Log("発送成功:) \n" + request.downloadHandler.text);
        }
    }
}

実行してみたら、下図のように指定チャンネルに投稿してくれました。 f:id:zhaozilong0906:20181127185015p:plain

Tips: さらに、 attachments を使うと、ボタン付きなどの派手なフォマートでも投稿することができます。 f:id:zhaozilong0906:20181127185026p:plain

Unity x Github

Githubも同様に、ウェブサイドで操作できる機能はほぼ全部 GitHub REST API でコントロールできます。 ではまたUnityWebRequestでissueを新規で作っていきましょう!

事前準備:

  • まず、Github apiをアクセスするには認証の必要があります。(認証の説明は こちら )

  • issueを新規作成するapiはこちら: api.github.com/repos/:owner/:repo/issues (:ownerと:repoは変数)

  • 最後、どのリポジトリで実験したほうがいいのかも考えておきましょう!

では例をご覧ください。

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class GithubHelper : MonoBehaviour
{
    public void OnClick()
    {
        StartCoroutine(CreateIssue());
    }

    IEnumerator CreateIssue()
    {
        // 読みにくい(´・ω・`)、ちゃんとクラスを作ってserialize化していこうよ!
        var json = "{\"title\":\"Hello Kayac!\", \"body\":\"@you カヤックようこそ!\"}";
        byte[] postData = System.Text.Encoding.UTF8.GetBytes(json);

        // owner_nameとrespo_nameは変数だよ
        var request = new UnityWebRequest("https://api.github.com/repos/owner_name/respo_name/issues ", "POST");
        request.uploadHandler = new UploadHandlerRaw(postData);

        // レスポンス情報はここに入っているよ〜
        request.downloadHandler = new DownloadHandlerBuffer();

        // Content-Type指定しないとapplication/octet-streamで送られる
        request.SetRequestHeader("Content-Type", "application/json");

        // 認証用tokenを入れないとissue作ってくれないよ〜
        request.SetRequestHeader("Authorization", "token dummy-token-dummy-token");

        // 発射ッツ!boom!
        yield return request.SendWebRequest();

        // ┣¨キ(〃゚3゚〃)┣¨キ
        if (request.isNetworkError || request.isHttpError)
        {
            Debug.Log("送信失敗:( \n" + request.error);
        }
        else
        {
            Debug.Log("発送成功:) \n" + request.downloadHandler.text);
        }
    }
}

実行してみたら、issueがちゃんと作られましたね!wow f:id:zhaozilong0906:20181127185035p:plain

Tips: チームメンバーが誰でも使えるゾンビアカウントを作ったほうが良さそうですね。

何ができるのか

実装についてのご紹介はここまでになります。 ではこれら機能を使って何ができるのか、考えてみましょうか!

ゲーム開発中、チームチェックなどで発見した不具合を誰かに共有したい場合がよくあると思います。

一般的に、

1. スマホで画面のスクショを取る
2. Githubで起票して、スクショをアップロードする
3. Slackで誰かにissueのリンクを送る

という一連の流れをやると最低10分間かかりますかね。

もしワンクリックで、

1. ゲーム画面をキャプチャーする
2. 自動的にGithubでissueを作って、スクショをアップロードする
3. 起票されたissueをSlackでエンジニアの誰かに投稿する

という機能があれば1分にもかからないかもしれません。 特に多人数開発チームのコミュニケーションコストも下がるのではないかと思います。

上記は1つの例で、UnityかC#かでいろんなツールと連携して、効率の良い作業フローを作ることができます。 みなさんもし何かのよりいいアイディアがあれば是非ご活用ください!

おわりに

ご紹介させていただいた内容がみなさんのお役に立てば大変喜びます。 明日はによるデータ指向プログラミング&Unity ECSについての話になります。 どうぞよろしくお願い致します。