実現したいこと
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]

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/11/28 09:59
2023/11/28 10:00