Page 1 sur 1

[Résolu]Ajouter un son

Publié : 03 Sep 2023 18:56
par stigma
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;
		}
	}  
}  

Re: Ajouter un son

Publié : 03 Sep 2023 19:21
par djulio74
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...

Re: Ajouter un son

Publié : 04 Sep 2023 08:40
par stigma
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é.

Re: Ajouter un son

Publié : 04 Sep 2023 11:02
par boubouk50

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.

Re: [Résolu]Ajouter un son

Publié : 04 Sep 2023 14:02
par jmhoubre
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;
	}
}

Re: [Résolu]Ajouter un son

Publié : 04 Sep 2023 18:15
par stigma
ça marche bien, sauf que le son n'est pas coupé lorsque le joueur sort de l'eau.

Re: [Résolu]Ajouter un son

Publié : 04 Sep 2023 21:35
par jmhoubre
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.

Re: [Résolu]Ajouter un son

Publié : 05 Sep 2023 08:23
par stigma
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.