[RESOLU][BD-AL] Déplacer un élément avec la souris

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
polmpolm123
Messages : 30
Inscription : 23 Déc 2016 15:15

[RESOLU][BD-AL] Déplacer un élément avec la souris

Message par polmpolm123 » 25 Avr 2017 16:55

Bonjour,

Je voudrais déplacer un élément de la scène de jeu (game) avec la souris.
J'ai fais cette méthode là

Code : Tout sélectionner

  	private Vector2 offset;
		
	void OnMouseDown(){
		offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector2(Input.mousePosition.x, Input.mousePosition.y));
	}
		
	void OnMouseDrag(){
		Vector2 cursorPoint = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
		Vector2 cursorPosition = Camera.main.ScreenToWorldPoint(cursorPoint);
		transform.position = cursorPosition + offset;
	}
Mais quand il y a deux objets superposé par exemple une image de dimension 10,10 et un cube de dimension 5,5
1. Sur l'image, je clique sur la partie non masqué par le cube, je le déplace puis le ramène à sa position initial.
2. Quand je clique sur le cube c'est l'image que je déplace et non le cube.

Comment puis-je résoudre ce problème ?

Avatar de l’utilisateur
DevAmat
Messages : 435
Inscription : 23 Nov 2016 11:50

Re: [BD-AL] Déplacer un élément avec la souris

Message par DevAmat » 26 Avr 2017 10:44

J'ai copié coller ton code en mode no brain et il ne fonctionne pas. Peux tu donner tout le script et plus de détails, genre ce script est présent sur tous les objets que tu peux déplacer, et lorsque tu parles d'image tu parles dans l'UI?

Edit 1: Ce lien donne une méthode qui fonctionne:
http://answers.unity3d.com/questions/86 ... jects.html

Ce script est a mettre dans les objets que tu peux drag and drop:

Code : Tout sélectionner

using UnityEngine;

public class DragAndDrop : MonoBehaviour
{
    private Vector3 screenPoint;
    private Vector3 offset;

    void OnMouseDown()
    {
        screenPoint = Camera.main.WorldToScreenPoint(transform.position);
        offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
    }

    void OnMouseDrag()
    {
        Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
        Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
        transform.position = curPosition;
    }
}
Edit 2 : Alors du coup effectivement si il y a superposition entre un élément avec un collider 2d et un élément avec un collider 3d, les deux objets vont capter l'event de la souris. Ce qui n'est pas le cas si deux éléments avec le même type de collider sont superposés. Dans ce cas il faut que tu centralise l'information du début et la fin d'un drag and drop de l'objet dans un manager pour faire en sorte de manipuler un seul objet a la fois. C'est du coups ce que je ferai mais je suis pas spécialiste des events...

polmpolm123
Messages : 30
Inscription : 23 Déc 2016 15:15

Re: [BD-AL] Déplacer un élément avec la souris

Message par polmpolm123 » 26 Avr 2017 11:22

J'ai ajouté le composant "Box collider 2D" (ma scène est en 2D) sur tous les objets que je voulais déplacer

Pour le lien que vous m'avez donné

Code : Tout sélectionner

     void OnMouseDown()
      {
          screenPoint = Camera.main.WorldToScreenPoint(Input.mousePosition);
          offset = Input.mousePosition - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, transform.position.z));
      }
      
      void OnMouseDrag()
      {
          Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, transform.position.z);
          Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
          transform.position = curPosition;
              
      
      }
J'avais trouvé aussi des codes similaires mais je ne comprends pas à quoi sert la variable screenPoint puisqu'elle n'est jamais utilisé

Avatar de l’utilisateur
DevAmat
Messages : 435
Inscription : 23 Nov 2016 11:50

Re: [BD-AL] Déplacer un élément avec la souris

Message par DevAmat » 26 Avr 2017 11:42

Si si elle est utilisée regarde bien.
Alors pour la variable screenPoint, tout est une question de référentiel. Car la position de ta souris est en 2d (Vector2d), car elle a un x et un y et sa position est calculée sur ton"écran". Alors qu'un objet 3D ou ton sprite dans une scène 3d a en plus d'un x et d'un y, un z. Donc sa position est en 3d (Vector3D).
Le soucis que cela pose est que si tu veux donner a ton objet 3d la position de la souris, il faut convertir la position de ta souris sur ton écran en coordonnée du monde 3d, Unity a une fonction pour ça qui est" Camera.main.ScreenToWorldPoint", mais du coups le problème c'est que pour la position en x et en y c'est bon mais il ne faut pas oublier la variable z en 3d. Donc en premier on va convertir la position de ton objet 3d en coordonné 2d de ton écran grâce a "Camera.main.WorldToScreenPoint" pour renseigner la coordonnée z de ton objet. Donc on pourra par la suite convertir la position de ta souris de ton écran au monde 3d en ayant l'information de la positon de la souris (donc x et y) mais aussi du z de ton objet.

Pour résumer:

1 - On convertit la position de ton objet du monde 3d aux coordonnées de ton écran 2d (= screenPoint).
2 - On crée un vecteur avec la position de la souris x et y (qui est de base dans le référentiel de l'écran) et le screenPoint.z (= new Vector3d(mouse.position.x, mouse.position.y, SCREENPOINT.Z)).
3 - On convertit ce vecteur du référentiel de l'écran au monde 3d.
4- Ainsi ta position de ton objet est celui de ta souris mais cela tient compte du z de ton objet.

polmpolm123
Messages : 30
Inscription : 23 Déc 2016 15:15

Re: [BD-AL] Déplacer un élément avec la souris

Message par polmpolm123 » 26 Avr 2017 16:48

merci de votre aide

Verrouillé

Revenir vers « (C#) CSharp »