Déplacer un objet avec la souris (clic & drag)

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
yannoch
Messages : 51
Inscription : 17 Avr 2012 21:38
Contact :

Déplacer un objet avec la souris (clic & drag)

Message par yannoch » 02 Nov 2012 12:56

Bonjour.
J'annonce de suite, j'y connais rien du tout en programmation, mais je cherche a appréhender le langage en faisant des choses simples.

Mon soucis:

J'ai dans ma scène un objet que je voudrais pouvoir déplacer avec la souris sur un seul axe (Z), en faisant un cliqué glissé.
Le truc simple a première vu... Cet objet est en réalité un bouton qui coulisse. Il doit donc avoir un déplacement limité et suivre parfaitement la position de la souris.

J'ai testé moult script sur le net, mais rien ne fonctionne correctement.

Auriez vous un script a me faire partager svp? Merci =)

Avatar de l’utilisateur
Silverglade
Messages : 264
Inscription : 04 Août 2012 17:52

Re: Déplacer un objet avec la souris (clic & drag)

Message par Silverglade » 02 Nov 2012 16:44

Cool pas besoin de faire de sujet vu qu'on cherche la même chose :p
Si je trouve un truc je ferai signe :!:

Edit: Bon ben j'avais dis que je reviendrai si j'avais un truc donc je suis re x)
J'ai lu sur le net qu'il y 'avait tout bêtement un script rigidbodydrag.js dans l'asset "Script".
Pour l'utiliser et "freezer" un axe met le script dans un objet puis rajoutes les composants rigidbody et collider.
Rigidbody qui comporte donc l'onglet contraintes, tu coches tout sauf z et le tour est joué. Testé et approuvé :D

Au cas ou, le voilà:

Code : Tout sélectionner

var spring = 50.0;
var damper = 5.0;
var drag = 10.0;
var angularDrag = 5.0;
var distance = 0.2;
var attachToCenterOfMass = false;

private var springJoint : SpringJoint;

function Update ()
{
	// Make sure the user pressed the mouse down
	if (!Input.GetMouseButtonDown (0))
		return;

	var mainCamera = FindCamera();
		
	// We need to actually hit an object
	var hit : RaycastHit;
	if (!Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition),  hit, 100))
		return;
	// We need to hit a rigidbody that is not kinematic
	if (!hit.rigidbody || hit.rigidbody.isKinematic)
		return;
	
	if (!springJoint)
	{
		var go = new GameObject("Rigidbody dragger");
		var body : Rigidbody = go.AddComponent ("Rigidbody") as Rigidbody;
		springJoint = go.AddComponent ("SpringJoint");
		body.isKinematic = true;
	}
	
	springJoint.transform.position = hit.point;
	if (attachToCenterOfMass)
	{
		var anchor = transform.TransformDirection(hit.rigidbody.centerOfMass) + hit.rigidbody.transform.position;
		anchor = springJoint.transform.InverseTransformPoint(anchor);
		springJoint.anchor = anchor;
	}
	else
	{
		springJoint.anchor = Vector3.zero;
	}
	
	springJoint.spring = spring;
	springJoint.damper = damper;
	springJoint.maxDistance = distance;
	springJoint.connectedBody = hit.rigidbody;
	
	StartCoroutine ("DragObject", hit.distance);
}

function DragObject (distance : float)
{
	var oldDrag = springJoint.connectedBody.drag;
	var oldAngularDrag = springJoint.connectedBody.angularDrag;
	springJoint.connectedBody.drag = drag;
	springJoint.connectedBody.angularDrag = angularDrag;
	var mainCamera = FindCamera();
	while (Input.GetMouseButton (0))
	{
		var ray = mainCamera.ScreenPointToRay (Input.mousePosition);
		springJoint.transform.position = ray.GetPoint(distance);
		yield;
	}
	if (springJoint.connectedBody)
	{
		springJoint.connectedBody.drag = oldDrag;
		springJoint.connectedBody.angularDrag = oldAngularDrag;
		springJoint.connectedBody = null;
	}
}

function FindCamera ()
{
	if (camera)
		return camera;
	else
		return Camera.main;
}

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

Re: Déplacer un objet avec la souris (clic & drag)

Message par Max » 02 Nov 2012 16:51

un petit code comme celui là pourrait servir de base (à coller sur l'object à traiter):

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class MouseDrag : MonoBehaviour {
	
	private Vector3 mPos;
	
	// Use this for initialization
	void Start () {
	}
	
	void Update () {
		mPos = Input.mousePosition;
	}
	
    void OnMouseDrag() {
		Vector3 val = (Input.mousePosition - mPos) * Time.deltaTime;
		transform.Translate(val); // x et y
		//transform.Translate(0,0, val.x); // juste pour l'axe des Z
    }
}
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
yannoch
Messages : 51
Inscription : 17 Avr 2012 21:38
Contact :

Re: Déplacer un objet avec la souris (clic & drag)

Message par yannoch » 03 Nov 2012 11:44

Bonjour. Merci pour vos réponses.

Alors autant le code Silverglade est long mais il fonctionne, que celui de Max ne marche pas (en tout cas pas chez moi... ^^ )
Merci à vous deux!

J'oubliais ! Je voudrais faire un build vers ANDROID. Du coup j'ai testé d'autre script car la gestion du Touch est différent de celui d'un clic souris.
Vous avez là aussi une petite idée?

Pour déplacer mon objet dans ma scène et gérer le tactile sur une tablette ANDROID, j'ai utilisé ça:

Code : Tout sélectionner

var object : GameObject;
function Update () {
    for (var touch : Touch in Input.touches){
        var ray = Camera.main.ScreenPointToRay(touch.position);
        var hit : RaycastHit;
        if (Physics.Raycast (ray, hit, 100)) {
            if(touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved) {
                var cameraTransform = Camera.main.transform.InverseTransformPoint(0, 0, 0);
                object.transform.position = Camera.main.ScreenToWorldPoint(new Vector3 (touch.position.x, touch.position.y, cameraTransform.z - 0.5));
            }
        }
    }
}
Ca fonctionne, moyennement... car le bouton ne se déplace pas sur son axe Z , mais par rapport à la camera... :/
Autre problème, si je place plusieurs boutons dans ma scène (nommés différemment), ils vont tous bouger en même temps.
Je suis en train de voir avec un ami programmeur si il peut faire quelque chose et je vous tiens informé ;)

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

Re: Déplacer un objet avec la souris (clic & drag)

Message par Max » 03 Nov 2012 12:56

yannoch a écrit : que celui de Max ne marche pas (en tout cas pas chez moi... ^^ )
Ben si qui marche mon code Image, la preuve.
Bon c'est très sommaire je te le consède, et certainement pas vraiment en prise avec ce que tu cherchais :mrgreen:
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
yannoch
Messages : 51
Inscription : 17 Avr 2012 21:38
Contact :

Re: Déplacer un objet avec la souris (clic & drag)

Message par yannoch » 03 Nov 2012 14:01

Effectivement ca a l'air de marcher plutot bien !
Mais tu sais , je suis vraiment très mauvais... ^^
Là on est en train d'essayer de se battre pour faire fonctionner ça sur une tablette ANDROID.
C'est pas gagner lol

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

Re: Déplacer un objet avec la souris (clic & drag)

Message par Max » 03 Nov 2012 14:05

à les tablettes par contre, moi pas connaitre, donc je ne serais d'aucune aide :|
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
Silverglade
Messages : 264
Inscription : 04 Août 2012 17:52

Re: Déplacer un objet avec la souris (clic & drag)

Message par Silverglade » 03 Nov 2012 15:10

Idem, j'ai lu je ne sais plus ou qu'il y avait beaucoup ( trop? ) de manip à faire pour avoir un export stable donc j'ai même pas cherché plus loin :lol:

Avatar de l’utilisateur
yannoch
Messages : 51
Inscription : 17 Avr 2012 21:38
Contact :

Re: Déplacer un objet avec la souris (clic & drag)

Message par yannoch » 03 Nov 2012 17:42

J'ai fais un premier test hier concernant le build vers ANDROID, même si mon script ne fonctionnait pas, et bien j'ai trouvé au contraire que c'était relativement simple et pratique.
Je développe en parallèle une application avec un ami, que l'on programme directement sur Eclipse, et bien le build d'un package est autrement plus complexe.
Hors là, en quelques clic, j'ai pu avoir un installer et toute ma scène en 3d de UNITY vers ma tablette.
Le seul gros soucis, c'est la programmation... Mais je vais y arriver! ^^

Répondre

Revenir vers « Scripting »