Manipuler les composants

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Johny Boy
Messages : 15
Inscription : 28 Sep 2016 12:01

Manipuler les composants

Message par Johny Boy » 29 Sep 2016 16:21

HELLO WORLD !

Dans ma scene j'ai une caméra et un monstre.
Ma camera possède le composant audio source.
Sur le monstre j'ai un script.

Dans ce script j'aimerais récupérer le composant audio source de la camera.
Donc vous allez me dire:
public AudioSource source;
Ce qui à pour effet de mettre la caméra sur le script du monstre via un drag and drop.
Le problème, c'est que si je supprime le monstre (qui est un prefab), et que je l'instancie, comment je fais pour mettre la camera dans cette variable ? Sachant qu'un objet qui est sur la scene ne peut pas être placé sur un script de prefab.

Je sais pas si j'ai été clair mais j'ai besoin d'aide je cherche depuis plus de deux h maintenant ^^

J'ai essayé ça:

Code : Tout sélectionner

GameObject camera = GameObject.Find ("Main Camera");
AudioSource source = camera.GetComponent<AudioSource>();
 ! Message de : boubouk50
Balise CODE svp
Mais j'ai cette erreur:
Assets/myScript/trigger.cs(9,30): error CS0236: A field initializer cannot reference the nonstatic field, method, or property `trigger.camera'

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

Re: Manipuler les composants

Message par boubouk50 » 29 Sep 2016 16:42

Pour récupérer la main caméra, ne passe pas par un Find().
Passe par le tag MainCamera (avec un FindWithTag) ou bien directement par Camera.main

Classe Camera qui te donnera tout ce que tu peux avoir sur la caméra.
"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

Johny Boy
Messages : 15
Inscription : 28 Sep 2016 12:01

Re: Manipuler les composants

Message par Johny Boy » 29 Sep 2016 17:36

Ok Donc la solution:

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class trigger : MonoBehaviour {

	public AudioClip clip;

	GameObject cam;

	void OnTriggerEnter(Collider col){
		if (col.name == "bullet"){
			cam = GameObject.Find("Main Camera");
			cam.GetComponent<AudioSource> ().PlayOneShot (clip);
			print ("collision"); // Pour tester la collision
		} 
	}
}
 ! Message de : boubouk50
Allez Johny Boy! Fais un effort. Les balises CODE
Script qui est placé sur le monstre qui lui même est spawn.

Effectivement en passant par le tag ça fonctionne aussi.
J'ai galéré parce que cette ligne:
cam = GameObject.Find("Main Camera");
je l'ai placé dans la fonction start et quand on instancie ça marche pas et c'est logique en faite ^^
Puisque start ne se fait qu'une fois alors qu'on spawn plusieurs fois. Enfin je crois ^^

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

Re: Manipuler les composants

Message par boubouk50 » 29 Sep 2016 17:45

C'est une solution, mais comme je te l'ai dit, il vaut mieux utiliser les accès directs:

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class trigger : MonoBehaviour {

   public AudioClip clip;

   void OnTriggerEnter(Collider col){
      if (col.name == "bullet"){
         Camera.main.GetComponent<AudioSource> ().PlayOneShot (clip);
         print ("collision"); // Pour tester la collision
      } 
   }
}
ou bien, tu si tu déclares ta cam en GameObject public, tu n'as pas besoin de la trouver!

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class trigger : MonoBehaviour {

   public AudioClip clip;

   public GameObject cam; //Là, tu mets ta caméra dans l'inspecteur ou bien tu vas la chercher dans le Start ()

   /*void Start () {
        cam = Camera.main.gameobject;
   }*/

   void OnTriggerEnter(Collider col){
      if (col.name == "bullet"){
         cam.GetComponent<AudioSource> ().PlayOneShot (clip);
         print ("collision"); // Pour tester la collision
      } 
   }
}
Il faut éviter les Find (). C'est gourmand, il va parcourir ta scène pour trouver ton GameObject. Un Find (), ça se fait une fois et tu stockes.
"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

Johny Boy
Messages : 15
Inscription : 28 Sep 2016 12:01

Re: Manipuler les composants

Message par Johny Boy » 29 Sep 2016 18:50

Ok ouai merci boubouk50 je vais suivre ta technique.

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Manipuler les composants

Message par Moi 1971 » 30 Sep 2016 20:44

Bonjour,
J’interviens pour poser une question d'ordre fonctionnel. Pourquoi la source du bruit est placée sur la caméra?
La caméra étant considérée comme l’œil du joueur, son oreille n'est pas loin. Mettre à proximité le bruit qui est normalement émit à une certaine distance fait perdre tous les avantages de l'utilisation des AudioSource dans Unity : volume en fonction de la distance, stéréo, etc.

Johny Boy
Messages : 15
Inscription : 28 Sep 2016 12:01

Re: Manipuler les composants

Message par Johny Boy » 02 Oct 2016 13:25

Ta question viens de me faire comprendre tout un tas de chose ! Ça prouve qu'il y à encore beaucoup à apprendre.
Merci à toi ;)

Avatar de l’utilisateur
Iwa
Messages : 1131
Inscription : 25 Avr 2012 16:20
Contact :

Re: Manipuler les composants

Message par Iwa » 12 Oct 2016 11:56

Hello,

Est-ce que ton problème est résolu? Si c'est le cas merci de mettre [RESOLU] dans le premier message de ton post.
"N'est stupide que la stupidité Monsieur..." - Forest Gump
... sauf si tu lis pas ça :)

Si tu as tout ce qu'il te faut, merci de penser à basculer ton sujet en [RESOLU] en éditant ton tout premier post ;)

Répondre

Revenir vers « Scripting »