Changer la couleur d'un objet et créer un son lorsqu'il interagit avec un autre ?

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
info3d
Messages : 43
Inscription : 14 Déc 2021 08:50

Changer la couleur d'un objet et créer un son lorsqu'il interagit avec un autre ?

Message par info3d » 26 Déc 2021 20:04

Bonjour,

Je débute tout juste avec unity pour l'utiliser avec de la VR.

A cet stade j'arrive à obtenir une scène où je peux saisir des cubes et les bouger.

Serait-il possible (sans grande complexité car je ne maîtrise pas le logiciel ni le script)
- de faire changer la couleur d'un cube lorsqu'il interagit avec un autre ?
- créer un son lorsque 2 cubes interagissent ?
- éviter qu'ils puissent rentrer l'un dans l'autre (les limiter à se toucher) ?

Merci d'avance pour vos retours.

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

Re: Changer la couleur d'un objet et créer un son lorsqu'il interagit avec un autre ?

Message par jmhoubre » 26 Déc 2021 21:44

Bonsoir,
en supposant que ce soit pareil en VR qu'en 3D (je trouve un peu risqué de démarrer Unity avec la VR, mais c'est ton problème), le plus simple est de créer un script et de l'attacher à tes cubes.

Seul paramétrage à effectuer : créer un tag "DETECT" et ajouter un son dans l'inspecteur pour les objets.

Code : Tout sélectionner

using UnityEngine;

// Impose un BoxCollider, un Rigidbody et une AudioSource à tout objet portant ce script.
[RequireComponent (typeof (BoxCollider))]
[RequireComponent (typeof (Rigidbody))]
[RequireComponent (typeof (AudioSource))]
public class DetectInterAction : MonoBehaviour
{
	// Variables à renseigner dans l'inspecteur.
	[SerializeField] private AudioClip clip;

	// Variables servant de cache aux composants.
	private BoxCollider m_Collider;
	private Rigidbody m_Rigidbody;
	private AudioSource m_audio;
	private Renderer m_renderer;

	// Awake est appelé par Unity à la création de l'objet. L'endroit parfait pour initialiser les composants.
	private void Awake ()
	{
		// Renseigne les caches avec les références des composants.
		m_Collider = GetComponent<BoxCollider> ();
		m_Rigidbody = GetComponent<Rigidbody> ();
		m_audio = GetComponent<AudioSource> ();
		m_renderer = GetComponent<Renderer> ();

		// Colle un tag à l'objet (une sorte d'étiquette). Ne pas oublier de créer ce tag dans l'inspecteur.
		gameObject.tag = "DETECT";

		// Met le collider en mode collision (détecte la collision, ajoute des forces dues au choc, évite qu'un objet pénètre l'autre.).
		m_Collider.isTrigger = false;

		// Supprime la gravité pour que les objets ne tombent pas.
		m_Rigidbody.useGravity = false;

		// Le son est joué par code : on désactive PlayOnAwake (pas sûr que cela soit nécessaire).
		m_audio.playOnAwake = false;
	}

	/// <summary>
	/// Appelé par Unity quand le système physique détecte une collision entre 2 objets avec trigger désactivés.
	/// </summary>
	private void OnCollisionEnter (Collision collision)
	{
		// Si l'autre objet n'a pas le tag, on return.
		if (collision.gameObject.CompareTag ("DETECT") == false)
		{
			return;
		}

		// A ce stade, on a une collision. On peut faire ce que l'on veut :

		// Joue un son (comme l'autre objet détecte aussi, 2 sons seront joués).
		if (clip != null)
		{
			m_audio.PlayOneShot (clip);
		}

		// Change pour une couleur aléatoire.
		Color color = new Color (Random.value, Random.value, Random.value);		
		m_renderer.material.color = color;
	}
}

info3d
Messages : 43
Inscription : 14 Déc 2021 08:50

Re: Changer la couleur d'un objet et créer un son lorsqu'il interagit avec un autre ?

Message par info3d » 27 Déc 2021 08:08

Bonjour,
C'est en effet un peu un démarrage en trombe avec la VR mais je reste sur les bases sans viser de développement complexe.
Merci beaucoup pour le script, je vais faire des tests dans la semaine et je reviendrai donner un retour sur le post suite aux premiers essais.
Bonne journée.

info3d
Messages : 43
Inscription : 14 Déc 2021 08:50

Re: Changer la couleur d'un objet et créer un son lorsqu'il interagit avec un autre ?

Message par info3d » 13 Fév 2022 21:29

Bonsoir,
J'ai dû faire un pause sur mon projet, je reviens dessus.
Je n'ai pas trouvé comment insérer le script et le tag, pourriez-vous m'indiquer comment procéder ou m'indiquer des liens vers des tutos ?
Merci d'avance.

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

Re: Changer la couleur d'un objet et créer un son lorsqu'il interagit avec un autre ?

Message par jmhoubre » 14 Fév 2022 00:17

Bonsoir,

pour le tag : sélectionner le gameObject (cliquer dessus soit dans la fenêtre scene, soit dans la hierarchy). La fenêtre Inspector affiche les données du gameObject. Tout en haut, sous le nom, il y a un champ tag. En ouvrant la boîte déroulante, on voit les tags proposés par Unity, comme Player. Pour ajouter un nouveau tag à cette liste, choisir Add tag ..., La fenêtre Tags & Layers s'affiche. Dans la section Tags, cliquer sur le + pour ajouter un tag, puis cliquer sur Save. Revenir à l'Inspector du gameObject, et sélectionner le tag.

pour le script : il doit hériter de Monobehaviour pour être attaché à un objet (comme le script que j'ai proposé). Sélectionner le gameObject, puis glisser-déposer le script depuis la fenêtre Project vers l'inspector.

info3d
Messages : 43
Inscription : 14 Déc 2021 08:50

Re: Changer la couleur d'un objet et créer un son lorsqu'il interagit avec un autre ?

Message par info3d » 15 Fév 2022 07:09

Bonjour,
Merci beaucoup pour ces précisions, je vais faire des essais dans la semaine.
Bonne journée.

info3d
Messages : 43
Inscription : 14 Déc 2021 08:50

Re: Changer la couleur d'un objet et créer un son lorsqu'il interagit avec un autre ?

Message par info3d » 17 Fév 2022 10:32

Bonjour,
Pour les différentes procédures c'est bon, je pense avoir ajouter correctement le tag et le script.
J'ai cependant cette erreur qui s'affiche :
Assets\cube2.cs(13,40): error CS1513: } expected
Au niveau de la scène, j'ai 4 cubes, et j'ai inséré le tag et le le script sur 2 cubes.

Ci-dessous le script inséré :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// Impose un BoxCollider, un Rigidbody et une AudioSource à tout objet portant ce script.
[RequireComponent(typeof(BoxCollider))]
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(AudioSource))]
public class DetectInterAction : MonoBehaviour
// Impose un BoxCollider, un Rigidbody et une AudioSource à tout objet portant ce script.
[RequireComponent(typeof(BoxCollider))]
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(AudioSource))]
public class DetectInterAction : MonoBehaviour
{
	// Variables à renseigner dans l'inspecteur.
	[SerializeField] private AudioClip clip;

	// Variables servant de cache aux composants.
	private BoxCollider m_Collider;
	private Rigidbody m_Rigidbody;
	private AudioSource m_audio;
	private Renderer m_renderer;

	// Awake est appelé par Unity à la création de l'objet. L'endroit parfait pour initialiser les composants.
	private void Awake()
	{
		// Renseigne les caches avec les références des composants.
		m_Collider = GetComponent<BoxCollider>();
		m_Rigidbody = GetComponent<Rigidbody>();
		m_audio = GetComponent<AudioSource>();
		m_renderer = GetComponent<Renderer>();

		// Colle un tag à l'objet (une sorte d'étiquette). Ne pas oublier de créer ce tag dans l'inspecteur.
		gameObject.tag = "DETECT";

		// Met le collider en mode collision (détecte la collision, ajoute des forces dues au choc, évite qu'un objet pénètre l'autre.).
		m_Collider.isTrigger = false;

		// Supprime la gravité pour que les objets ne tombent pas.
		m_Rigidbody.useGravity = false;

		// Le son est joué par code : on désactive PlayOnAwake (pas sûr que cela soit nécessaire).
		m_audio.playOnAwake = false;
	}

	/// <summary>
	/// Appelé par Unity quand le système physique détecte une collision entre 2 objets avec trigger désactivés.
	/// </summary>
	private void OnCollisionEnter(Collision collision)
	{
		// Si l'autre objet n'a pas le tag, on return.
		if (collision.gameObject.CompareTag("DETECT") == false)
		{
			return;
		}

		// A ce stade, on a une collision. On peut faire ce que l'on veut :

		// Joue un son (comme l'autre objet détecte aussi, 2 sons seront joués).
		if (clip != null)
		{
			m_audio.PlayOneShot(clip);
		}

		// Change pour une couleur aléatoire.
		Color color = new Color(Random.value, Random.value, Random.value);
		m_renderer.material.color = color;
	}
}

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

Re: Changer la couleur d'un objet et créer un son lorsqu'il interagit avec un autre ?

Message par jmhoubre » 17 Fév 2022 18:47

Bonjour,

il manque une accolade fermante dans ton script cube.cs. Le code publié est celui de DetectInterAction. A mon avis, un de tes cubes a un script indésirable.

info3d
Messages : 43
Inscription : 14 Déc 2021 08:50

Re: Changer la couleur d'un objet et créer un son lorsqu'il interagit avec un autre ?

Message par info3d » 17 Fév 2022 20:55

Bonsoir,

Merci pour ce retour, mais je ne peux pas essayer car suite à la création d'une scène plus rien ne fonctionne pour la VR.

Je poursuivrai quand j'aurai résolu le problème posté ici : viewtopic.php?f=2&t=18626

info3d
Messages : 43
Inscription : 14 Déc 2021 08:50

Re: Changer la couleur d'un objet et créer un son lorsqu'il interagit avec un autre ?

Message par info3d » 12 Nov 2022 10:01

Bonjour,
Je reprends ce projet après un standby car j'ai dû en résoudre d'autres (je fais un premier test avec 2 cubes).
Suite à vos retours,
- j'ai bien indiqué "DETECT" dans le "tag" pour les 2 cubes
- dans le script (je l'ai mis à la fin du post) j'ai indiqué "

Code : Tout sélectionner

public class cube : MonoBehaviour
" sachant que le fichier s'appelle "cube.cs"
Cependant, quand je fais le glisser-déposer du script vers le GameObject, j'obtiens le message ci-dessous.
Image
Pourriez-vous m'indiquer comment résoudre ceci ?
Merci d'avance.




ci-dessous le script :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// Impose un BoxCollider, un Rigidbody et une AudioSource à tout objet portant ce script.
[RequireComponent(typeof(BoxCollider))]
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(AudioSource))]
public class cube : MonoBehaviour
// Impose un BoxCollider, un Rigidbody et une AudioSource à tout objet portant ce script.
[RequireComponent(typeof(BoxCollider))]
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(AudioSource))]
public class cube : MonoBehaviour
{
	// Variables à renseigner dans l'inspecteur.
	[SerializeField] private AudioClip clip;

	// Variables servant de cache aux composants.
	private BoxCollider m_Collider;
	private Rigidbody m_Rigidbody;
	private AudioSource m_audio;
	private Renderer m_renderer;

	// Awake est appelé par Unity à la création de l'objet. L'endroit parfait pour initialiser les composants.
	private void Awake()
	{
		// Renseigne les caches avec les références des composants.
		m_Collider = GetComponent<BoxCollider>();
		m_Rigidbody = GetComponent<Rigidbody>();
		m_audio = GetComponent<AudioSource>();
		m_renderer = GetComponent<Renderer>();

		// Colle un tag à l'objet (une sorte d'étiquette). Ne pas oublier de créer ce tag dans l'inspecteur.
		gameObject.tag = "DETECT";

		// Met le collider en mode collision (détecte la collision, ajoute des forces dues au choc, évite qu'un objet pénètre l'autre.).
		m_Collider.isTrigger = false;

		// Supprime la gravité pour que les objets ne tombent pas.
		m_Rigidbody.useGravity = false;

		// Le son est joué par code : on désactive PlayOnAwake (pas sûr que cela soit nécessaire).
		m_audio.playOnAwake = false;
	}

	/// <summary>
	/// Appelé par Unity quand le système physique détecte une collision entre 2 objets avec trigger désactivés.
	/// </summary>
	private void OnCollisionEnter(Collision collision)
	{
		// Si l'autre objet n'a pas le tag, on return.
		if (collision.gameObject.CompareTag("DETECT") == false)
		{
			return;
		}

		// A ce stade, on a une collision. On peut faire ce que l'on veut :

		// Joue un son (comme l'autre objet détecte aussi, 2 sons seront joués).
		if (clip != null)
		{
			m_audio.PlayOneShot(clip);
		}

		// Change pour une couleur aléatoire.
		Color color = new Color(Random.value, Random.value, Random.value);
		m_renderer.material.color = color;
	}
}

Répondre

Revenir vers « Unity le logiciel »