Help us understand the problem. What is going on with this article?

[Unity] ビルド後にApkをGoogle Driveにアップロードする

More than 1 year has passed since last update.

ゲームを実機で複数人で確認したいときにはGoogle Driveで共有している.
ただ、ビルドのたびにDriveにアップロードするのが面倒なので PostProcessBuildUnityGoogleDriveを使用してアップロードを自動化する.

環境

windows10
Unity 2018.2.18f
.Net 4.x

Google Drive APIの設定

設定の流れはUnityGoogleDriveのREADMEの通りにやればOK

  • release pageから最新版をダウンロード & Unityにインポート

  • Edit/Project/Settings/Google Drive Settingsという項目ができているのでそれを開く
    2019-01-13 02_21_37-.png

  • Create Google Drive API Appを押す
    2019-01-13 02_21_59-ndk-bundle.png

  • Google Drive APIを登録するプロジェクトを選択(無い場合は作る)
    (Google APIを設定したアカウントと保存するDriveのアカウントは違ってもいい)
    2019-01-13 03_15_04-API を有効にする - Google API コンソール.png

プロジェクト新しく作る場合
2019-01-13 02_23_32-新しいプロジェクト – Google API Console.png

  • 認証情報/認証情報を作成からOAuth クライアントIDを作成
    2019-01-13 02_27_37-認証情報 - ApkDriveUploader - Google API コンソール.png
    新しくプロジェクトを作成した場合はOAuth同意画面を設定する必要あり

  • OAuthクライアントをID作成

アプリケーションの種類は今回PCなのでその他,名前は適当に
2019-01-13 02_27_56-OAuth クライアント ID の作成 - ApkDriveUploader - Google API コンソール.png

  • IDが完成したらOAuthのjsonをダウンロード(↓画像最右)
    2019-01-13 02_28_09-認証情報 - ApkDriveUploader - Google API コンソール.png

  • Unity に戻り Google Drive Settingsに落としたjsonを読み込む
    2019-01-13 02_21_59__3.png

これでGoogle Drive APIを使用する準備は完了.
あとはブラウザでOAuthの権限を承認すればOKなのだが,
Unityのビルド後に呼ばれるPostProcessBuildで動作する関数上でOAuth認証待ちをする(Coroutineを実行する)ができないっぽいので,一度認証用にPlayしてトークンを発行してからビルドするようにしてください.(単に自分がよくわかっていないので改善方があればおしえてくだしあ)

認証

File/New Scene でScene作成 以下コードを追加して実行する
2019-01-13 03_42_53-EscapeRoomTemplate [C__Users_ookubo_Documents_UnityProjects_EscapeRoomTemplate] .png

gist

using System.Collections;

    public class UploadTest : UnityEngine.MonoBehaviour
    {
        private void Start()
        {
            StartCoroutine(Upload());
        }

        IEnumerator Upload()
        {
            var data = new UnityGoogleDrive.Data.File
                {Name = "Test.txt", Content = System.Text.Encoding.UTF8.GetBytes("Hello Google Drive ")};
            var req = UnityGoogleDrive.GoogleDriveFiles.Create(data);
            print("Start Test Upload");
            yield return req.Send();
            print("Finish Test Upload");
        }
}

実行するとブラウザでOAuthの認証画面が出るのでDriveで保存するアカウント選んで認証する
2019-01-13 02_31_41-ログイン - Google アカウント.png

2019-01-13 02_31_49-ログイン - Google アカウント.png

認証終了後に Driveを確認してTest.txtがアップロードされていれば認証正しくできている

2019-01-13 02_38_27-マイドライブ - Google ドライブ.png

ビルド後にアップロード

認証が取れたのでビルド後にapkをアップロードできるようにします.
以下のコードを Editorフォルダ内に配置してください
gist

using System.IO;
using System.Linq;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEngine;

public class UploadAPKAfterBuildFinish
{
    //このAttributeをつけた関数はBuild後に実行される
    [PostProcessBuild(100)]
    public static void OnAndroidBuildFinish(BuildTarget target, string pathToBuildProject)
    {
        if (target == BuildTarget.Android)
        {
            UploadApk(pathToBuildProject);
        }
    }

    static void UploadApk(string pathToBuildProject)
    {
        var apkName = pathToBuildProject.Split(new[] {'/'}).Last();// apkのファイル名を取得

        if (File.Exists(pathToBuildProject))
        {
            var apk = new UnityGoogleDrive.Data.File
                {Name = apkName, Content = File.ReadAllBytes(pathToBuildProject)};
            var req = UnityGoogleDrive.GoogleDriveFiles.Create(apk);
            req.OnDone += response =>
            {
                if (req.IsError) Debug.LogError(req.Error);
                if (req.IsDone)
                {
                    Debug.Log("Upload Success! See your Google Drive");
                    Debug.Log(response.WebViewLink);
                    if(!string.IsNullOrEmpty(response.WebViewLink))
                        Application.OpenURL(req.ResponseData.WebViewLink);
                }
            };

            req.Send();//upload


        }
        else
        {
            Debug.Log($"Built File Path:{pathToBuildProject} File Not Exists");
        }
    }
}

あとはビルドするだけ!
ビルド後に Driveに.apkがアップロードされている

参考記事

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away