とりあえず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を開きます
Addressablesをインストールします。
今回は1.1.10をインストールしました
アセットをAASのデータベースに登録する
AASではアセットをデータベースに登録し、そのデータベースからアセットを読み込む仕組みです(実際はアセットバンドル化されます)
今回は画像を表示させるサンプルを作成するので画像をデータベースに登録します。
Window→Asset Management→Addressablesをクリック
設定ファイルがない場合は作成するか読み込むか聞かれるので
Create Addressables Settingsをクリックします
するとこのようなウィンドウが出てきます。
ここにアセットを登録していきます。
AASにはグループとラベルという概念があり、画像ではDefault Local Groupと表示されているものがグループになります。
グループには複数のアセットが登録でき、このグループが1つのアセットバンドルになる(初期設定の場合)イメージです。
では早速アセットを登録していきましょう。
今回はGraffityらしく、いらすとやの【拡張現実ゲームのイラスト(緑)
】と【スプレーで壁に落書きをする人のイラスト】(グラフィティ)の二枚を登録してみます。
Assets/AAResourcesというフォルダを作成し、そこに画像を二枚入れました
これらの画像をさきほどのDefault Local Groupと書かれた部分にドラッグします
するとこのように登録されます
この時点でAASで読み込みが可能になりました。
AASではアセットにアドレスという情報を付与してそのアドレスを指定することでアセットを読み込むという仕組みになっています。
デフォルト設定ではファイルパスがアドレスになっています。しかしこのファイルパスをコード上でいちいち入力するのは大変なので、右クリック→Simplify Entry Namesをクリックしアドレスをファイル名のみにします
このようになれば成功です。これなら指定しやすそうですね。
読み込むシーンを作る
次にUnity上でこれらを読み込むシーンを作成します、
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上で実行してみましょう!
スペースキーを押してこのように画像が表示されれば成功です!
まとめ
AddressablesAssetSystemをサクッと触ってみました。これだけでリソースが読み込めるのは結構便利ですね。
次回以降でAssetBundleのビルドであったり便利に使えるようにEditor拡張を書いてみたりといった紹介をしていこうと思っているのでご期待ください!
この記事が気に入ったらサポートをしてみませんか?