実現する事
- GitHub Actionsからビルドの実行
- Addressable Assetsのビルド
- ビルドしたものをサーバーに送信
Test
かRelease
を入力、Run workflow
をクリックして実行します。
下記が完了画面です。
Artifactsに保存されているものはサーバーに送信したものと同じものです。
仕様や注意事項など
- テストビルドで目視で確認、問題無ければ、リリースビルドという流れを想定しています。
- プラットフォームはiOSとAndroidです。(変更化)
- テストとリリースの中身はまったく同じものがサーバーに送信されます。
- サーバーに送信したものは消しません。同じファイル名のものは上書きされます。
- Addressable Assetsのバージョン管理は手動です。
Addressablesのテスト用スキームの準備
Manage Profilesを開きます。
Createでテスト用のスキームを用意します。RemoteBuildPath
とRemoteLoadPath
をDefaultと違うものを指定してください。
ビルドスクリプトを設置しコミット
下記に配置します。
Assets/Editor/AddressableAssetsExporter.cs
配置後、コミットしてください。
using UnityEditor.AddressableAssets;
using UnityEditor.AddressableAssets.Settings;
using UnityEditor;
public static class AddressableAssetsExporter
{
public static void Export()
{
Export("Default");
}
public static void ExportTest()
{
Export("Test");
}
static void Export(string profileID)
{
var settings = AddressableAssetSettingsDefaultObject.Settings;
settings.activeProfileId = settings.profileSettings.GetProfileId(profileID);
AddressableAssetSettings.CleanPlayerContent();
AddressableAssetSettings.BuildPlayerContent();
}
}
※追記※
上記のスクリプトは、現在のものをすべて削除して書き出す設定です。
ダウンロードコンテンツは「Update a Previous Build」でビルドする必要があるようです。
詳しくは、下記記事をご確認ください。
https://light11.hatenadiary.com/entry/2021/01/13/203111
GitHub Secretsにサーバー情報とUnityライセンスを登録
Unityライセンスの取得方法は前の記事のこちらをご覧ください。
| Name | 説明 |
|:-:|:-:|:-:|
| FTP_HOST | FTPのホスト名 |
| FTP_PASSWORD | FTPのパスワード |
| FTP_USER | FTPのユーザー名 |
| UNITY_LICENSE | Unityのライセンス |
ymlを配置する
下記をGitHub Actionsに配置
設置方法が分からない場合は、前の記事「【Unity】Github ActionでUnityPackageの生成からリリースまで全自動で行う方法」が参考になると思います。
[変更箇所]
対象 | 説明 | 例 |
---|---|---|
LOAD_DIR | [リリース用]スキームのRemoteBuildPath | ServerData |
BUILD_METHOD | [リリース用]ビルドメソッドをnamespaceから指定 | AddressableAssetsExporter.Export |
REMOTE_DIR | [リリース用]スキームのRemoteLoadPathのドメインを抜かしたフォルダ名 | AddressableToServerTest |
LOAD_TEST_DIR | [テスト用]スキームのRemoteBuildPath | ServerDataTest |
BUILD_TEST_METHOD | [テスト用]ビルドメソッドをnamespaceから指定 | AddressableAssetsExporter.ExportTest |
REMOTE_TEST_DIR | [テスト用]スキームのRemoteLoadPathのドメイン名を抜かしたフォルダ名 | AddressableToServerTest/Test |
REMOTE_DIRの例)
RemoteLoadPath: https://xxx.com/AddressableToServerTest
REMOTE_DIR: AddressableToServerTest
name: Addressable Assets Build And Deploy
on:
workflow_dispatch:
inputs:
build_mode:
description: "Build mode : Test / Release"
required: true
env:
BUILD_MODE: ${{ github.event.inputs.build_mode }}
# 本番用
LOAD_DIR: "ServerData"
BUILD_METHOD: "AddressableAssetsExporter.Export"
REMOTE_DIR: "AddressableToServerTest"
# テスト用
LOAD_TEST_DIR: "ServerDataTest"
BUILD_TEST_METHOD: "AddressableAssetsExporter.ExportTest"
REMOTE_TEST_DIR: "AddressableToServerTest/Test"
jobs:
check-input:
name: Check Input
runs-on: ubuntu-latest
steps:
- name: Check Value
run: |
if ${{ env.BUILD_MODE != 'Test' && env.BUILD_MODE != 'Release' }}; then
echo ::error:: "TestまたはReleaseを指定してください。 指定された値: ${{ env.BUILD_MODE }}"
exit 1
else
echo "Valid input value"
fi
set-value:
needs: check-input
name: Set Value - ${{ github.event.inputs.build_mode }}
runs-on: ubuntu-latest
outputs:
LOAD_DIR: ${{ steps.set-value.outputs.LOAD_DIR}}
BUILD_METHOD: ${{ steps.set-value.outputs.BUILD_METHOD}}
REMOTE_DIR: ${{ steps.set-value.outputs.REMOTE_DIR}}
steps:
- name: Set Value
id: set-value
run: |
if ${{ env.BUILD_MODE == 'Release' }}; then
echo "::set-output name=LOAD_DIR::${{ env.LOAD_DIR }}"
echo "::set-output name=BUILD_METHOD::${{ env.BUILD_METHOD }}"
echo "::set-output name=REMOTE_DIR::${{ env.REMOTE_DIR }}"
else
echo "::set-output name=LOAD_DIR::${{ env.LOAD_TEST_DIR }}"
echo "::set-output name=BUILD_METHOD::${{ env.BUILD_TEST_METHOD }}"
echo "::set-output name=REMOTE_DIR::${{ env.REMOTE_TEST_DIR }}"
fi
build_and-deploy:
needs:
- check-input
- set-value
name: Build and Deploy - ${{ matrix.targetPlatform }} - ${{ github.event.inputs.build_mode }}
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
targetPlatform:
- iOS
- Android
steps:
# Checkout
- name: Checkout repository
uses: actions/checkout@v2
with:
lfs: true
# Cache
- name: Cache
uses: actions/cache@v2
with:
path: Library
key: Library-${{ matrix.targetPlatform }}
restore-keys: Library-
# Build
- name: Build - ${{ matrix.targetPlatform }}
uses: game-ci/unity-builder@v2
env:
UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
with:
targetPlatform: ${{ matrix.targetPlatform }}
buildMethod: ${{ needs.set-value.outputs.BUILD_METHOD }}
# Upload artifacts
- name: Upload artifacts - ${{ matrix.targetPlatform }}
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.targetPlatform }}_${{ env.BUILD_MODE }}
path: ./${{ needs.set-value.outputs.LOAD_DIR }}/${{ matrix.targetPlatform }}/*
# Upload ftp
- name: Upload ftp - ${{ matrix.targetPlatform }}
uses: sebastianpopp/ftp-action@releases/v2
with:
host: ${{ secrets.FTP_HOST }}
user: ${{ secrets.FTP_USER }}
password: ${{ secrets.FTP_PASSWORD }}
localDir: ${{ needs.set-value.outputs.LOAD_DIR }}
remoteDir: ${{ needs.set-value.outputs.REMOTE_DIR }}
プラットフォームを変更したい
build_and-deploy:
のmatrix:
> targetPlatform:
を変更してください。
BuildTargetからプラットフォーム名を取得できます。
例)
matrix:
targetPlatform:
- StandaloneWindows
- StandaloneOSX
各機能の詳細
おまけ
Addressable Assetsの対象グループのすべてのアセットがロードできるかのTest Runnerスクリプト。
書いてみたもののAddressable Assetは目視で確認した方が良いと個人的には思っています。
利用する際は、Play Mode Script
をUse Existing Build
に変更してください。
AddressableAssetsTest.cs
#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
using UnityEditor.AddressableAssets;
using UnityEditor.AddressableAssets.Settings;
using UnityEngine.AddressableAssets;
using UnityEngine.TestTools;
using Object = UnityEngine.Object;
namespace Tests
{
public class AddressableAssetsTest
{
/// <summary>
/// テスト対象のグループ名
/// </summary>
public readonly IEnumerable<string> TargetGroup = new string[]{ "Default Local Group" };
/// <summary>
/// 対象グループのすべてのアセットがロードできるかのテスト
/// </summary>
/// <returns></returns>
[UnityTest]
public IEnumerator Load()
{
var settings = AddressableAssetSettingsDefaultObject.Settings;
var groups = settings.groups.Where(g => TargetGroup.Any(x => x == g.Name));
foreach (var group in groups)
{
var entrys = new List<AddressableAssetEntry>();
group.GatherAllAssets(entrys, false, true, false);
foreach (var entry in entrys)
{
var handle = Addressables.LoadAssetAsync<Object>(entry.AssetPath);
yield return handle;
Assert.IsNotNull(handle.Result);
}
}
}
}
}
#endif
Assembly DefinitionにAddressableが紐づいていない場合は、Assembly Defiintion Reference
に追加してください。