[RESOLU] Rotation d'un objet autour d'un autre

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
ced_le_dingue
Messages : 70
Inscription : 29 Oct 2019 21:58

[RESOLU] Rotation d'un objet autour d'un autre

Message par ced_le_dingue » 09 Nov 2020 18:04

Salut à tous,

Je n'arrive pas à faire tourner ma caméra en même temps que la rotation de mon joueur :pleur4:
Voici ce qu'il se passe lorsque je fais tourner mon joueur sur lui même:
Image

Voici le script que j'utilise:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.ProBuilder;

public class ScripteCameraJoueur : MonoBehaviour
{
    public GameObject ObjetASuivre;
    public Vector3 Offset, direction;
    Transform Pivot;

    // Start is called before the first frame update
    void Start()
    {   
        Offset = transform.position - ObjetASuivre.transform.position;
        Pivot = transform;
    }

    // Update is called once per frame
    void LateUpdate()
    {   
        // Déplacer la caméra en même temps que le déplacement du joueur
        transform.position = ObjetASuivre.transform.position + Offset;
	
	//Rotation de la caméra
        //(nb: D'ailleurs je voudrai que ma caméra tourne autant que mon joueur tourne (ie: en temps réeel), et non pas 
        d'une certaine vitesse: ici 20 en l'occurrence)
        transform.RotateAround(ObjetASuivre.transform.position, Vector3.up,20 * Time.deltaTime);
    }

}
Comment faire? :snif:
Merci à vous pour votre aide, toujours précieuse :amen:
Dernière édition par ced_le_dingue le 09 Nov 2020 20:42, édité 1 fois.

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

Re: Rotation d'un objet autour d'un autre

Message par Max » 09 Nov 2020 19:50

Bonsoir,

Ce genre de mécanisme est un classique, et il existe pas mal de solutions. Un script tout fait est d'ailleurs proposé dans le package des StandardsAssets.
Mais si tu souhaites le faire par toi même et si on part de ton script, en restant donc sur l'utilisation de la fonction RotateAround, il faut tenir compte de l'angle de ton target.

Code : Tout sélectionner

    public Transform ObjetASuivre;
    private float ang;

    // Start is called before the first frame update
    void Start()
    {
        ang = ObjetASuivre.rotation.eulerAngles.y;
    }
     
    void LateUpdate()
    {
        transform.RotateAround(ObjetASuivre.position, Vector3.up, ObjetASuivre.rotation.eulerAngles.y-ang);
        ang = ObjetASuivre.rotation.eulerAngles.y;

        transform.LookAt(ObjetASuivre);
    }
PS: évite les accents dans tes codes, c'est le mal (cela à même fait bugué la coloration syntaxique du forum, j'ai changé le nom de ta classe en supprimant la lettre accentuée)
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

ced_le_dingue
Messages : 70
Inscription : 29 Oct 2019 21:58

Re: Rotation d'un objet autour d'un autre

Message par ced_le_dingue » 09 Nov 2020 20:41

cela à même fait bugué la coloration syntaxique du forum
En effet, je me disais justement "merde c'est bizarre ya plus de mise en forme pour le code sur le forum?" haha
il faut tenir compte de l'angle de ton target.
Parfait!! ça marche!!! t'es super.
En revanche petite subtilité, (cf. le code ci dessous), j'ai du enlever la ligne:

Code : Tout sélectionner

ang = ObjetASuivre.rotation.eulerAngles.y;
Sinon ça ne marche pas (on voit que ça veut tourner mais en fait non)... Du coup je l'ai enlevé:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.ProBuilder;

public class ScripteCameraJoueur : MonoBehaviour
{
    public GameObject ObjetASuivre2;
    public Vector3 Offset, direction;
    private float ang;

    public Transform ObjetASuivre;

    // Start is called before the first frame update
    void Start()
    {
        Offset = transform.position - ObjetASuivre2.transform.position;
        ang = ObjetASuivre.rotation.eulerAngles.y;

    }

    // Update is called once per frame
    void LateUpdate()
    {

        // Déplacer la caméra en même temps que le déplacement du joueur
        transform.position = ObjetASuivre2.transform.position + Offset;
	
	//Rotation de la caméra autour du joueur
        transform.RotateAround(ObjetASuivre.position, Vector3.up, ObjetASuivre.rotation.eulerAngles.y - ang);
        
        // ça si je le laisse ça fait buguer ça marche pas... 
        //ang = ObjetASuivre.rotation.eulerAngles.y;

	//Regarder en direction du joueur
        transform.LookAt(ObjetASuivre);

    }

}
Merci encore pour ton aide Max!!! Je vais maintenant bidouiller le code que tu m'a donnée pour bien assimiler tout ça et ne pas juste recopier bêtement. :nonon: :super:

Répondre

Revenir vers « Scripting »