Unity节奏游戏:如何在JSON文件中存储MP3引用并读取路径
Unity节奏游戏JSON存储MP3引用解决方案
1. 修改自定义数据类
直接在你的MusicChart类中新增字符串字段,用来存储MP3文件的相对路径:
using UnityEngine; [System.Serializable] public class MusicChart { public string name; public float startDelay; public float tempo; public float finishBeat; public Timing[] timings; // 新增音频路径字段 public string audioPath; }
2. 更新JSON文件
在对应的JSON文件中添加audioPath字段,填写MP3文件的相对路径示例:
{ "name": "ExampleChart", "startDelay": 0.5, "tempo": 120, "finishBeat": 160, "timings": [], "audioPath": "Audio/GameMusic/ExampleSong" }
3. 在Unity中读取路径并加载音频
根据MP3文件的存放位置,选择对应的加载方式:
情况一:MP3放在Resources文件夹下
若音频存放在Resources目录(比如Resources/Audio/GameMusic/),直接用Resources.Load加载:
// 假设已完成JSON解析,得到MusicChart实例 MusicChart loadedChart = JsonUtility.FromJson<MusicChart>(jsonText); // 加载音频 AudioClip audioClip = Resources.Load<AudioClip>(loadedChart.audioPath); if (audioClip != null) { // 绑定到AudioSource播放(需提前挂载该组件) AudioSource audioSource = GetComponent<AudioSource>(); audioSource.clip = audioClip; audioSource.Play(); } else { Debug.LogError("未找到指定路径的音频文件:" + loadedChart.audioPath); }
情况二:MP3放在StreamingAssets文件夹下
若音频存放在StreamingAssets目录,需用UnityWebRequest加载(该目录文件无法直接通过路径访问):
using UnityEngine.Networking; using System.Threading.Tasks; // 异步加载音频方法 async Task LoadAudioFromStreamingAssets(MusicChart chart) { string fullPath = System.IO.Path.Combine(Application.streamingAssetsPath, chart.audioPath + ".mp3"); using (UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(fullPath, AudioType.MPEG)) { await request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { AudioClip audioClip = DownloadHandlerAudioClip.GetContent(request); AudioSource audioSource = GetComponent<AudioSource>(); audioSource.clip = audioClip; audioSource.Play(); } else { Debug.LogError("音频加载失败:" + request.error); } } } // 调用示例(需在异步方法内执行) // await LoadAudioFromStreamingAssets(loadedChart);
注意事项
- 路径区分大小写,确保JSON中的路径与Unity项目内文件路径完全匹配
Resources加载的文件打包后无法动态新增;若需支持外部音频动态加载,优先选择StreamingAssets或其他外部存储方案
内容的提问来源于stack exchange,提问作者ohkdevlop
相关产品推荐
相关产品推荐

