[Résolu]Ajouter un son

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
stigma
Messages : 1414
Inscription : 17 Nov 2012 18:29
Localisation : Perdu dans les mondes de Myst
Contact :

[Résolu]Ajouter un son

Message par stigma » 03 Sep 2023 18:56

J'ai ce script qui fonctionne très bien, lorsque le joueur plonge dans l'eau, j'ai l'effet désiré.
Mais je n'arrive pas à ajouter un son. ça ne fonctionne plus du tout. Ce sont les lignes //*****

Code : Tout sélectionner

// And Define variable underwaterLevel up  
	// to your water level or sea level Y-coordinate  
	public float underwaterLevel = 163.9F;
	//*****public AudioClip Underwatersound;

    // These variable to store  
    // The scene default fog settings  
    private bool defaultFog = true;  
	private Color defaultFogColor;  
	private float defaultFogDensity;  
	private Material defaultSkybox;  
	private float defaultStartDistance;  
	
	void Start () {  
		// store default fog setting  
		// we need to restore fog setting  
		// after we go to surface again  
		defaultFog = RenderSettings.fog;  
		defaultFogColor = RenderSettings.fogColor;  
		defaultFogDensity = RenderSettings.fogDensity;  
		defaultSkybox = RenderSettings.skybox;  
		defaultStartDistance = RenderSettings.fogStartDistance;  
		
		// set the background color  
		GetComponent<Camera>().backgroundColor = new Color(0, 0.8f, 0.9f, 1);  
	}

	void Update() {
		if (transform.position.y < underwaterLevel) {
			RenderSettings.fog = true;
			RenderSettings.fogColor = new Color(0, 0.47f, 0.52f, 0.45f);
			RenderSettings.fogDensity = 0.155f;
			RenderSettings.fogStartDistance = 0.0f;

			//*****GetComponent<AudioSource>().clip = Underwatersound;
			//*****GetComponent<AudioSource>().Play();
		} else {
			RenderSettings.fog = defaultFog;
			RenderSettings.fogColor = defaultFogColor;
			RenderSettings.fogDensity = defaultFogDensity;
			RenderSettings.skybox = defaultSkybox;
			RenderSettings.fogStartDistance = defaultStartDistance;
		}
	}  
}  
Dernière édition par stigma le 04 Sep 2023 10:43, édité 1 fois.

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: Ajouter un son

Message par djulio74 » 03 Sep 2023 19:21

Bonjour,

juste à voir le code comme ça, un soucis déjà, c'est que tu assigne et lance la lecture de l'audio en permanence dans l'Update, tant que ton perso est sous l'eau..

il faut détecter le moment ou ton joueur passe sous l'eau et n'attribuer l'audio et Play une seule fois à ce moment là uniquement.
d'ailleurs il en va de même pour le reste de ta void Update, tu attribue des éléments du render setting en permanence dans l'update...

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
stigma
Messages : 1414
Inscription : 17 Nov 2012 18:29
Localisation : Perdu dans les mondes de Myst
Contact :

Re: Ajouter un son

Message par stigma » 04 Sep 2023 08:40

Ce n'est pas de moi. C'est un script qui fonctionne sans les 3 lignes que j'ai ajoutées. Je ne suis pas fortiche, d'habitude j'utilise Playmaker.

Edit:
Bon du coup j'utilise Playmaker en complément pour le son. C'est donc réglé.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Ajouter un son

Message par boubouk50 » 04 Sep 2023 11:02

Code : Tout sélectionner

// And Define variable underwaterLevel up  
	// to your water level or sea level Y-coordinate  
	public float underwaterLevel = 163.9F;
	public AudioClip Underwatersound;

    // These variable to store  
    // The scene default fog settings  
    private bool defaultFog = true;  
	private Color defaultFogColor;  
	private float defaultFogDensity;  
	private Material defaultSkybox;  
	private float defaultStartDistance;  
	
	// Booleen d etat -> est ce que le personnage est dans l eau ou non
	private bool isUnderwater = false;
	
	void Start () {  
		// store default fog setting  
		// we need to restore fog setting  
		// after we go to surface again  
		defaultFog = RenderSettings.fog;  
		defaultFogColor = RenderSettings.fogColor;  
		defaultFogDensity = RenderSettings.fogDensity;  
		defaultSkybox = RenderSettings.skybox;  
		defaultStartDistance = RenderSettings.fogStartDistance;  
		
		// set the background color  
		GetComponent<Camera>().backgroundColor = new Color(0, 0.8f, 0.9f, 1);  
	}

	void Update() {
		// Si le personnage est dans l eau
		if (transform.position.y < underwaterLevel) {
			// et s il n etait pas dans l eau
			if (!isUnderwater)
			{
				// le personnage est defini comme dans l eau
				isUnderwater = true;
				// changement des settings
				OnStateChanged ();
			}
		} else {
			// sinon si le personnage est hors de l eau et qu il etait dans l eau
			if (isUnderwater)
			{
				// le personnage est defini comme hors de l eau
				isUnderwater = false;
				// changement des settings
				OnStateChanged ();
			}
		}
	}
	
	// Fonction appelee quand le personnage entre ou sort de l eau uniquement
	void OnStateChanged ()
	{
		// s il est dans l eau
		if (isUnderwater ) {
			RenderSettings.fog = true;
			RenderSettings.fogColor = new Color(0, 0.47f, 0.52f, 0.45f);
			RenderSettings.fogDensity = 0.155f;
			RenderSettings.fogStartDistance = 0.0f;
			
			// Jouer le son Underwatersound
			GetComponent<AudioSource>().clip = Underwatersound;
			GetComponent<AudioSource>().Play();
		// sinon
		} else {
			RenderSettings.fog = defaultFog;
			RenderSettings.fogColor = defaultFogColor;
			RenderSettings.fogDensity = defaultFogDensity;
			RenderSettings.skybox = defaultSkybox;
			RenderSettings.fogStartDistance = defaultStartDistance;
			// stopper le son
			GetComponent<AudioSource>().Stop();
		}
	}  
}  
Succinctement, voici ce que le script doit faire : détecter le moment ou le personnage entre ou sort de l'eau pour lancer ou stopper le son. Seul le test est en continu, le reste se joue à un seul moment.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
jmhoubre
Messages : 859
Inscription : 05 Oct 2019 22:05

Re: [Résolu]Ajouter un son

Message par jmhoubre » 04 Sep 2023 14:02

As-tu ajouté un composant AudioSource à ton script?

Voici une proposition testée, très semblable à celle de Boubouk. J'ai essayé d'améliorer sa lisibilité. J'ai donc défini plusieurs fonctions et alléger les fonctions Start et Update.

Code : Tout sélectionner

using UnityEngine;

[RequireComponent (typeof (AudioSource))] // Ceci évite d'oublier ce composant essentiel pour jouer un son.
public class Underwater : MonoBehaviour
{
	// Ces variables n'ont pas à être publiques.
	[SerializeField] private float underwaterLevel = 163.9F;
	[SerializeField] private AudioClip underWaterSound;

	// Scene default fog settings 
	private bool defaultFog = true;
	private Color defaultFogColor;
	private float defaultFogDensity;
	private Material defaultSkybox;
	private float defaultStartDistance;

	private AudioSource audioSource;
	private bool isUnderWater = false;

	private void Start ()
	{
		SaveFogDefaultSettings (); // Pas besoin de commenter : le nom de cette fonction est suffisant.

		// Set sound.
		audioSource = GetComponent<AudioSource> ();
		audioSource.clip = underWaterSound; // Pas la peine de le faire dans l'Update.

		// Set the background color.
		GetComponentInChildren<Camera> ().backgroundColor = new Color (0, 0.8f, 0.9f, 1); // Je suppose que la caméra est un enfant du joueur.
	}

	private void Update ()
	{
		if (transform.position.y < underwaterLevel && isUnderWater == false)
		{
			isUnderWater = true;
			SetFogToUnderwater ();

			audioSource.Play (); // Éviter l'usage de GetComponent dans l'Update et le mettre en cache.
		}
		else if (transform.position.y > underwaterLevel && isUnderWater == true)
		{
			isUnderWater = false;
			RestoreFogDefaultSettings ();
		}
	}

	private void SetFogToUnderwater ()
	{
		RenderSettings.fog = true;
		RenderSettings.fogColor = new Color (0, 0.47f, 0.52f, 0.45f);
		// A mon avis, fogDensity et fogStartDistance ne fonctionnent pas ensemble : fogStartDistance pour le mode Linear, et fogDensity pour les 2 autres modes.
		RenderSettings.fogDensity = 0.155f;
		RenderSettings.fogStartDistance = 0.0f;
	}

	private void SaveFogDefaultSettings ()
	{
		defaultFog = RenderSettings.fog;
		defaultFogColor = RenderSettings.fogColor;
		defaultFogDensity = RenderSettings.fogDensity;
		defaultSkybox = RenderSettings.skybox;
		defaultStartDistance = RenderSettings.fogStartDistance;
	}

	private void RestoreFogDefaultSettings ()
	{
		RenderSettings.fog = defaultFog;
		RenderSettings.fogColor = defaultFogColor;
		RenderSettings.fogDensity = defaultFogDensity;
		RenderSettings.skybox = defaultSkybox;
		RenderSettings.fogStartDistance = defaultStartDistance;
	}
}

Avatar de l’utilisateur
stigma
Messages : 1414
Inscription : 17 Nov 2012 18:29
Localisation : Perdu dans les mondes de Myst
Contact :

Re: [Résolu]Ajouter un son

Message par stigma » 04 Sep 2023 18:15

ça marche bien, sauf que le son n'est pas coupé lorsque le joueur sort de l'eau.

Avatar de l’utilisateur
jmhoubre
Messages : 859
Inscription : 05 Oct 2019 22:05

Re: [Résolu]Ajouter un son

Message par jmhoubre » 04 Sep 2023 21:35

Le son n'est pas coupé, parce qu'à aucun moment cela n'a été demandé. Pour mes essais, j'avais un son genre "plouf", assez court, et je n'avais pas ce problème.

Pour couper le son, dans l'update, et dans la branche du else if, il suffit de mettre audioSource.Stop().

Si tu ne fais pas l'effort d'apprendre les bases, et que tu continues à bricoler des scripts sans comprendre, tu n'arriveras à rien.

Avatar de l’utilisateur
stigma
Messages : 1414
Inscription : 17 Nov 2012 18:29
Localisation : Perdu dans les mondes de Myst
Contact :

Re: [Résolu]Ajouter un son

Message par stigma » 05 Sep 2023 08:23

jmhoubre a écrit :
04 Sep 2023 21:35
Si tu ne fais pas l'effort d'apprendre les bases, et que tu continues à bricoler des scripts sans comprendre, tu n'arriveras à rien.
Pas faux, je vais faire des efforts.

Répondre

Revenir vers « Scripting »