Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
-
stigma
- Messages : 1427
- Inscription : 17 Nov 2012 18:29
- Localisation : Perdu dans les mondes de Myst
-
Contact :
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
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 _______________________/
-
stigma
- Messages : 1427
- Inscription : 17 Nov 2012 18:29
- Localisation : Perdu dans les mondes de Myst
-
Contact :
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é.
-
boubouk50
- ModoGenereux
![ModoGenereux ModoGenereux](./images/ranks/U3DModoGenereux.png)
- Messages : 6255
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
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.
-
jmhoubre
- Messages : 862
- Inscription : 05 Oct 2019 22:05
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;
}
}
-
stigma
- Messages : 1427
- Inscription : 17 Nov 2012 18:29
- Localisation : Perdu dans les mondes de Myst
-
Contact :
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.
-
jmhoubre
- Messages : 862
- Inscription : 05 Oct 2019 22:05
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.
-
stigma
- Messages : 1427
- Inscription : 17 Nov 2012 18:29
- Localisation : Perdu dans les mondes de Myst
-
Contact :
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.