[RESOLU]Mouvement de la scène comme dans l'éditeur

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

[RESOLU]Mouvement de la scène comme dans l'éditeur

Message par EmileF » 28 Jan 2022 16:12

Bonjour,
Après plusieurs mois d'absence, je reviens vers vous pour solliciter votre aide.
Je voudrais reconstituer les mouvements de la scène dans mon jeu comme dans la scène de l'éditeur.
Pour ce faire j'ai créé un script qui fait pivoter la caméra en orbite autour d'un point central en cliquant sur le bouton droit
Et je déplace ce point avec le clic central de la souris.
Le résultat est satisfaisant pour la rotation
Mais pour le déplacement rien ne va plus si je ne suis plus dans la rotation d'origine. Normal, les x ne correspondent plus selon la rotation.
Voilà mon script:

Code : Tout sélectionner

public class OrbitCam : MonoBehaviour {

    // La cible de la caméra. La caméra pointera toujours vers cet objet.
    public Transform _target;

    //La distance par défaut de la caméra par rapport à la cible
    public float _distance = 20.0f;
    public Vector3 _decalage = Vector3.zero;

    // Contrôlez la vitesse de zoom et de dézoom.
    public float _zoomStep = 1.0f;

    // Contrôlez la vitesse de rotation de la caméra.
    public float _xSpeed = 1f;
    public float _ySpeed = 1f;

    // Contrôlez la vitesse de déplacement de la cible.
    public float _xTrans = 1f;
    public float _yTrans = 1f;

    //La position du curseur sur l'écran. Utilisé pour faire pivoter la caméra.
    private float _x = 0.0f;
    private float _y = 0.0f;

    //Vecteur de distance et de position de la cible
    private Vector3 _distanceVector;
    private Vector3 _targetPosition;


    /**
     * Déplacez la caméra dans sa position initiale.
     */
    void Start()
    {
        _distanceVector = new Vector3(0.0f, 0.0f, -_distance);
        _targetPosition = _target.position;

        Vector2 angles = this.transform.localEulerAngles;
        _x = angles.x;
        _y = -angles.y;

        this.Rotate(_x, _y);

    }

    /**
     * Faites pivoter la caméra, la cible ou zoomez en fonction de l'entrée du lecteur.
     */
    void LateUpdate()
    {
        if (_target)
        {
            this.MoveControls();
            this.RotateControls();
            this.Zoom();
       }
    }

    /**
     * Deplacer la cible avec le bouton central de la souris
     */
    void MoveControls()
    {
        if (Input.GetMouseButton(2))
        {
            _targetPosition.x += Input.GetAxis("Mouse X") * _xTrans;
            _targetPosition.y -= Input.GetAxis("Mouse Y") * _yTrans;
            this.Rotate(_x, _y);
        }
    }

    /**
     *  Faites pivoter la caméra lorsque vous appuyez sur le deuxième bouton de la souris.
     * 
     */
    void RotateControls()
    {
        if (Input.GetMouseButton(1))
        {
            _y += Input.GetAxis("Mouse X") * _xSpeed;
            _x += -Input.GetAxis("Mouse Y") * _ySpeed;

            this.Rotate(_x, _y);
        }

    }

    /**
    * Transformer le mouvement du curseur en rotation et dans une nouvelle position
    * pour la caméra.
    */
    void Rotate(float x, float y)
    {
        // Transforme l'angle en degré sous forme de quaternion utilisé par Unity pour la rotation.
        Quaternion rotation = Quaternion.Euler(x, y, 0.0f);

        //La nouvelle position est la position cible + le vecteur distance de la caméra
        //tourné à l'angle spécifié.
        Vector3 position = rotation * _distanceVector + _targetPosition;

        //Mettre à jour la rotation et la position de la caméra.
        transform.rotation = rotation;
        transform.position = position;
    }



    /**
     * Zoom ou dézoom selon l'entrée de la molette de la souris.
     */
    void Zoom()
    {
        if (Input.GetAxis("Mouse ScrollWheel") < 0.0f)
        {
            this.ZoomOut();
        }
        else if (Input.GetAxis("Mouse ScrollWheel") > 0.0f)
        {
            this.ZoomIn();
        }

    }

    /**
    * Réduisez la distance entre la caméra et la cible et
    * mettre à jour la position de la caméra (avec la fonction Rotation).
    */
    void ZoomIn()
    {
        _distance -= _zoomStep;
        _distanceVector = new Vector3(0.0f, 0.0f, -_distance);
        this.Rotate(_x, _y);
    }

    /**
    * Augmentez la distance entre la caméra et la cible et
    * mettre à jour la position de la caméra (avec la fonction Rotation).
    */
    void ZoomOut()
    {
        _distance += _zoomStep;
        _distanceVector = new Vector3(0.0f, 0.0f, -_distance);
        this.Rotate(_x, _y);
    }
}
Est-ce que quelqu'un peut me mettre sur la voie pour obtenir le résultat souhaité ?
Dernière édition par EmileF le 29 Jan 2022 11:00, édité 1 fois.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

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

Re: Mouvement de la scène comme dans l'éditeur

Message par Max » 28 Jan 2022 16:48

Bonjour,

en parcourant rapidement ton code, je dirais que plutôt qu'écrire:
Vector3 position = rotation * _distanceVector + _targetPosition;

ton _targetPosition ne semble pas être sensible à la rotation, donc j'écrirais
Vector3 position = rotation * _distanceVector - rotation * _targetPosition;
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

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Mouvement de la scène comme dans l'éditeur

Message par EmileF » 28 Jan 2022 17:10

Merci Max,
ta correction est la bonne, il faut en plus modifier
_targetPosition.y -= Input.GetAxis("Mouse Y") * _yTrans;
en
_targetPosition.y += Input.GetAxis("Mouse Y") * _yTrans;
pour corriger le mouvement vertical inversé et tout marche nickel

Bravo et encore merci
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Répondre

Revenir vers « Scripting »