[Résolu][DB - AL] Deplacer camera quand le personnage court

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Derek82
Messages : 40
Inscription : 28 Mai 2020 16:36

[Résolu][DB - AL] Deplacer camera quand le personnage court

Message par Derek82 » 28 Mai 2020 17:14

Bonjour à tous,

je souhaite créer un jeu de plateforme en 3D, dans un esprit 2D (comme Inside par exemple plus modestement évidemment !)
Je débute et je découvre à la fois Unity et le code, je m'excuse par avance si je dis des âneries...


j'arrive à faire avancer mon personnage dans le décors mais je voudrais quand il court, faire en sorte que la caméra recule de façon à embrasser plus largement le décors, qu'elle se tienne dans cette position tant que le bouton "courir" est tenu, puis revienne à la position de départ quand le bouton est relaché, le tout avec un script qui suit le personnage (camerafollow).

J'ai obtenu ce que je voulais en bidouillant avec un composant "animator" placé sur un objet vide que j'ai appelé "Zoom", enfant de mon joueur. dans le controleur d'animation de l'animator j'ai une animation "idle", une autre "zoomOut" (avec la position qui varie sur l'axe qui m'interesse), une autre avec une position "tenue" avec les valeurs extrêmes, et enfin "zoomIn", l'inverse de ZoomOut avant de revenir à l'état de base...
Mais tout ça ne semble pas compatible avec le script CameraFollow sur ma Camera qui a pour cible/Target l'objet "Zoom"...
Les deux activés, ça ne marche pas. Et puis même quand ça marche, la camera se décale en fait, elle ne revient pas à une position tout à fait fixe sans que je comprenne vraiment bien pourquoi....

Bref, je ne sais pas si je tiens là la bonne méthode... Peut-être que tout ça s'envisage mieux directement en code dans le script de la camera ou celui des controles du joueurs ? Mais je ne sais pas trop comment m'y prendre.

J'espère être clair, ce n'est pas évident à décrire. Sinon voici une capture d'écran :

Image
Dernière édition par Derek82 le 31 Mai 2020 07:49, édité 1 fois.

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

Re: [DB - AL] Deplacer camera quand le personnage court

Message par Max » 28 Mai 2020 18:09

Bonjour,

je pense en effet que tu compliques un peu la chose. La gestion de la camera, dans ton cas, doit se gérer par script, et non pas par l'Animator.
Puisque tu sembles passer par CameraFollow, pourquoi ne pas simplement jouer sur le paramètre "Distance" au niveau de ce script, qui augmente alors au moment où tu déclenches l'action de courir (et inversement quand tu repasses par une phase "marchée") ?
Et pour une transition plus douce entre les deux positions, tu peux regarder du coté de Vector3.Lerp ou encore de Vector3.MoveTowards par exemple.
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

Derek82
Messages : 40
Inscription : 28 Mai 2020 16:36

Re: [DB - AL] Deplacer camera quand le personnage court

Message par Derek82 » 28 Mai 2020 22:44

Merci Max pour ces pistes ! :)
Je me doutais que c'était un peu tarabiscotée mais comme le code m'est encore très inconnu je ne savais pas par quel bout l'aborder. Je vais suivre les pistes que tu me suggères et lire la doc, merci.

Derek82
Messages : 40
Inscription : 28 Mai 2020 16:36

Re: [DB - AL] Deplacer camera quand le personnage court

Message par Derek82 » 29 Mai 2020 00:15

Voici mon code pour que la caméra suive le personnage :

Code : Tout sélectionner

using System.Collections;
using UnityEngine;

public class Script_Camera : MonoBehaviour
{
    public Transform target;
    public float smoothSpeed = 0.125f;
    public Vector3 offset;

    // Start is called before the first frame update
    void Start()
    {
    }

    void Update()
    {
    }

    void LateUpdate()
    {
        transform.position = target.position + offset;
    }

}
Comment agir sur la distance dans ce code ?
j'aimerai pouvoir jouer sur le paramètre offset Z, en donnant plus ou moins de valeur.
mais je patauge un peu sur comment il faut faire ça...

je pensais le synchroniser au fait de presser le bouton "courir".

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

Re: [DB - AL] Deplacer camera quand le personnage court

Message par Max » 29 Mai 2020 09:01

Bonjour,

là il va falloir intégrer quelques notions en terme de code un peu plus avancées.
Si j'ai bien suivi ce que tu exposes plus haut, tu as sur ta camera un script qui te permet de suivre ton Player dans ses mouvements (à priori CameraFollow.cs). Sur ce script, tu as une valeur qui doit se nommer "Distance", que tu renseignes dans l'inspector. C'est ce qui permet de modifier la distance de ta camera par rapport au target (dans ton cas le player).
L'objectif est de pouvoir modifier cette valeur suivant les circonstances. Tu vas donc essayer d'ajouter à ce script deux fonctions spécifiques (une pour éloigner la camera, une autre pour la ramener à la position initiale) qui pourront être appelées par un script de contrôle par exemple.
Le plus compliqué est de faire en sorte que la transition entre les deux positions soit progressive. Donc pour arriver à ce résultat, une des solutions est par exemple de passer par une coroutine et un Lerp.

Code : Tout sélectionner

    [SerializeField] float runDist;
    [SerializeField] float walkDist;
    ...
    public IEnumerator RunChangePosCamera(float timeFactor)
    {
        float duration = 0;
        while (duration < 1.0f)
        {
            distance = Mathf.Lerp(walkDist, runDist, duration);
            duration += Time.deltaTime * timeFactor;
            // 
            yield return null;
        }
    }

    public IEnumerator WalkChangePosCamera(float timeFactor)
    {
        float duration = 0;
        while (duration < 1.0f)
        {
            distance = Mathf.Lerp(runDist, walkDist, duration);
            duration += Time.deltaTime * timeFactor;
            // 
            yield return null;
        }
    }
Dans ton script de controle, tu pourras alors écrire au moment de lancer une phase de run quelque chose comme StartCoroutine(camfollow.RunChangePosCamera(1.0f)); puis pour revenir à la position walk StartCoroutine(camfollow.WalkChangePosCamera(1.0f));.

C'est une base de travail à tester et à adapter.
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 : 674
Inscription : 18 Mars 2017 19:39

Re: [DB - AL] Deplacer camera quand le personnage court

Message par EmileF » 29 Mai 2020 09:04

Salut,

Tu pourrais peut-être jouer sur le zoom.
Si ta caméra est en mode Orthographic en changeant la valeur Size de la Camera
Si tu es en mode Perspective en modifiant la valeur FieldOfView
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Derek82
Messages : 40
Inscription : 28 Mai 2020 16:36

Re: [DB - AL] Deplacer camera quand le personnage court

Message par Derek82 » 29 Mai 2020 14:30

Merci à vous deux !

Tu as raisons max, il va faloir que j'apprenne un peu plus sur le code. je me rends bien compte que je me lance de façon un peu hardie dans l'aventure d'un jeu vidéo sans avoir aucune base ! Mais le but de faire ce petit jeu est d'apprendre, donc au boulot.

Merci pour tes explications très claires. je ne connais pas encore la logique et la grammaire disons de la programmation alors je patauge mais je vois l'idée.
je vais aller creuser un peu.

Sinon Emilef, je voulais éviter d'utiliser le zoom mais bien avoir un "vrai" traveling pour un meilleur effet sur la profondeur en arrière plan... mais ça peut valoir le coup d'essayer pourquoi pas.

Derek82
Messages : 40
Inscription : 28 Mai 2020 16:36

Re: [DB - AL] Deplacer camera quand le personnage court

Message par Derek82 » 30 Mai 2020 22:39

Alors j'ai un peu avancé :

j'ai fait plusieurs essais pour affiner le code de mon script pour la camera qui suit le joueur.
En jouant sur l'offset, j'ai crée deux float, DistanceMax et DistanceMin, quand on appuie sur le bouton courir (ici Ctrl droit), la caméra recule à la position choisie, quand on relâche elle revient au point de départ ou plutôt à la position choisie aussi (que j'ai fait coïncider avec la position de départ).
ça marche bien, c'est synchro avec les déplacements de mon joueur et sa course.

voici le code :

Code : Tout sélectionner

using System.Collections;
using UnityEngine;

public class Script_Camera : MonoBehaviour
{
    public Transform target;
    public float smoothSpeed = 0.125f;
    public Vector3 offset;
    public Vector3 rotation;

    public float DistanceMin = -150;
    public float DistanceMax = -250;

    // Start is called before the first frame update
    void Start()
    {

    }


    void FixedUpdate()
    {
        // Zoom quand le personnage court        
        if (Input.GetKeyDown(KeyCode.RightControl))
        {
            offset.z = DistanceMax;

        }

        else if (Input.GetKeyUp(KeyCode.RightControl))
        {
            offset.z = DistanceMin;
        }
    }


    void LateUpdate()
    {
        transform.position = target.position + offset + rotation;
    }


}



Reste maintenant à rendre progressif le passage de la distanceMin à la distanceMax !

J'ai bien essayé de mettre le nez dans le Lerp et le coroutine mais ça me semble assez difficile (j'ai pour l'instant raté tous mes essais...) n'y a t i pas un méthode plus "simple" pour créer une progression dans le temps ?

j'ai tenté ça qui me semblait pas trop mal :

Code : Tout sélectionner

offset.z = Mathf.Lerp(DistanceMin, DistanceMax, Time.time);
mais ça ne donne rien...
une idée ? merci !

Derek82
Messages : 40
Inscription : 28 Mai 2020 16:36

Re: [DB - AL] Deplacer camera quand le personnage court

Message par Derek82 » 31 Mai 2020 07:48

Toutes mes excuses Max, j'avais mal compris certaines notions et aussi mal adapté mon code...
Tu m'avais pourtant donné tous les éléments !
après pas mal d'essais infructueux j'ai enfin mieux compris comment ça devait fonctionner... la solution était bien celle que tu avais donnée !

Je marque le sujet comme "Résolu", un grand merci !

le résultat (sur un décors "bac à sable") :
Image

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

Re: [Résolu][DB - AL] Deplacer camera quand le personnage court

Message par Max » 31 Mai 2020 10:29

Si tu es arrivé au résultat souhaité, c'est parfait.
Sympa le GIF ;)
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

Répondre

Revenir vers « Scripting »