Renseignements sur les gameObjects

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
Totolo33
Messages : 19
Inscription : 08 Sep 2020 01:56

Renseignements sur les gameObjects

Message par Totolo33 » 17 Oct 2020 04:26

Bonsoir,

Je suis débutant dans Unity et pour commencer j'essai de faire des petits jeux en suivant des tutos.
J'ai commencé par faire un petit projet mobile, pour moi afin de découvrir l'utilisation de Blender pour créer mes GameObjects, autres décors et l'utilisation de Unity.

Actuellement j'ai ajouté ma map "lowpoly" et un de mes bâtiments "lowpoly" dans ma scène.
Le jeu se présente sur une map 3D avec des bâtiments 3D mais en vue perspective, l'UI est donc sur ma caméra et on distingue mes boutons et autres ( Xp, Cash,...) sur le premier plan.

Je voudrais savoir s'il est possible de pouvoir cliquer sur mon bâtiment et qu'il m'ouvre un PanelUI ?

En gros en arrière plan mon bâtiment est visible et si j'appuie dessus depuis mon téléphone je voudrais qu'il m'ouvre le panneau me permettant de crafter ou faire les éléments disponible dans mon bâtiment.

Si c'est possible pouvez vous me donner un tuto ou une marche à suivre ?

Merci d'avance

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 8009
Inscription : 30 Juil 2011 13:57
Contact :

Re: Renseignements sur les gameObjects

Message par Max » 17 Oct 2020 10:27

Bonjour,
Totolo33 a écrit :
17 Oct 2020 04:26
Je voudrais savoir s'il est possible de pouvoir cliquer sur mon bâtiment et qu'il m'ouvre un PanelUI ?
Pour selectionner un GameObject on passe souvent par la fonction OnMouseDown().
Tu peux regarder le petit tuto sur le Learn concernant ce sujet: https://learn.unity.com/tutorial/onmousedown#

Après, parmi une foule d'objets, il peut être plus intéressant de passer par les Raycast.
Genre: Select object with Raycast (TouchScreen)
Video traitant du sujet: https://www.youtube.com/watch?v=aTtheFyh7Ac
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

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

Re: Renseignements sur les gameObjects

Message par jmhoubre » 17 Oct 2020 11:49

J'ai fait quelques essais il y a une semaine, Sur une grille, des GameObjects représentent les cases de cette grille. Pour avoir accès à un des objets via la souris, j'ai utilisé 2 méthodes :
  • OnMouseDown, dans un script rattaché à chaque objet ;
  • un Raycast, dans un script rattaché à un objet vide.
Avec 2560 objets, la méthode OnMouseDown coute 9,8 ms par frame, et les raycasts 6 ms. Je n'ai pas mesuré l'impact sur la mémoire, mais je pense que la méthode raycast est moins gourmande (chaque objet doit avoir quelques variables stockées).

Totolo33
Messages : 19
Inscription : 08 Sep 2020 01:56

Re: Renseignements sur les gameObjects

Message par Totolo33 » 17 Oct 2020 15:00

Bonjour,

Merci beaucoup pour vos réponses et les tutos.
Je vais aller voir ça et vous faire un retour.

Merci encore

Totolo33
Messages : 19
Inscription : 08 Sep 2020 01:56

Re: Renseignements sur les gameObjects

Message par Totolo33 » 17 Oct 2020 21:42

Après avoir lu et regardé les Tutos proposés, je vais utiliser sans hésiter les Raycast.

Mais mon souci est que je ne vois pas comment appeler à ouvrir mon panneau UI.

J'ai ajouté un Collideret un RigidBody sur mon Canvas contenant mon bâtiment.
J'ai pris la méthode : if (Input.touchCount > 0), mais je suis perdu pour la suite.

Habituellement pour ouvrir mon panneau j'utilise un bouton avec un bool afin qu'il ouvre ou ferme mon panel.

Comment as tu fais jmhoubre pour accéder a ton objet dans ton panel ?

Merci d'avance

Code : Tout sélectionner

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

    public class OpenAssemblyBuilding : MonoBehaviour
    {
        // Update is called once per frame
        void Update()
        {
            if (Input.touchCount > 0 && Input.touches[0].phase == TouchPhase.Began)
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.touches[0].position);
                RaycastHit hit;

                if (Physics.Raycast(ray, out hit))
                {
                    if (hit.collider != null)
                    {
                        
                    }
                }
            }

#if UNITY_EDITOR // Juste pour tester dans Unity
            if (Input.GetMouseButtonDown(0))
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;

                if (Physics.Raycast(ray, out hit))
                {
                    if (hit.collider != null)
                    {
                    
                    }
                }
            }
        }
#endif
    }

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

Re: Renseignements sur les gameObjects

Message par jmhoubre » 18 Oct 2020 00:27

Bonsoir,

c'est le bâtiment qui doit avoir un collider (le raycast n'a pas besoin de rigidbody).
Le GameObject touché est accessible par les données du hit (souvent hitinfo, comme dans cet exemple). J'ai traité pour un PC, sur un mobile je ne connais pas.

Code : Tout sélectionner

private void DoRayCast () {
	Vector3 mouse = Input.mousePosition;
	Ray ray = cam.ScreenPointToRay (mouse);

	if (Physics.Raycast (ray, out RaycastHit hitInfo)) {
		// Récupère l'objet touché.
		GameObject hitObject = hitInfo.collider.transform.gameObject;

		// On teste le type d'objet touché. Je suppose que ton bâtiment a un script "Building".
		if (hitObject.transform.GetComponent<Building> () != null) {
			DoCraft(hitObject);
		}
	} else {
		// Rien n'a été touché.
		// On fait ce qui doit être fait.
	}
}

Totolo33
Messages : 19
Inscription : 08 Sep 2020 01:56

Re: Renseignements sur les gameObjects

Message par Totolo33 » 20 Oct 2020 01:14

Bonsoir,

Je vais tester ça et revenir vous dire ou ça en est et si cela a fonctionné.

Oui mon GameObject a un script Building

Totolo33
Messages : 19
Inscription : 08 Sep 2020 01:56

Re: Renseignements sur les gameObjects

Message par Totolo33 » 24 Oct 2020 21:06

Bon je ne comprends pas .

J'ai essayé le code, mais rien ne se passe.

En fait ce que je ne comprends pas, mon fbx qui est déjà posé sur mon Wolrd avec le changement de couleur cela fonctionne.

Mais je ne comprends pas comment, ni ou trouver comment lui dire d'ouvrir l'Ui !

Mon building à bien un script building (faut-il que je mette un SetActive ?) mais lorsque je clique dessus rien en se passe.

Je suis perdu, depuis la semaine j'ai essayé plusieurs choses sans succès.
J'avoue que si j'avais juste fait avec uniquement des bouton ca aurait été plus simple, mais moins intéressant.

Mon fichier comprenant le code du raycast doit être sur quoi ? Le building aussi ? (surement que la je me plante)

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

Re: Renseignements sur les gameObjects

Message par jmhoubre » 25 Oct 2020 03:50

Bonsoir,

je suppose que ton Building a 2 enfants : Model (le mesh et son collider), et BuildingCanvas, le canvas de l'UI de ton bâtiment :
Building (script building)
|---Model (collider et mesh du bâtiment)
|---BuildingCanvas (canvas de l'UI de craft du bâtiment)

Le premier bout de code proposé devrait être dans un script attaché à un Empty que tu peux appeler MouseManager (l'empty et son script), qui ressemble à ceci :

Code : Tout sélectionner

using UnityEngine;

public class MouseManager : MonoBehaviour
{
	private Camera cam;

	private void Awake ()
	{
		cam = Camera.main;
	}

	private void Update ()
	{
		// Teste si on a cliqué quelque part.
		if (Input.GetMouseButtonDown (0))
		{
			// Si oui, on tire un raycast pour savoir si on a touché un building.
			DoRayCast ();
		}
	}

	private void DoRayCast ()
	{
		// DoRayCast devrait être dans le script du bâtiment, mais il est 4h du matin...
		// Edit à 23h50 : après réflexion, DoRayCast () est bien là où elle est,
		// Surtout si on veut pouvoir exploiter des Raycasts sur d'autres GameObjects.
		Vector3 mouse = Input.mousePosition;
		Ray ray = cam.ScreenPointToRay (mouse);

		if (Physics.Raycast (ray, out RaycastHit hitInfo))
		{
			// Récupère l'objet touché, ie le père du gameObject possédant le collider.
			GameObject hitObject = hitInfo.collider.transform.parent.gameObject;

			// On teste le type d'objet touché.
			if (hitObject.transform.GetComponent<Building> () != null)
			{
				// C'est un building : on ouvre l'UI.
				hitObject.GetComponent<Building>().OpenUI ();
			}
		}
		else
		{
			// Rien n'a été touché.
			// On fait ce qui doit être fait.
		}
	}
}

Le building a un script Building qui ressemble à ceci :

Code : Tout sélectionner

using UnityEngine;

public class Building : MonoBehaviour
{
    [SerializeField] private Canvas buildingCanvas;
    
    private void Awake ()
    {
        buildingCanvas = gameObject.GetComponentInChildren<Canvas> ();
        buildingCanvas.enabled = false;
    }

    public void OpenUI ()
	{
        	buildingCanvas.enabled = true;
	}
}
,
Dernière édition par jmhoubre le 26 Oct 2020 00:54, édité 2 fois.

Totolo33
Messages : 19
Inscription : 08 Sep 2020 01:56

Re: Renseignements sur les gameObjects

Message par Totolo33 » 25 Oct 2020 21:13

Merci beaucoup pour ta réponse.

Je vais tester tout ça et te faire un retour sur ce qu'il en est.

Mon erreur est que je n'avais pas mis le buildingCanvas sur le Building il était je ne sais pas ou (je ne le trouve pas ::d ).

Merci beaucoup pour le détail aussi de tes explications ça m'aide beaucoup car étant débutant tout n'est pas limpide. :)

Je te ferai un retour sur ça.

Répondre

Revenir vers « Unity le logiciel »