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

Addressable Asset System を試してみました。

Addressable Asset System Packageを導入する

以前AssetBundleを使用してた時はビルドとか色々大変だった気がします。。。
Addressable Asset SystemはこのAssetBundle周りを簡単にしてくれるみたいです。

環境
今回使用したバージョンはUnity2019.2.0f1 で Address Asset Systemのバージョンは1.1.5になります。

セットアップ
Package ManagerでAddressablesを選択し、インストールします。
スクリーンショット 2019-07-29 12.31.40(3).png

セットアップが完了すると,メニューにWindows>Asset Managementが作られます。
スクリーンショット 2019-08-02 16.39.50.png

Windows>Asset Management>Addressablesを選択して,Create Addressables Settingsを選択
環境を作成します。
スクリーンショット 2019-07-29 12.31.40(2).png

デフォルトの環境が作成されます。
スクリーンショット 2019-08-02 17.04.58.png

ローカルでAssetを読みむ

まず、試しにローカルでの読み込みを行います。
新しいシーンを作成し、sphereをシーンに追加し、それをフォルダにドラッグしてprefabにします。
そしてAddressablesパネルのDefault Local Groupにドラッグします。
デフォルトだとpathがAsset Addressの名前になるので Simplify Entry Namesで簡単な名前にします。

スクリーンショット 2019-07-29 13.39.47.png

下記のスクリプトをGameObjectをAttachしてください。
AttachしたあとInspectorで読み込みしたいAssetRerenceに設定してください。

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using System.Collections;

public class SampleAddress: MonoBehaviour
{
    public AssetReference Ref;
    GameObject Obj = null;
    AsyncOperationHandle<GameObject> loader;
    private void Start()
    {
        Addressables.LoadAsset<GameObject>(Ref).Completed+=OnLoadDone;
    }

    void OnLoadDone(AsyncOperationHandle<GameObject> handle)
    {
        loader = handle;
        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            Obj = handle.Result;
            Obj = Instantiate(Obj, transform.position, Quaternion.identity);
        }
    }
}

次にPlay Mode Scriptを設定します。
これはUnityでPlayする時のAddressableのモードを設定することが可能で

  • Fast Mode / ビルド必要なし、ローカルAssetを直接読み込む
  • Virtual Mode / ビルド必要なし、バーチャルHostを立てて、読み込みをシュミレートする
  • Packed Play Mode /ビルド必要で、実際に指定したサーバーからロードする

スクリーンショット 2019-07-29 14.42.53.png

ローカルなのでFast Modeを選択し、Playすると設定したPrefabが読み込まれ、Instantiateされます。

サーバーからAssetを読み込む

まず、シーンにCubeを追加してこれをPrefabにします。(サーバー読み込み用)
次にDefault Local Groupの他にグループを作成します。
スクリーンショット 2019-08-03 00.53.18.png

作成したCube Prefabを新しく作成したPacked Asset Groupにドラッグします。
スクリーンショット 2019-08-03 01.00.00.png

サーバー設定を行います。
現在使用してるDefault Profile の設置を変更します。
スクリーンショット 2019-08-03 01.25.55.png

Build Remote Catalogのチェックを入れます。これを入れないと更新できませんでした。
次に"RemoteBuildPath"でローカルでの書き出し先を指定します。
デフォルトのままにしました。
"RemoteLocalPath"は読み込むサーバー先のURLを書きます。
例えば "https://test.com/" の場合は "https://test.com/[BuildTarget]"
[BuildTarget]はProjectのBuild設定になります。例えば、MacのStandaloneだとStandaloneOSXとかになります。
ここのURL間違えてもエラーなどは出ませんでしたので間違えがないように気をつけた方がいいです。

スクリーンショット 2019-08-03 01.29.08.png

次に先ほど作成したPacked Asset Groupの設定を行います。
スクリーンショット 2019-08-03 01.39.11.png

こちらはBuild PathをRemoteBuildPath
LoadPathをRemoteLoadPathに変更します。
スクリーンショット 2019-08-03 01.40.56.png

あとはAssetをBuildします。
スクリーンショット 2019-08-03 01.58.09.png

ビルドしたAssetは"RemoteBuildPath"に配置されます。
今回の場合はUnity Projectの"ServerData/StandaloneOSX"に書き出されます。

そしてこれをサーバーにアップロードし、先ほどのAttachしたScriptのInspectorでサーバーにアップした
Asset名をして,Playすると読み込まれます。
AsyncOperationHandleのPercentCompleteを使用するとProgress Barっぽいのができるみたいですが、
参考
https://docs.unity3d.com/Packages/com.unity.addressables@0.7/manual/AddressableAssetsGettingStarted.html

0と1しか戻ってこなく、フォーラムを見るとまだ調整中っぽいでした。
https://forum.unity.com/threads/asyncoperationhandle-percentcomplete-not-updating-when-given-as-a-parameter-in-function.668317/#post-4761905

Assetを更新する方法

Assetが更新した場合の書き出し手順になります。

まず、更新をチェックするために先にProjectのビルドを行います。
StandaloneなどでAssetのロードが正常に動いてるのを確認してから
Prefabを色などを変更してみます。

次に"Prepare for Update Content"で更新したコンテンツをチェックします。
選択するとプロンプトが出るので
/Assets/Addressable/[OS]/addressables_content_state.bin
を選択します。
ここで変更がチェックされるはずですが、うまくチェックできてませんでした。
スクリーンショット 2019-08-03 02.26.22.png

変更がチェックされてないのですが、そのまま書き出します。
スクリーンショット 2019-08-03 02.43.04.png

先ほどと同じlocalPathに書き出されるので、そのデータを再度サーバーにアップロードします。
そして、ビルドしたもので再度見るとAssetが更新されてるのが確認できます。

参考サイト

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