見出し画像

とりあえずAddressablesAssetSystem使ってみたい人向け導入解説

Graffityの寺林です(先日入社しました🎉)

今回、Graffityで「エンジニアブログやろうぜ!」って話になったのでUnityに関する話で一本書いてみることにしました。

Graffityではプロダクトの開発にゲームエンジンのUnityを採用しており、比較的新し目のバージョンで開発を行っています。

そこで今回は最近巷で話題のAddressablesAssetsSystem(以下AAS)を試して見たのでその紹介をします!

AASとは?

AASはUnityが開発したアセット読み込み、パッケージ化(AssetBundle化)システムです。

Unityで作るモバイルゲームでは追加コンテンツを配信する際に、今まではAssetBundleというものを使いコンテンツを配信していたのですが、AssetBundleは必要最低限の機能しか提供されてなく、使いこなすのが大変という状態が続いていました。その状況を改善するため、使いやすく・配信しやすい様にUnityが開発してくれたのがAASになります。

詳細はUnityのブログを参照してください。

今回はこのAASを導入し、ローカルに配置されているリソース(画像)の読み込みを行うところまでの方法について紹介します。

プロジェクトを作成する

まずは新規プロジェクトを作成しましょう。

今回はUnity2019.3.3f1でプロジェクトを作成しました

AASを導入する

Window→PackageManagerからPackageManagerを開きます

スクリーンショット 2020-03-26 11.47.40

Addressablesをインストールします。

今回は1.1.10をインストールしました

スクリーンショット 2020-03-26 11.47.59

アセットをAASのデータベースに登録する

AASではアセットをデータベースに登録し、そのデータベースからアセットを読み込む仕組みです(実際はアセットバンドル化されます)

今回は画像を表示させるサンプルを作成するので画像をデータベースに登録します。

Window→Asset Management→Addressablesをクリック

スクリーンショット 2020-03-26 15.15.15

設定ファイルがない場合は作成するか読み込むか聞かれるので

Create Addressables Settingsをクリックします

スクリーンショット 2020-03-26 15.15.23

するとこのようなウィンドウが出てきます。

スクリーンショット 2020-03-26 17.08.09

ここにアセットを登録していきます。

AASにはグループとラベルという概念があり、画像ではDefault Local Groupと表示されているものがグループになります。

グループには複数のアセットが登録でき、このグループが1つのアセットバンドルになる(初期設定の場合)イメージです。

では早速アセットを登録していきましょう。

今回はGraffityらしく、いらすとやの【拡張現実ゲームのイラスト(緑)
】と【スプレーで壁に落書きをする人のイラスト】(グラフィティ)の二枚を登録してみます。

Assets/AAResourcesというフォルダを作成し、そこに画像を二枚入れました

スクリーンショット 2020-03-26 15.20.05

これらの画像をさきほどのDefault Local Groupと書かれた部分にドラッグします

SampleScene_-_ARBlog_addressables_-_PC__Mac___Linux_Standalone_-_Unity_2019_3_3f1_Personal__Personal___Metal__と_Moba_proto_feature_repaire_add_score_by_fukuokamao_·_Pull_Request__564_·_Graffity-X_HoloBreak

するとこのように登録されます

スクリーンショット 2020-03-26 15.22.42

この時点でAASで読み込みが可能になりました。

AASではアセットにアドレスという情報を付与してそのアドレスを指定することでアセットを読み込むという仕組みになっています。

SampleScene_-_ARBlog_addressables_-_PC__Mac___Linux_Standalone_-_Unity_2019_3_3f1_Personal__Personal___Metal__と_Moba_proto_feature_repaire_add_score_by_fukuokamao_·_Pull_Request__564_·_Graffity-X_HoloBreak-2

デフォルト設定ではファイルパスがアドレスになっています。しかしこのファイルパスをコード上でいちいち入力するのは大変なので、右クリック→Simplify Entry Namesをクリックしアドレスをファイル名のみにします

スクリーンショット 2020-03-26 15.24.16

このようになれば成功です。これなら指定しやすそうですね。

スクリーンショット 2020-03-26 15.24.22

読み込むシーンを作る

次にUnity上でこれらを読み込むシーンを作成します、

スクリーンショット 2020-03-26 15.42.45

UIのImageを2つ並べただけの簡単なシーンです。

このシーンで、【スペースキーを押したら画像を読み込み表示する】、というサンプルを作ってみます。

スクリプトを書く

適当に空のGameObjectを作成し、下記のスクリプトをアタッチします

using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.UI;

public class AddressableTest : MonoBehaviour
{
   [SerializeField] private Image testImage1;
   [SerializeField] private Image testImage2;

   private async void Update()
   {
       if (Input.GetKeyDown(KeyCode.Space))
       {
           testImage1.sprite = await LoadSprite("image1");
           testImage2.sprite = await LoadSprite("image2");
           
       }
       
   }

   private async Task<Sprite> LoadSprite(string address)
   {
       var sprite = await Addressables.LoadAssetAsync<Sprite>(address).Task;
       if (sprite != null)
           return sprite;
       
       Debug.LogError($"{address}がないよ");
       return null;
   }
}

SerializeFieldで持っているImageに対してSpriteを読み込みセットするだけのコードです。

実際にAASを使っているのがLoadSprite関数のこの部分になります。

var sprite = await Addressables.LoadAssetAsync<Sprite>(address).Task;

Addressables.LoadAssetAsync<Sprite>()でAASのデータベースからアセットを読み込みます。この時の戻り値はAsyncOperationHandle<Sprite>型になります。

   var operation = Addressables.LoadAssetAsync<Sprite>(address);
       //こんな感じで読み込み状況を取得したり
       if (operation.Status == AsyncOperationStatus.Succeeded)
       {
           
       }
       //完了判定を取れたり
       if (operation.IsDone)
       {
           
       }

       //Taskを待ったりできます
       await operation.Task;
       //読み込み後のSpriteはResultに入ってます
       var result = operation.Result;

今回はサンプルコードなので読み込める前提で処理を書いていますが実際にゲームに入れる時はこのような情報を使い適切にエラー処理をしましょう。

動かす!

ではこのスクリプトをUnity上で実行してみましょう!

スペースキーを押してこのように画像が表示されれば成功です!

スクリーンショット 2020-03-26 16.18.01

まとめ

AddressablesAssetSystemをサクッと触ってみました。これだけでリソースが読み込めるのは結構便利ですね。

次回以降でAssetBundleのビルドであったり便利に使えるようにEditor拡張を書いてみたりといった紹介をしていこうと思っているのでご期待ください!

この記事が気に入ったらサポートをしてみませんか?