Page 1 sur 1

Bouger un gameObject à la fois

Publié : 21 Fév 2017 20:06
par Guigui
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.

Re: Bouger un gameObject à la fois

Publié : 21 Fév 2017 21:01
par nigel
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

Re: Bouger un gameObject à la fois

Publié : 21 Fév 2017 21:31
par Guigui
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.

Re: Bouger un gameObject à la fois

Publié : 21 Fév 2017 22:04
par ZJP
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;
		}
	}

}


Re: Bouger un gameObject à la fois

Publié : 21 Fév 2017 22:29
par nigel

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

Re: Bouger un gameObject à la fois

Publié : 21 Fév 2017 23:12
par Guigui
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 ?

Re: Bouger un gameObject à la fois

Publié : 21 Fév 2017 23:34
par ZJP
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?! :?

Re: Bouger un gameObject à la fois

Publié : 21 Fév 2017 23:53
par Guigui
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 !

Re: Bouger un gameObject à la fois

Publié : 22 Fév 2017 15:19
par ZJP
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: