【问题标题】:How to play sounds loaded on the fly如何播放即时加载的声音
【发布时间】:2013-04-11 11:50:18
【问题描述】:

我试图为我小组的声音设计师制作一个工具,让他可以听到他在 Unity 中播放的声音文件。

  • 检查是否可以加载
  • 检查音量是否正确
  • 检查循环是否正确

等等……

我的问题是找到 Unity 如何管理加载位于文件夹中某处的音频文件。

我发现很多话题都在谈论它,但没有真正解决如何让 Unity 动态加载外部文件的解决方案。

【问题讨论】:

    标签: c# unity3d audio


    【解决方案1】:

    如果您想从与 .exe / .app 相同的目录中加载文件,您可以使用:

    • 使用 System.IO DirectoryInfo() 获取所有文件名
    • 使用 WWW 类 流式传输/加载找到的文件

    这里是代码:

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    
    public class SoundPlayer : MonoBehaviour {
    
        string absolutePath = "./"; // relative path to where the app is running
    
        AudioSource src;
        List<AudioClip> clips = new List<AudioClip>();
        int soundIndex = 0;
    
        //compatible file extensions
        string[] fileTypes = {"ogg","wav"};
    
        FileInfo[] files;
    
        void Start () {
            //being able to test in unity
            if(Application.isEditor)    absolutePath = "Assets/";
            if(src == null) src = gameObject.AddComponent<AudioSource>();
            reloadSounds();
        }
    
        void reloadSounds() {
            DirectoryInfo info = new DirectoryInfo(absolutePath);
            files = info.GetFiles();
    
            //check if the file is valid and load it
            foreach(FileInfo f in files) {
                if(validFileType(f.FullName)) {
                    //Debug.Log("Start loading "+f.FullName);
                    StartCoroutine(loadFile(f.FullName));
                }
            }
        }
    
        bool validFileType(string filename) {
            foreach(string ext in fileTypes) {
                if(filename.IndexOf(ext) > -1) return true;
            }
            return false;
        }
    
        IEnumerator loadFile(string path) {
            WWW www = new WWW("file://"+path);
    
            AudioClip myAudioClip = www.audioClip;
            while (!myAudioClip.isReadyToPlay)
            yield return www;
    
            AudioClip clip = www.GetAudioClip(false);
            string[] parts = path.Split('\\');
            clip.name = parts[parts.Length - 1];
            clips.Add(clip);
        }
    }
    

    [编辑]

    如果人们想改进文件管理,我推荐this link

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多