minuschki Geschrieben 21. März 2020 Melden Share Geschrieben 21. März 2020 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 } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 22. März 2020 Melden Share Geschrieben 22. März 2020 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
minuschki Geschrieben 23. März 2020 Autor Melden Share Geschrieben 23. März 2020 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 (); } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 23. März 2020 Melden Share Geschrieben 23. März 2020 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
minuschki Geschrieben 23. März 2020 Autor Melden Share Geschrieben 23. März 2020 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! 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" } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 24. März 2020 Melden Share Geschrieben 24. März 2020 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(); } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
minuschki Geschrieben 24. März 2020 Autor Melden Share Geschrieben 24. März 2020 Besten Dank für die Antwort! Das hilft mir doch schon sehr. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 25. März 2020 Melden Share Geschrieben 25. März 2020 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 25. März 2020 Melden Share Geschrieben 25. März 2020 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 25. März 2020 Melden Share Geschrieben 25. März 2020 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! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.