[DB-AL] Script pour un mouvement de camera

Toutes les questions sur le développement Mobile, y compris la partie script.
ZauChoco
Messages : 8
Inscription : 19 Sep 2018 17:04

[DB-AL] Script pour un mouvement de camera

Message par ZauChoco » 19 Sep 2018 17:14

Bonjour,

Je tente de faire une camera en vue du dessus sur mobile, j'ai un problème dans le fait de se déplacer dans l’environnement en glissant avec le doigt.
En effet, les mouvements ne sembles pas naturels du tout, c'est difficile à décrire. De plus je ne sais pas comment faire pour adapter la vitesse de déplacement au zoom de la camera (Code pour le zoom: http://www.devination.com/2013/07/unity ... -zoom.html)

Le code:

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class SwipeMove : MonoBehaviour
{

    public float minSwipeDistY;

    public float minSwipeDistX;
    int speed = 14;

    private Vector2 startPos;

    void Update()
    {

        if (Input.touchCount == 1)

        {

            Touch touch = Input.touches[0];



            switch (touch.phase)

            {

                case TouchPhase.Began:

                    startPos = touch.position;

                    break;



                case TouchPhase.Moved:
                    

                    float swipeDistVertical = (new Vector3(0, touch.position.y, 0) - new Vector3(0, startPos.y, 0)).magnitude;

                    if (swipeDistVertical > minSwipeDistY)

                    {

                        float swipeValue = Mathf.Sign(touch.position.y - startPos.y);
                        if (swipeValue != 0)
                        {
                            if (swipeValue > 0)
                            {
                                transform.Translate(Vector3.up * -(swipeValue) * speed * Time.deltaTime);
                            }//up swipe

                            

                            else if (swipeValue < 0)
                            {
                                transform.Translate(Vector3.down * -(-(swipeValue) * speed) * Time.deltaTime);
                            }//down swipe
                        }
                             

                    }

                    float swipeDistHorizontal = (new Vector3(touch.position.x, 0, 0) - new Vector3(startPos.x, 0, 0)).magnitude;

                    if (swipeDistHorizontal > minSwipeDistX)

                    {

                        float swipeValue = Mathf.Sign(touch.position.x - startPos.x);
                        if (swipeValue != 0)
                        {

                            if (swipeValue > 0)
                            {
                                transform.Translate(Vector3.right * -(swipeValue) * speed * Time.deltaTime);
                            }//right swipe

                            

                            else if (swipeValue < 0)
                            {
                                transform.Translate(Vector3.left * -(-(swipeValue) * speed) * Time.deltaTime);
                            }//left swipe
                        }

                             

                    }
                    startPos = touch.position;
                    break;

                case TouchPhase.Stationary:
                    startPos = touch.position;

                    break;
            }
        }
    }
}

Je débute dans le domaine, je ne vois donc pas trop ce qui ne va pas.

Merci d'avance pour vos réponses :)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Script pour un mouvement de camera

Message par boubouk50 » 20 Sep 2018 10:53

Salut,

Tu as une caméra orthographique ou pas?

Aussi, pour le déplacement, tu as le deltaPosition directement dans le Touch, pour t'éviter des calculs déjà disponibles...
https://docs.unity3d.com/2017.1/Documen ... ition.html

Tu as également des fonctions liées à la caméra pour convertir des coordonnées écran en coordonnées monde.
Ainsi, en récupérant la position actuelle et celle d'avant tu peux bouger la caméra du bon rapport (quel que soit le zoom)
https://docs.unity3d.com/2017.1/Documen ... Point.html
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

ZauChoco
Messages : 8
Inscription : 19 Sep 2018 17:04

Re: [DB-AL] Script pour un mouvement de camera

Message par ZauChoco » 22 Sep 2018 17:56

Merci pour la réponse ! :-D

Mais je n'y arrive toujours pas, la camera va vers le haut à droite
Je ne comprend pas ce qu'il ne va pas:

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class SwipeMove : MonoBehaviour
{

    public float minSwipeDistY;

    public float minSwipeDistX;
    int speed = 14;

    private Vector2 startPos;

    void Update()
    {
        if (Input.touchCount == 1)

        {

            Touch touch = Input.touches[0];



            switch (touch.phase)

            {

                case TouchPhase.Began:

                    startPos = touch.position;

                    break;



                case TouchPhase.Moved:
                    

                    float swipeDistVertical = (new Vector3(0, touch.position.y, 0) - new Vector3(0, startPos.y, 0)).magnitude;
                    Vector3 swipe = Camera.main.ScreenToWorldPoint(touch.deltaPosition);
                    //transform.Translate(Vector3.up + swipe * Time.deltaTime);
                    startPos = touch.position;
                    float swipeValue = Mathf.Sign(touch.position.y - startPos.y);
                    

                     if (swipeDistVertical > minSwipeDistY)

                     {

                         if (swipeValue != 0)
                         {
                             if (swipeValue > 0)
                             {
                                 transform.Translate(Vector3.up +swipe * Time.deltaTime);
                             }

                             else if (swipeValue < 0)
                             {
                                 transform.Translate(Vector3.down +swipe * Time.deltaTime);
                             }
                         }
                              

                     }

                     float swipeDistHorizontal = (new Vector3(touch.position.x, 0, 0) - new Vector3(startPos.x, 0, 0)).magnitude;

                     if (swipeDistHorizontal > minSwipeDistX)

                     {
                         if (swipeValue != 0)
                         {

                             if (swipeValue > 0)
                             {
                                 transform.Translate(Vector3.right +swipe * Time.deltaTime);
                             }

                             else if (swipeValue < 0)
                             {
                                 transform.Translate(Vector3.left +swipe * Time.deltaTime);
                             }
                         }


                     }
                    startPos = touch.position;
                    break;

                case TouchPhase.Stationary:
                    startPos = touch.position;

                    break;
            }
        }
    }
}
Comment puis-je faire ?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Script pour un mouvement de camera

Message par boubouk50 » 24 Sep 2018 09:44

J'ai survolé le code et je vois que tu as tout laissé en ne changeant que le calcul du swipe.
Le touch.deltaPosition te donne déjà le signe et tout le reste. Pas besoin de faire des cas.
Il te donne le vecteur de déplacement entre deux Updates, que tu transformes en coordonnées World pour calculer le vecteur de déplacement de la caméra. Et c'est tout ce qu'il faut que tu fasses. Ça devrait tenir en 2 lignes.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

ZauChoco
Messages : 8
Inscription : 19 Sep 2018 17:04

Re: [DB-AL] Script pour un mouvement de camera

Message par ZauChoco » 03 Oct 2018 17:37

boubouk50 a écrit :
24 Sep 2018 09:44
J'ai survolé le code et je vois que tu as tout laissé en ne changeant que le calcul du swipe.
Le touch.deltaPosition te donne déjà le signe et tout le reste. Pas besoin de faire des cas.
Il te donne le vecteur de déplacement entre deux Updates, que tu transformes en coordonnées World pour calculer le vecteur de déplacement de la caméra. Et c'est tout ce qu'il faut que tu fasses. Ça devrait tenir en 2 lignes.
Re,
J'ai essayé pas mal de choses, et j'en arrive là:

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class SwipeMove : MonoBehaviour
{

    public float minSwipeDistY;

    public float minSwipeDistX;
    Camera c;



    Vector3 p = new Vector3();
    int speed = 14;

    private Vector2 startPos;
    private void Start()
    {
        c = Camera.main;
    }
    void Update()
    {
        c = Camera.main;
        if (Input.touchCount == 1)

        {

            Touch touch = Input.touches[0];



            switch (touch.phase)

            {

                case TouchPhase.Began:

                   

                    break;



                case TouchPhase.Moved:

 

                    p = c.ScreenToWorldPoint(new Vector2(touch.deltaPosition.x, touch.deltaPosition.y));
                    transform.Translate(touch.deltaPosition*p);
                    
                    break;

                case TouchPhase.Stationary:
                    

                    break;
            }
        }
    }
}
Maintenant, à peine je bouge mon doigt, que la camera part très loin en hauteur.
Pour être plus précis: En réalité, j'essaye de faire bouger un GameObject avec la camera accroché dessus, je ne pense pas que ça change grand chose

Donc voilà je suis bloqué et je ne sais pas comment faire :triste1:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Script pour un mouvement de camera

Message par boubouk50 » 04 Oct 2018 09:14

ZauChoco a écrit :
03 Oct 2018 17:37
Donc voilà je suis bloqué et je ne sais pas comment faire :triste1:

Code : Tout sélectionner

transform.Translate(touch.deltaPosition*p);
Oui, je vois ça...
Actuellement tu utilises un delta en tant que coordonnées Screen (Quelle idée?) pour le transformer en coordonnées World (ça n'a déjà plus aucun sens), puis tu déplaces ton gameObject à partir de ces coordonnées que tu as multipliées par le delta Screen. (POURQUOI??). Rien n'a des sens.

Tu es en 2D?

Soit tu utilises le deltaPosition pour en sortir un vecteur directionnel (c'est lui-même normalisé) que tu appliques comme déplacement pondéré par le zoom.

Soit tu utilises les coordonnées de l'écran pour en sortir des coordonnées dans le monde. Dans ce cas, il ne faut pas déplacer l'objet mais lui appliquer les nouvelles coordonnées.

Sources d'aide:
https://answers.unity.com/questions/517 ... touch.html
https://kylewbanks.com/blog/unity3d-pan ... ouse-input
https://assetstore.unity.com/packages/t ... ript-14489
Recherche Google Associée
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Développement plateformes mobile Iphone et Android »