Jump to content
Unity Insider Forum

WAV-Datei abspielen mit Platzhalter (%wert%.wav)?


DerStefan

Recommended Posts

Hallo,

mein aktuelles Skript besteht aus 2 eigenen Funktionen.
Die erste erfasst Werte (Integer) und die zweite spielt eine WAV-Datei (von mehreren möglichen) ab.
Die Dateinamen sind 1.wav bis 10.wav und befinden sich in Assets\Resources\Sounds\
(Schön wäre es, wenn ich die 10 WAV-Dateien nicht in den Inspector reinziehen müsste.)

Mein Ziel ist es, die entsprechende WAV-Datei in Abhängigkeit des Integer-Wertes abzuspielen,
anstatt 10 if-Abfragen a la "if int=1, play 1.wav etc" zu erzeugen.
Beispiel:
Ist der int-Wert 5, dann soll auch die 5.wav abgespielt werden

Hier mal ein Code, der eher als Beispiel zu betrachten ist:

using UnityEngine;

public class SoundPlay : MonoBehaviour
{
  private AudioSource audioSource;
  private AudioClip soundDatei; // Beliebige WAV-Datei
  public AudioClip[] soundArray; // Sollte normalerweise nicht benötigt werden

  private void Start()
  {
    WertFestlegen();
  }

  public void WertFestlegen()
  {
    wert = 2; // Wird im echten Skript natürlich nicht so festgelegt und dient hier nur zur Veranschaulichung
    ClickSound(wert);
  }

  public void ClickSound(int nr)
  {
    audioSource = GetComponent<AudioSource>();
    audioSource.clip = soundArray[Random.Range(0, soundArray.Length)]; // Funktioniert, aber nicht gewollt
    audioSource.PlayOneShot(audioSource.clip);
    
    //Mein Ziel:
    //audioSource.PlayOneShot(%wert%.wav); // Ich bräuchte eine Art Platzhalter, ich kenne die % % aus anderen Programmiersprachen
  }
}

P.S: Sorry, hab ganz oben "int wert" vergessen, aber tut aktuell nichts zur Sache.

Vielen Dank für jede Hilfe und beste Grüße!

Link zu diesem Kommentar
Auf anderen Seiten teilen

String Interpolation geht auch:

PlaySound($"{fileName}{intWert}.wav");

Was mich aber viel eher interessiert:

audioSource.clip = soundArray[Random.Range(0, soundArray.Length)]; // Funktioniert, aber nicht gewollt

Warum ist das nicht gewollt? Wegen des Zufallsfaktors? Oder wegen des Arrays?

Weil die grundsätzliche Idee, da Sounds über einen zusammengesetzten String anzusprechen... Naja, davon würde ich immer abraten. Du hast doch bereits ein Array von AudioClips, warum steckst du da nicht einfach dein int rein?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo und Danke für eure Hilfe!

var name = fileName + intWert + ".wav";
PlaySound(name);

Was genau macht "fileName" hier?
intWert + ".wav"; würde doch reichen, wenn alle Dateinamen 1.wav, 2.wav etc sind - oder nicht?

@Sascha:
Ja, Zufallsgenerator brauche ich in diesem Fall nicht.
Ebenso möchte ich nur ungern alle WAV-Dateien in den Inspector reinziehen müssen.
Wenn ich 100-WAV-Dateien hätte, wäre es auch ein großes Array.

----

Leider funktioniert es immer noch nicht.
Es passiert nichts, wenn ich das Skript starte - also kein SoundPlay.

using System;
using UnityEngine;

public class SoundPlay : MonoBehaviour
{
  private AudioSource audioSource;
  public int wert;

  private void Start()
  {
    WertFestlegen();
  }

  public void WertFestlegen()
  {
    wert = 2;
    ClickSound(wert);
  }

  public void ClickSound(int nr)
  {
    audioSource = GetComponent<AudioSource>();
    var name = "Resources/Sounds/" + nr + ".wav";
    PlaySound(name);
    audioSource.PlayOneShot(audioSource.clip);
  }

  private void PlaySound(string name)
  {
    throw new NotImplementedException();
  }
}

Woran könnte es liegen?

Beste Grüße

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

die Methode/Funktion PlaySound hat Unity automatisch generiert.
Wenn ich diese Methode nicht habe, wird mir PlaySound rot unterstrichen und es heißt, "Der Name PlaySound ist im aktuellen Kontext nicht vorhanden."

Ich habe es jetzt etwas anders geschrieben und es funktioniert einwandfrei.
Desweiteren werden 2 Dateien (gewollt) nacheinander abgespielt, ohne dass es zu Überschneidungen kommt.
Bei mehr als 2 Dateien wären eine for-Schleife und ein Array die wahrscheinlich bessere Wahl.

Hier der finale Code.

using System.Collections;
using UnityEngine;

public class SoundPlay : MonoBehaviour
{
  public AudioSource audioSource; // Globale Variable für die AudioSource
  public AudioClip audioClipLinks, audioClipRechts; // Globale Variablen für die beiden AudioClips
  public int wertLinks, wertRechts = 7; // Werte, die als Wildcards für die Audioclips dienen (wertRechts wird testweise mit 7 initialisiert)

  private void Start() // Wird einmalig ausgeführt
  {
    audioSource = GetComponent<AudioSource>(); // Zugriff auf AudioSource-Komponente
  }

  public void WertFestlegen() // wertLinks wird mit Button-Click inkrementiert
  {
    wertLinks++; // Wert um 1 erhöhen
    StartCoroutine(PlaySound(wertLinks, wertRechts)); // Beide Werte akustisch wiedergeben
  }
  
  IEnumerator PlaySound(int wertLinks, int wertRechts)  // Beide Werte akustisch wiedergeben
  {
    audioClipLinks = Resources.Load<AudioClip>("Sounds/English" + wertLinks); // Datei für wertLinks festlegen, z.B. English3.wav
    audioSource.PlayOneShot(audioClipLinks); // Datei abspielen
    yield return new WaitForSeconds(audioClipLinks.length); // Warten, bis Datei vollständig abgespielt worden ist
    audioClipRechts = Resources.Load<AudioClip>("Sounds/English" + wertRechts); // Datei für wertRechts festlegen, in diesem Fall English7.wav
    audioSource.PlayOneShot(audioClipRechts); // Datei abspielen
  }
}


Danke für eure Hilfe und beste Grüße 😃

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...