2013-04-11 4 views
8

Ich versuche, ein Werkzeug für den Sound-Designer meiner Gruppe, die es ihm erlauben würde, seine Sound-Datei in Unity gespielt zu hören.So spielen Sie Sounds im laufenden Betrieb geladen

  • Überprüfen Sie, ob es ladbar
  • Überprüfen Sie, ob die Lautstärke richtig
  • Überprüfen Sie, ob Schleifen richtig

und so weiter ...

Mein Problem zu finden ist, wie Unity kann Verwalten Sie das Laden von Audiodateien, die irgendwo in einem Ordner liegen.

Ich habe eine Menge Themen gefunden, die darüber sprechen, aber keine wirklichen Lösungen, wie Unity externe Dateien dynamisch laden kann.

Antwort

7

Wenn Sie Dateien aus dem gleichen Verzeichnis geladen werden soll, wie die .exe/.app Sie können diese verwenden:

  • die System.IO Mit Directory() alle Dateien Namen bekommen
  • Mit der WWW Klasse zu streamen/gefunden, die Dateien laden

Hier ist der Code:

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); 
    } 
} 

[EDIT]

Wenn die Leute wollen auf die Datei-Management verbessern, empfehle ich this link

+0

Also, wie Sie 'wenn Schleifen prüfen richtig'? Wenn Sie Ihre eigene Frage beantworten wollen, tun Sie dies bitte vollständig. – Joetjah

+0

Ich denke, dass es besser ist, Path.Combine (http://msdn.microsoft.com/ru-ru/library/vstudio/fyy7a5kt(v=vs.90).aspx) zu verwenden, um Plattformabhängigkeit zu vermeiden. –

+0

@Joetjah OP erklärte, dass das Problem nur darin bestand, herauszufinden, wie Unity das Laden von Audiodateien verwalten konnte – StackUnder