Bouger un gameObject à la fois

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Guigui
Messages : 6
Inscription : 21 Fév 2017 15:32

Bouger un gameObject à la fois

Message par Guigui » 21 Fév 2017 20:06

Bonjour, je me retrouve confronté face à un problème sur Unity. J'ai mis deux cubes sur ma scène et je leur ait ajouté deux scripts respectifs permettant de les déplacer avec les touches directionnelles du clavier. Cependant lorsque je lance le jeu je ne peux bouger que mon premier cube. Le problème est que je voudrais que Unity me détecte quand je clique avec la souris sur l'autre cube. C'est-à-dire que quand je clique sur mon deuxième cube je peux bouger celui-ci mais aussi que je ne puisse plus bouger le premier cube.
Quelqu'un aurait-il une idée ?
Merci d'avance.

nigel
Messages : 166
Inscription : 05 Mai 2015 01:51

Re: Bouger un gameObject à la fois

Message par nigel » 21 Fév 2017 21:01

Une instance static de ta classe script.
Dans la fonction OnMouseClick cette instance prend le script courant en référence.
Dans le fonction d'Update, les input travaillent sur l'instance static.
C'est a dire que tu vérifie dans l'update si les ref sont les mêmes avec comparaison ID
ça explose -> Atomic Command
ca vole -> Long Range Black Cat

Guigui
Messages : 6
Inscription : 21 Fév 2017 15:32

Re: Bouger un gameObject à la fois

Message par Guigui » 21 Fév 2017 21:31

Euh j'ai du mal à comprendre parce que du coup quand je détecte le clic sur mon gameobject et qu'ensuite je veux l'avancer et bah je n'ai pas le temps d'appuyer sur les touches du clavier. J'ai essayé de mettre une temporisation à la fin du void (OnMouseDown) mais ça n'as pas fonctionné. Voici mon code :

Code : Tout sélectionner

    void Update()
    {
        OnMouseDown();

    }
    void OnMouseDown()
    {
        if (Input.GetMouseButtonDown(0)){
            Vector3 move = new Vector3();
            if (Input.GetKey(KeyCode.UpArrow))
            {
                move.z += 0.1f;
            }
            if (Input.GetKey(KeyCode.DownArrow))
            {
                move.z -= 0.1f;
                // Destroy(gameObject);
            }
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                move.x -= 0.1f;
            }
            if (Input.GetKey(KeyCode.RightArrow))
            {
                move.x += 0.1f;
            }
            // déplacement du fou
            if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.RightArrow))
            {
                move.x += 0.1f;
                move.z += 0.1f;
            }
            if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.LeftArrow))
            {
                move.x -= 0.1f;
                move.z += 0.1f;
            }
            if (Input.GetKey(KeyCode.DownArrow) && Input.GetKey(KeyCode.RightArrow))
            {
                move.x += 0.1f;
                move.z -= 0.1f;
            }
            if (Input.GetKey(KeyCode.DownArrow) && Input.GetKey(KeyCode.LeftArrow))
            {
                move.x -= 0.1f;
                move.z -= 0.1f;
            }

            transform.position += move;
        }

    }
:!: Les balises code SVP :!:
Merci de lire la Netiquette.

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Bouger un gameObject à la fois

Message par ZJP » 21 Fév 2017 22:04

Script a coller sur une Camera (par exemple). Les autres GOs doivent comporter un Collider. Cela fonctionne, j'ai essayé.

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class moveme : MonoBehaviour {

private Transform objectHit;
private Vector3 move = new Vector3(0.0f,0.0f,0.0f);

	void Update(){

		if (Input.GetMouseButtonDown(0)){
			Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
			RaycastHit hit;
			if (Physics.Raycast (ray, out hit)) objectHit = hit.transform;
		}
		
		if(objectHit != null){
			
			move = objectHit.position;

			if (Input.GetKey(KeyCode.UpArrow))
			{
				move.z += 0.1f;
			}
			if (Input.GetKey(KeyCode.DownArrow))
			{
				move.z -= 0.1f;
			}
			if (Input.GetKey(KeyCode.LeftArrow))
			{
				move.x -= 0.1f;
			}
			if (Input.GetKey(KeyCode.RightArrow))
			{
				move.x += 0.1f;
			}
			// déplacement du fou
			if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.RightArrow))
			{
				move.x += 0.1f;
				move.z += 0.1f;
			}
			if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.LeftArrow))
			{
				move.x -= 0.1f;
				move.z += 0.1f;
			}
			if (Input.GetKey(KeyCode.DownArrow) && Input.GetKey(KeyCode.RightArrow))
			{
				move.x += 0.1f;
				move.z -= 0.1f;
			}
			if (Input.GetKey(KeyCode.DownArrow) && Input.GetKey(KeyCode.LeftArrow))
			{
				move.x -= 0.1f;
				move.z -= 0.1f;
			}

			objectHit.position = move;
		}
	}

}


nigel
Messages : 166
Inscription : 05 Mai 2015 01:51

Re: Bouger un gameObject à la fois

Message par nigel » 21 Fév 2017 22:29

Code : Tout sélectionner

public class Cube : MonoBehaviour
{
    public float Vitesse = 1;
    private  static Cube instance;

    private void Start()
    {
        instance = this;
    }

    void Update()
    {

        if (this.GetInstanceID() == instance.GetInstanceID())
        {
            transform.position += new Vector3(Input.GetAxis("Horizontal"),
                                              0,
                                              Input.GetAxis("Vertical")) * Time.deltaTime * Vitesse;
        }

    }

    private void OnMouseDown()
    {
        instance = this;
    }
}
J'ai édité avec une vitesse
ça explose -> Atomic Command
ca vole -> Long Range Black Cat

Guigui
Messages : 6
Inscription : 21 Fév 2017 15:32

Re: Bouger un gameObject à la fois

Message par Guigui » 21 Fév 2017 23:12

Euh c'est quoi exactement le Ray et le Hit ? Et c'était pas possible de mettre une temporisation dans mon update pour me laisser le temps d'appuyer sur le clavier ?

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Bouger un gameObject à la fois

Message par ZJP » 21 Fév 2017 23:34

Guigui a écrit :Euh c'est quoi exactement le Ray et le Hit ? Et c'était pas possible de mettre une temporisation dans mon update pour me laisser le temps d'appuyer sur le clavier ?
Tu as essayé le code?! :?

Guigui
Messages : 6
Inscription : 21 Fév 2017 15:32

Re: Bouger un gameObject à la fois

Message par Guigui » 21 Fév 2017 23:53

Merci beaucoup ça marche à la perfection ! Mais je voudrais juste savoir en quoi consiste cette ligne de code si cela ne vous embête pas :

Code : Tout sélectionner

private Transform objectHit;
    private Vector3 move = new Vector3(0.0f, 0.0f, 0.0f);

    void Update()
    {

        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit)) objectHit = hit.transform;
        }

        if (objectHit != null)
        {

            move = objectHit.position;
:!: Les balises code SVP (2 fois) :!:
Merci de lire la Netiquette.

Merci encore !

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Bouger un gameObject à la fois

Message par ZJP » 22 Fév 2017 15:19

Guigui a écrit :

Code : Tout sélectionner

        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit)) objectHit = hit.transform;
        }
Fait un Raycast à la position de la souris. Le résultat du Raycast se trouve dans hit. On peut ainsi récupérer le Transform de l'objet cliqué.

Code : Tout sélectionner

        if (objectHit != null)
        {

            move = objectHit.position;
            
   
Vérification qu'un objet a bien été sélectionné avant de poursuivre. On prend alors sa position actuelle avant d’appliquer les nouveaux déplacements.
Move est déclarée une bonne fois pour toute car je suis un allergique au New. J'aurai tout aussi bien pu l'appeler tempoV3 et m'en servir pour autre chose. Astuce de vieux dev. :mrgreen:

Répondre

Revenir vers « Scripting »