Unity開発したいかも(プログラム経験ほぼなし)

週末たまに開発したり、しなかったり。忘れることが多いので基本は自分のためにメモ。

AddressablesでSpriteをListにする

今回はAddressablesにしたSprite (Images)をリストにしてみます。

Google先生への聞き方が悪かったのか思ったようにできなかったのでChat GPT先生にお願いしました。

Scriptable Objectを使う方法でうまくいったのでとりあえずこれで行きますが、ちょっと迂遠な気がしています。利用方法としては一つのImage GameObjectにクリックで次々に違う画像を表示するというものです。

Step 1: Scriptable Objectを作る

using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "SpriteListContainer", menuName = "Custom/Sprite List Container")]
public class SpriteListContainer : ScriptableObject
{
    public List spriteList = new List();
}

※ usingでSystem.Collections.Genericを入れないとだめ。

Step 2: AddressablesにSpriteを同じグループに登録

Step 3: Sprite Loaderを作る

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

public class SpriteLoader : MonoBehaviour
{
    public SpriteListContainer spriteListContainerPrefab; // Reference to the ScriptableObject asset in the project
    private SpriteListContainer spriteListContainerInstance; // Instance of the ScriptableObject

    private void Start()
    {
        // Create an instance of the ScriptableObject
        spriteListContainerInstance = Instantiate(spriteListContainerPrefab);

        LoadSprites();
    }

    private void LoadSprites()
    {
        Addressables.LoadAssetsAsync("YourSpriteGroupKey", null).Completed += OnSpritesLoaded;
    }

    private void OnSpritesLoaded(AsyncOperationHandle<IList> handle)
    {
        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            // Update the ScriptableObject instance with the loaded sprites
            spriteListContainerInstance.spriteList.Clear();
            spriteListContainerInstance.spriteList.AddRange(handle.Result);
        }
        else
        {
            Debug.LogError($"Failed to load sprites: {handle.OperationException}");
        }
    }
}

これは別スクリプトにしてもいいのですが、私は既にあるスクリプトの中に入れ込んでしまいました。

Step 4: Scriptable Objetを作って上記にアタッチ

上記(Step 3)を含むcsファイルをGameObjectにアタッチします。

適当なフォルダに移動してCreate > Custom > Sprite List ContainerでScriptable Objectを作って、上記のスクリプトにInspectorからアタッチします。

Step 5: 最後にできたリストを使ってあげます

using UnityEngine;

public class SpriteUser : MonoBehaviour
{
    public SpriteListContainer spriteListContainer;

    private void Start()
    {
        // Access the list of sprites
        List sprites = spriteListContainer.spriteList;

        // Use the sprites as needed
        foreach (Sprite sprite in sprites)
        {
            // Do something with each sprite
        }
    }
}

私の場合はStep 3とStep 5を一緒にしちゃいました。

 

最初に言ったように、イマイチこれがベストか分かりませんが、一つのやり方ということで。リリースしてないけど、いいのかな?

Unity CCD CLI (Command Line Interface)のインストール(Mac) > command not found: ucd

素人すぎてすみません - command not found ucd

CCDのCLIをダウンロード。展開してUCDをダブルクリック。...で、どうするの?

文字入力受け付けないからどうしようもない。

Google先生もこちらが素人すぎて質問の意味が理解できないのか、資料自体少ないのか答えてくれなかったので、初のUnityサポートへの質問をすることに。

サポートが優しかった - ターミナルを使おう

Can I ask how you are trying to run the CCD CLI. Are you trying to run it by double clicking on it? (ダウンロードしたexeファイルをダブルクリックしてコマンド走らせようとしてない?) と言われ、はいビンゴです。

スクショつけてこうやるんだよと言われ、まずターミナルを開くところから始めます。

pwdというコマンドが出てきて「パスワード」?と思ったらなんと現在開いているフォルダまでのパスを表示というコマンドということが判明。UCDまでのパスを通すことでコマンドを使えるようにするんだということがわかった次第です。

それまではひたすら command not found ucdの連続です。

という訳で、PATH="$PATH:/ここにUCDまでのパスが入る/ucd" を実行してucdと入れてやると動きました。

ちなみにexeファイルはダウンロードフォルダからDrag & Dropで他のフォルダに移動しています。

AddressableAssets.InvalidKeyException


AddressableAssets.InvalidKeyExceptionに関する記事

ChatGPTに聞いてみた4つの可能性

  • アドレスが違う: タイポ、大文字小文字など
  • Addressable Groupコンフィグ: Addressable Asset Groupに目的のAssetが入っているか確認。
  • Addressablesのビルド: 変更したらビルドするのを忘れないこと
  • Asset Bundles: これを使っているなら目的のGameObjectが入っていて、runtimeでアクセスできているかを確認

その他

  • AssetがTexture2Dの場合

ハマりポイント履歴

  • AssetがTexture2DだったのでSprite (2D and UI)に変更して再度書き出し
  • 書き出したAssetがどこに保存されたのか分からなくなる
    • Addressable GroupウィンドウでGroupを選んだ状態でInspectorウィンドウを表示。Content Packing & Loadingの項目のBuild Pathを確認
  • その後、InvalidKeyExceptionがでなくなったので、prefabとSpriteそれぞれでテストを完了。Buildした後にまた違うエラーが出たので次回に続く。

 

Unityのクラウドサービス CCM (Cloud Content Delivery)についてちょこっと

初記事なので適当ですんません。

使っている人が少ない?

結構ウェブの参考ページ(YouTube含む)が少ないような気がしています。あってもスクショを見ると今のUIと違っていたりして。

Unity CCDの評価(2022年時点)

このページによると『サクッと使うのならいいけどパワー不足』という評価です。

いいところ

  • ストレージとCDNが両方使える
  • 開発環境と統合している
  • 月50GBフリー

悪いところ

執筆時点での私の評価は、Amazon試してよく分からなくて挫折。CCDが簡単だというので来てみて色々触っているという感じで、まだ何もリリースしていません。とりあえずAddressables Asset Managementを使ってダウンロードさせたいです。