質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

480閲覧

unityのAddressablesからファイルが読み込めない

youngdoonatsu

総合スコア5

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2023/11/28 03:07

実現したいこと

UnityのAddressableを利用してアセットの情報の読み込みを行いたい。

前提

unityで音楽ゲームを作成しています。今まではResource.Loadを利用した読み込み方法を利用していたのですが、androidでは権限の都合上読み込むことができなかった他、unityでは推奨されていない方法ということでAddressableを利用したファイル読み込みをさせたいと思い、コードを書き直しました。しかし、addressableのキーが見つからないというエラーが発生して一切の曲情報が読み込まれなくなりました。

Addressable Groupの構成

-Build in Data
-Default Local Group
-Txt
--楽曲情報のテキストファイル //ここを読み込ませたい

発生している問題・エラーメッセージ

UnityEngine.AddressableAssets.InvalidKeyException: Exception of type 'UnityEngine.AddressableAssets.InvalidKeyException' was thrown. No Location found for Key=Txt

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.AddressableAssets; 5using UnityEngine.ResourceManagement.AsyncOperations; 6using System; 7using UnityEngine.AddressableAssets.ResourceLocators; // 追加 8using System.IO; 9 10public class MusicDataLoader : MonoBehaviour 11{ 12 public MusicListUI musicListUI; 13 14 private void Start() 15 { 16 InitializeAddressables(); 17 LoadMusicList(); 18 } 19 20 private void InitializeAddressables() 21 { 22 // Addressablesを初期化する 23 Addressables.InitializeAsync().Completed += op => 24 { 25 if (op.Status == AsyncOperationStatus.Succeeded) 26 { 27 Debug.Log("Addressables initialized successfully"); 28 } 29 else 30 { 31 Debug.LogError("Addressables initialization failed"); 32 } 33 }; 34 } 35 36 private void LoadMusicList() 37 { 38 39 // "Txt" ラベルのテキストアセットを非同期で読み込む 40 Addressables.LoadAssetsAsync<TextAsset>("Txt", null).Completed += op => 41 { 42 Debug.Log("LoadMusicList started"); 43 44 // 読み込んだテキストアセットのリストを作成 45 List<TextAsset> textAssets = new List<TextAsset>(op.Result); 46 47 // LoadMusicData メソッドにテキストアセットのリストを渡す 48 StartCoroutine(LoadMusicData(textAssets)); 49 }; 50 } 51 52 private IEnumerator LoadMusicData(List<TextAsset> textFiles) 53 { 54 foreach (var textFile in textFiles) 55 { 56 // テキストファイルから必要な情報を読み込んで MusicData オブジェクトを生成 57 string musicName = Path.GetFileNameWithoutExtension(textFile.name); 58 string textContent = textFile.text; 59 MusicData musicData = CreateMusicDataFromTextContent(textContent); 60 musicData.fileName = musicName; 61 62 // musicListUI が null の場合、エラーログを出力して処理を中断 63 if (musicListUI == null) 64 { 65 Debug.LogError("musicListUI is null. Make sure it is assigned in the Inspector."); 66 yield break; 67 } 68 69 // 読み込んだ MusicData オブジェクトを UI に追加 70 musicListUI.AddMusicData(musicData); 71 72 // 対応するイメージを非同期で読み込む 73 var imageOp = Addressables.LoadAssetAsync<Sprite>($"Image/{musicName}.png"); 74 yield return imageOp; 75 76 // イメージの読み込みが成功した場合、MusicData オブジェクトに設定して UI を更新 77 if (imageOp.Status == AsyncOperationStatus.Succeeded) 78 { 79 musicData.sprite = imageOp.Result; 80 musicListUI.UpdateMusicListUI(); 81 } 82 else 83 { 84 Debug.LogError("Failed to load image: " + musicName); 85 } 86 } 87 } 88 89 private MusicData CreateMusicDataFromTextContent(string textContent) 90 { 91 // テキストコンテンツから MusicData オブジェクトを生成するメソッド 92 MusicData musicData = new MusicData(); 93 94 string[] lines = textContent.Split('\n'); 95 96 List<float> bpms = new List<float>(); 97 98 foreach (string line in lines) 99 { 100 string[] data = line.Split(':'); 101 string key = data[0].Trim(); 102 string value = data[1].Trim(); 103 104 switch (key.ToLower()) 105 { 106 case "title": 107 musicData.title = value; 108 Debug.Log("Title: " + value); 109 break; 110 case "artist": 111 musicData.artist = value; 112 Debug.Log("Artist: " + value); 113 break; 114 case "bpm": 115 if (value.Contains("(") && value.Contains(")")) 116 { 117 string[] bpmPairs = value.Split(new char[] { '(', ')' }); 118 119 foreach (string bpmPair in bpmPairs) 120 { 121 string[] bpmData = bpmPair.Split(','); 122 if (bpmData.Length >= 2 && float.TryParse(bpmData[0], out float bpm)) 123 { 124 bpms.Add(bpm); 125 } 126 } 127 } 128 else 129 { 130 float bpm; 131 if (float.TryParse(value, out bpm)) 132 { 133 bpms.Add(bpm); 134 } 135 } 136 break; 137 case "lv": 138 string[] lvValues = value.Split(','); 139 List<int> lvList = new List<int>(); 140 foreach (string lvValue in lvValues) 141 { 142 if (int.TryParse(lvValue, out int lv)) 143 { 144 lvList.Add(lv); 145 } 146 } 147 musicData.levelList = lvList.ToArray(); 148 break; 149 default: 150 break; 151 } 152 } 153 154 bpms.Sort(); 155 musicData.bpm = bpms.ToArray(); 156 157 return musicData; 158 } 159}

試したこと

Addressable Groupの構成変更や、Resource.Loadで読み込むことがで来ているかの確認(Resource.Loadでは読み込めました。)

補足情報(FW/ツールのバージョンなど)

Unity 2022.3.13f1
Mac OS sonoma 14.1.1
Addressable 1.21.19 · October 30, 2023 [Release]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Addressablesの初期化が非同期であることが問題の原因かもしれません。
コードにコメントするとこんな感じです。

cs

1public class MusicDataLoader : MonoBehaviour 2{ 3 4 private void Start() 5 { 6 // これがいつ完了するか不明。すぐには終わらないかもしれない 7 InitializeAddressables(); 8 // それなのにすぐにAddressablesのデータを読もうとしている 9 LoadMusicList(); 10 } 11 12}

LoadMusicList()はInitializeAddressables()の完了後に実行する必要があるので、自分ならこうします。

cs

1private void Start() 2{ 3 InitializeAddressables(); 4} 5 6private void InitializeAddressables() 7{ 8 // Addressablesを初期化する 9 Addressables.InitializeAsync().Completed += op => 10 { 11 if (op.Status == AsyncOperationStatus.Succeeded) 12 { 13 OnAddressablesInitializeSuccess(); 14 } 15 else 16 { 17 OnAddressablesInitializeFailed(); 18 } 19 }; 20} 21 22void OnAddressablesInitializeSuccess() 23{ 24 Debug.Log("Addressables initialized successfully"); 25 LoadMusicList(); 26} 27 28void OnAddressablesInitializeFailed() 29{ 30 // 初期化失敗。ダイアログか何か表示して終了するなど? 31 Debug.LogError("Addressables initialization failed"); 32} 33

投稿2023/11/28 05:16

mingos

総合スコア4018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

youngdoonatsu

2023/11/28 09:59

解決しました。初期化する前に全てのファイルを読み込もうとしてエラーになっていたみたいです。ありがとうございました!
mingos

2023/11/28 10:00

解決して良かったです👍
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問