Je codifie dans Unity et, fondamentalement, j'ai un personnage avec une bombe aérosol. Lorsque je maintiens le bouton mouse1 enfoncé, je veux que mon "Spraycan" retentisse.
Je l'ai essayé dans une mise à jour vide, puis j'obtiens plusieurs du même son empilés les uns sur les autres.
using UnityEngine.Audio;
using System;
using UnityEngine;
public class AudioManager : MonoBehaviour
{
public Sound[] sounds;
public static AudioManager instance;
void Awake()
{
if (instance == null)
instance = this;
else
{
Destroy(gameObject);
return;
}
DontDestroyOnLoad(gameObject);
foreach (Sound s in sounds)
{
s.source = gameObject.AddComponent<AudioSource>();
s.source.clip = s.clip;
s.source.volume = s.volume;
s.source.pitch = s.pitch;
s.source.loop = s.loop;
}
}
void Start()
{
Play("Theme");
}
public void Play (string name)
{
Sound s = Array.Find(sounds, sound => sound.name == name);
if (s == null)
{
Debug.LogWarning("Sound: " + name + "not found!");
return;
}
s.source.Play();
}
}
EDIT: Mon AudioManager est complètement arraché du tutoriel de Brackeys et ressemble à ceci:
void Update()
{
if (Input.GetButton("Fire1"))
{
FindObjectOfType<AudioManager>().Play("Spraycan");
}
else if (Input.GetButtonUp("Fire1"))
{
//STOP SOUND HERE
}
}
4 Réponses :
La fonction de mise à jour se déclenchera presque en continu, comme chaque image ou quelque chose (je ne me souviens pas de son intervalle) Vous devez utiliser un événement spécifique au bouton lorsque vous appuyez dessus. Utilisez ensuite un indicateur pour indiquer que le son est en cours de lecture afin de ne pas démarrer une autre lecture. Lorsque la lecture est interrompue, recommencez. Tant que l'utilisateur n'a pas relâché le bouton, vous avez envoyé l'indicateur sur false et arrêter le son.
Quelque chose comme ceci:
if (Input.GetButtonDown("fire1")
AudioManager.Play
if (Input.GetButtonUp("fire1")
AudioManager.Stop
Cet AudioManager doit avoir une méthode Stop (). qui appelle la méthode .Stop () de l'AudioSource. Si ce n'est pas le cas, créez-le.
S'il vous plaît voir mon EDIT!
Sam,
La moitié de la clé de la programmation est d'apprendre à trouver des choses.
Si vous consultez le manuel unity sur audiosource https://docs.unity3d.com/ ScriptReference / AudioSource.html
Vous verrez d'où viennent les brackeys "play" ... et regardez ce qu'il y a d'autre ... Que voyez-vous qui sonne remarquablement comme si cela arrête la lecture de la source?
Voyez si vous pouvez créer votre propre fonction d'arrêt pour cela.
Je suis sûr que j'ai besoin de changer le vide OnGUI, mais je ne vois vraiment pas comment ... C # et Unity est tout nouveau pour moi
non, la mise à jour que vous aviez était bien .. il vous suffit d'ajouter un peu au gestionnaire audio avec les indices ci-dessus
Tout d'abord, vous devez définir une méthode d'arrêt dans votre classe AudioManager . Quelque chose comme ça (NON TESTÉ):
void Update()
{
//Get Button will fire this continuously as you keep it pressed.
//Consider using GetButtonDown, or implement delayed repetition.
if (Input.GetButton("Fire1"))
{
FindObjectOfType<AudioManager>().Play("Spraycan");
}
else if (Input.GetButtonUp("Fire1"))
{
FindObjectOfType<AudioManager>().Stop("Spraycan");
}
}
Et puis implémentez-le en tant que tel:
using UnityEngine.Audio;
using System;
using UnityEngine;
public class AudioManager : MonoBehaviour
{
public Sound[] sounds;
public static AudioManager instance;
void Awake() { ... }
void Start() { ... }
public void Play(string name) { ... }
public void Stop(string name) {
Sound s = Array.Find(sounds, sound => sound.name == name);
if (s == null)
{
Debug.LogWarning("Sound: " + name + "not found!");
return;
}
s.source.Stop();
}
}
Remarque: il y a des choses dans votre code qui nuisent à l’efficacité:
Si vous utilisez un Dictionary au lieu d'un Array pour vos sons, votre recherche sera beaucoup plus rapide.
Attribuez FindObjectOfType à une variable dans Start () et évitez de la rechercher constamment lorsque l'utilisateur appuie sur le bouton de la souris. p>
Je n'entrerai pas trop dans les détails car cela n'a aucun rapport avec la question.
Note secondaire 2: Je suis entièrement d'accord avec la réponse de BugFinder. Pour devenir un meilleur programmeur, vous devez lentement commencer à apprendre à naviguer dans la documentation de l'API et à trouver ce que vous recherchez.
Merci pour cette réponse. J'ai tout mis en œuvre et je n'obtiens aucune erreur, mais le son ne se déclenche pas.
Et pour clarifier, je suis également à 100% d'accord pour trouver une solution avant de la poster ici sur SO. Je viens de commencer à faire cela et je suis allé loin avec mon projet même sans aucune expérience préalable du codage. Cela m'a coincé toute la journée et je ne peux pas continuer sans ce problème résolu
Oh ça marche! J'ai fait une petite erreur. Merci beaucoup!
qu'avez-vous essayé? à part les déclarations if, qu'avez-vous essayé de l'arrêter?
Je suis complètement nouveau sur C # donc la seule chose que j'ai essayée au lieu de "// STOP SOUND ICI" est "return;". Cela n'a pas fonctionné évidemment
aucun retour ne sort de cette fonction.