宴のリソース内の音声や画像を、プログラムから参照する方法はありますか?

102 views
Skip to first unread message

VOICE_NOVEL

unread,
Oct 16, 2023, 10:45:22 PM10/16/23
to 宴ユーザーグループ
宴のリソース内の音声や画像を、プログラムから参照したいです。

〇調べてみたこと

AssetDatabase.LoadAssetAtPath だと
Assets/<宴でつくったプロジェクト名>/Resources/BlackCatUtage/Sound/以下
のファイルが取れますが、Editor内でのみ有効でビルドが出来ない。

Resources.Load だと、
Assets/Resources以下のみなので、参照できない。

もし、方法がなければ、Assets/Resourceにコピーという方法も考えられますが、
管理や複製が必要になってくる、ファイルが大きくなるっていうデメリットがあります。

もし何か良い方法がありましたら、教えて下さい。

どうぞよろしくお願いいたします。




Message has been deleted

マッドネスラボ

unread,
Oct 17, 2023, 2:20:24 AM10/17/23
to 宴ユーザーグループ
>AssetDatabase.LoadAssetAtPath だと
はい。AssetDatabase.LoadAssetAtPathはUnityのエディタ拡張のための機能で、ランタイム(ビルド後)では利用できません。

>Assets/Resources以下のみなので、参照できない。
これは、ちょっと勘違いがあると思います。
後述の利用でちょっと宴のシナリオで使うものでは事情が異なるのですが、
基本的にはUnityのResources.Loadは「Resourcesフォルダ以下からの相対パス」でロードができます。
たとえば、Assets/Utage/Sample/Resources/Sample/Sound/bgmをロードする場合は、
Resources.Load("Sample/Sound/bgm" )をパスとして指定します。
Resourcesフォルダ自体はどこにあっても良くて、それ以下の「Sample/Sound/bgm」をパスとして指定します。

ただし、宴のシナリオで使用する素材の場合は宴のファイルマネージャーを通してロードする必要があります。
宴は、ヴィジュアルノベルという性質上、短い時間で何度もファイルのロードとアンロードを繰り返すため、独自のファイル管理をしています。
そのため、同じ素材を宴のシナリオ上で使用している場合、それがシナリオ上で未使用になった場合、宴のファイルマネージャーがアンロードしてしまうため、背景テクスチャが消えたりサウンドが鳴らなくなってしまったりします。
以下、サンプルです。(動作確認してないので、細かいところで不備があるかもしれません)



    public class SampleLoadFile : MonoBehaviour
    {
        public AdvEngine Engine => this.GetComponentCacheFindIfMissing(ref engine);
        [SerializeField] protected AdvEngine engine;

        //ファイルをロードして、そのファイルを使って何かをする
        public void SampleLoadAndDo(string path)
        {
            StartCoroutine(LoadFile(path,
                (file) =>
                {
                    //ロードしたサウンド(AudioClip)
                    AudioClip audioClip = file.Sound;

                    //ロードしたTexture(Texture2D )
                    Texture2D texture = file.Texture;

                    //ロードしたその他のUnityObject(プレハブやScriptableObjectなど)
                    UnityEngine.Object obj = file.UnityObject;
                }));
        }

        //ファイルのロード
        protected virtual IEnumerator LoadFile(string path, Action<AssetFile> onComplete )
        {
            //ファイル(アセット)のロード
            //第一引数はファイルパス
            //第二引数で、このコンポーネントがこのファイルを使用中であるということを示している
            AssetFile file = AssetFileManager.Load(path, this);
            while (!file.IsLoadEnd) yield return null;
            //ロード終了
            onComplete?.Invoke(file);
        }
    }

    public class SampleLoadAudio : MonoBehaviour
    {
        public AdvEngine Engine => this.GetComponentCacheFindIfMissing(ref engine);
        [SerializeField] protected AdvEngine engine;

        //ファイルをロードしてBGMとして鳴らす
        public void LoadAndPlayBgm(string path)
        {
            StartCoroutine(LoadFile(path,
                (file) =>
                {
                    //ロードしたファイルをBGMとして再生
                    Engine.SoundManager.PlayBgm(file);

                    //サウンドマネージャーがファイルを使用する状態になって、
                    //このコンポーネントはファイルを使用する状態じゃなくてよくなったのでUnuseを呼ぶ
                    file.Unuse(this);
                }));
        }

        //ファイルのロード
        protected virtual IEnumerator LoadFile(string path, Action<AssetFile> onComplete)
        {
            //ファイル(アセット)のロード
            //第一引数はファイルパス
            //第二引数で、このコンポーネントがこのファイルを使用中であるということを示している
            AssetFile file = AssetFileManager.Load(path, this);
            while (!file.IsLoadEnd) yield return null;
            //ロード終了
            onComplete?.Invoke(file);
        }
    }

    public class SampleLoadTexture : MonoBehaviour
    {
        public AdvEngine Engine => this.GetComponentCacheFindIfMissing(ref engine);
        [SerializeField] protected AdvEngine engine;

        [SerializeField] RawImage targetImage;

        private AssetFile UsingFile { get; set; }

        private void OnDestroy()
        {
            UnloadUsingFile();
        }
       
        //使用中のファイルがあればアンロード可能にする
        void UnloadUsingFile()
        {
            if (UsingFile != null)
            {
                UsingFile.Unuse(this);
            }
        }
       

        //ファイルをロードしてBGMとして鳴らす
        public void LoadTexture(string path)
        {
            StartCoroutine(LoadFile(path,
                (file) =>
                {
                    //前回ロードしていたファイルがあれば未使用に
                    UnloadUsingFile();
                    UsingFile = file;
                   
                    //表示テクスチャに設定
                    targetImage.texture = file.Texture;
                }));
        }

        //ファイルのロード
        protected virtual IEnumerator LoadFile(string path, Action<AssetFile> onComplete)
        {
            //ファイル(アセット)のロード
            //第一引数はファイルパス
            //第二引数で、このコンポーネントがこのファイルを使用中であるということを示している
            AssetFile file = AssetFileManager.Load(path, this);
            while (!file.IsLoadEnd) yield return null;
            //ロード終了
            onComplete?.Invoke(file);
        }
    }


2023年10月17日火曜日 11:45:22 UTC+9 VOICE_NOVEL:
Reply all
Reply to author
Forward
0 new messages