Jump to content
Unity Insider Forum
Sign in to follow this  
minuschki

LoopSound Volume einstellen

Recommended Posts

Ich habe da ein Problem bezüglich Sounds abspielen und steuern.

Folgende Situation: Ein Curlingstein wird mit AddForce angeschoben und gleitet dann übers Eis. Solange er in Bewegung ist, sollte der geloopte Sound "gleiten" zu hören sein. Wenn der Stein mit einem anderen kollidiert ertönt der Sound "hit". Wenn der Stein weiter gleitet, sollte der geloopte Sound "gleiten" weiter hörbar sein, bis der Stein stillsteht.

Meine Idee ist, beim Sound "gleiten" das Häkchen bei "Loop" anzumachen und beim Spielstart das Volume für diesen Sound auf 0 zu setzen. Sobald dann der Curlingstein sich fortbewegt, könnte man das Volumen in Abhängigkeit zum Tempo "aufdrehen" (auf max. 1). Wenn der Stein dann an Tempo verliert und abbremst würde auch der "gleiten"-Sound wieder leiser. 

1. Ist dieser Ansatz richtig?

2. Wir kann man das Volumen des Gleitsounds steuern, ohne dass das Volumen des "hit"-Sound beeinflusst wird?

3. Da mehrere Steine im Spiel sind, kann es nicht zu einem Problem kommen, dass gleitende Steine das Volumen hochdrehen und die stillstehenden Steine das Volumen gleich wieder auf 0 setzen? Oder werden die Sounds unabhängig abgespielt?

Danke für eure Hilfe!

 

if(rb.velocity.magnitude >= 0.2f)
		{
			//Drehe das Volumen des LoopSounds "gleiten" auf oder ab,
			//wenn sich der Stein schneller als 0.2f fortbewegt
		}
		else
		{
			//Volumen auf 0 setzen
		}

 

UnitySchnappschuss001.png

Share this post


Link to post
Share on other sites
vor 5 Stunden schrieb minuschki:

1. Ist dieser Ansatz richtig?

Kann man so machen. Wenn du nur zwischen 0 und 1 wechselst, wäre es aber eleganter, den Sound mit Stop anzuhalten und mit Play anzuspielen.

vor 5 Stunden schrieb minuschki:

2. Wir kann man das Volumen des Gleitsounds steuern, ohne dass das Volumen des "hit"-Sound beeinflusst wird?

Für den Hit einfach eine andere AudioSource nehmen. Ansonsten kannst du für den hit auch PlayOneShot benutzen, das läuft dann unabhängig vom eigentlichen Sound der AudioSource.

vor 5 Stunden schrieb minuschki:

3. Da mehrere Steine im Spiel sind, kann es nicht zu einem Problem kommen, dass gleitende Steine das Volumen hochdrehen und die stillstehenden Steine das Volumen gleich wieder auf 0 setzen? Oder werden die Sounds unabhängig abgespielt?

Du arbeitest ja hoffentlich nur an der AudioSource des Steins und nicht an irgendwelchen anderen. Was du mit einer AudioSource machst, ist den anderen egal.

Share this post


Link to post
Share on other sites

Hallo Sascha

Danke für deine Antwort!

Mein erster Versuch war, zwei AudioSource im Inspector dem Gameobjekt anzuhängen, war dann aber nicht in der Lage, die einzeln anzusprechen. Nach einigem Suchen bin ich dann auf das untenstehende Skript gestossen, welches hoffentlich das macht, was ich gerne möchte (Volume separat steuern).

Wird das allgemein so gemacht oder kann man das auch einfacher lösen?

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ton : MonoBehaviour {

	public AudioClip audioClip1;//Sounds in den Inspector ziehen
	public AudioClip audioClip2;
	public AudioClip audioClip3;

	AudioSource myAudioSource1;
	AudioSource myAudioSource2;
	AudioSource myAudioSource3;

	void Start()
	{
		myAudioSource1 = AddAudio (true, false, 0.4f);//loop, playAwake, volume
		myAudioSource2 = AddAudio (false, false, 0.8f);
		myAudioSource3 = AddAudio (true, false, 1.0f);
		StartPlayingSounds ();
	}

	public AudioSource AddAudio(bool loop, bool playAwake, float vol) 
	{ 
		AudioSource newAudio = gameObject.AddComponent<AudioSource>();
		newAudio.loop = loop;
		newAudio.playOnAwake = playAwake;
		newAudio.volume = vol; 
		return newAudio; 
	}

	void StartPlayingSounds()
	{
		myAudioSource1.clip = audioClip1;
		myAudioSource1.Play ();

		myAudioSource2.clip = audioClip2;
		myAudioSource2.Play ();

		myAudioSource3.clip = audioClip3;
		myAudioSource3.Play ();
	}

}

 

Share this post


Link to post
Share on other sites

Warum packst du nicht einfach jeweils eine AudioSource auf jedes Objekt, das tatächlich auch den Ton erzeugt? Du hast doch nur zwei Sounds - den einen lässt du als Loop laufen und den anderen spielst du mit PlayOneShot ab.

Share this post


Link to post
Share on other sites

Würde ich ja liebend gern tun, aber ich bin blutiger Anfänger!

 

1. Also ich hänge an jeden Curlingstein nur 1 Audio Source und das reicht um 2 Sounds abzuspielen?

2. Muss das Feld bei AudioClip leer bleiben oder gehört da entweder der "hit"-sound oder der "rollen"-Sound hinein?

3. Unten stehen zwei Schnipsel, das erste, um den "rollen"-Sound zu steuern und das zweite um den Kollisionssound "hit" zu steuern. Da habe ich zwei Probleme!

a) Wie müssen die Variabeln am Anfang deklariert werden, damit ich dann in den untenstehenden Schnipseln die Sounds gezielt steuern kann?

b) Wie sieht das Codemässig in den Schnipseln aus?

 

Ich weiss, für Profis wahrscheinlich dumme Fragen, aber für mich noch nicht lösbar?

Vielleicht hast du ja erbarmen!

 

 

UnitySchnappschuss001.png.8b16ff4def06c6ce8e3169a4761265db.png

 

public void FixedUpdate ()
	{
		if(rb.velocity.magnitude >= 1.2f)
		{
			"Wie kann ich denn hier das Volumen des "rollen"-Sounds einstellen und ihn im loop-Modus abspielen
		}
	}



private void OnCollisionEnter(Collision collision)
	{
		"Wie kann ich hier den "hit"-Sound mit dem Volumen 1.0 abspielen"
		"Wahrscheinlich geht das dann mit PlayOneShot"
	}

 

Share this post


Link to post
Share on other sites

Wenn du mehrere AudioSources an einem Gameobject nutzen möchtest, weil eines vielleicht einen Dauerton abspielt und ein anderes immer nur manchmal einen Ton abspielt, dann musst du im Script eben genausoviele Referenzen bilden, wie du auch Soundsources hast.

Dafür erzeugst du mehrere Public Variablen vom Typ AudioSource und ziehst dann die Audiosources im Inspector in die entsprechenden Variablenfelder rein.

public AudioSource LoopSound; // entsprechende AudioSource Komponente im Inspector reinziehen
public AudioSource HitSound;

Wenn den Audiosources jetzt jeweils schon eine eigene SoundFile hinzugefügt wären,  könntest du die jetzt je nach Ereignis steuern. Also starten, stoppen, in der Lautstärke verändern usw.

Den LoopSound könntest du schon in der Start() starten, aber eben noch auf stumm schalten. In der Update() würdest du dann evtl. die Lautstärke je nach Geschwindigkeit anpassen.
 

private float volu; // Diese Variable wird für die Lautstärke benötigt.
private float speed; // die Geschwindigkeit deines RB'Ss.

void Start(){
  LoopSound.loop = true; // falls der Haken nicht gesetzt war, setze ich ihn hier
  Loopsound.volume=0f; // erstmal auf stumm schalten
  Loopsound.Play(); // der Sound wird jetzt gestartet
}

void Update(){
  speed = myRB.velocity.magnitude;
  if(speed>20f){
    speed=20f; // maximaler Speed
  }
  volu=speed / 20; // durch den maximalen Speed teilen, damit die Lautstärke bei max Speed auch maximal 1 beträgt
  if(speed < 1.2f){ // nur wenn speed groß genug ist, soll der Sound zu hören sein
   volu=0f;  
  }
  Loopsound.volume=volu; //Wert übergeben
}

Um jetzt einen HitSound abzuspielen, also in deinem Fall die andere Audiosource zu starten, musst du einfach nur mit .Play() der Audiosource sagen, dass sie spielen soll.
Ist der Soundclip fertig gespielt stoppt er automatisch, sofern die Audiosource nicht auf auf Loop gestellt ist.  Und natürlich kannst du auch je nach Gegebenheit unterschiedliche Clips abspielen. Natürlich musst du für die Clips auch Variablen haben und die Clips müssen auch im Inspector den Variablen zugewiesen worden sein.

public AudioClip HitSoundNormal; // im Inspector die Sound Files rinlegen
public AudioClip HitSoundExtrem;

void OnCollisionEnter(Collision other){
  if(other.collider.CompareTag("wall"){ // bei einer Wand wird der normale Sound etwas leiser abgespielt
    HitSound.clip = HitSoundNormal;
    HitSound.volume = 0.5f;
  }
  else{ // alle anderen Kollisionen machen richtig krach 
    Hitsound.clip = HitSoundExtrem;
    Hitsound.volume = 1f;
  }
  Hitsound.Play();

}

 

Share this post


Link to post
Share on other sites
Am 24.3.2020 um 10:08 schrieb malzbie:

Wenn du mehrere AudioSources an einem Gameobject nutzen möchtest, weil eines vielleicht einen Dauerton abspielt und ein anderes immer nur manchmal einen Ton abspielt, dann musst du im Script eben genausoviele Referenzen bilden, wie du auch Soundsources hast.

Naja, halt nicht. Mit PlayOneShot kannst du einen Einmal-Sound von derselben AudioSource abspielen, die den Sound auf Schleife abspielt.

Share this post


Link to post
Share on other sites

Ja, aber  .Play() und .PlayOneShot() zusammen machen Probleme. Außerdem kannst du die Sounds nicht unterschiedlich modifizieren (z.B. in der Lautstärke) weil es eben nur eine Quelle ist.
Deswegen einfach 2 Komponenten rein und gut ist's.
Übrigens: Das gute alte PlayClipAtPoint gibt es ja auch noch. Da wird zwar jedes Mal ein SoundObjekt instanziert, aber das ginge super in seinem Spiel.
Aber auch das habe ich ihm auch nicht angepriesen.

Share this post


Link to post
Share on other sites

Hab's gerade mal ausprobiert... mir war nicht bewusst, dass der Lautstärke-Parameter von PlayOneShot relativ zur Lautstärke der AusioSource gemeint ist... alles klar! :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...