Animation du personnage avec un joystick

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
PaLapin
Messages : 8
Inscription : 06 Oct 2021 21:49

Animation du personnage avec un joystick

Message par PaLapin » 07 Oct 2021 15:26

Bonjour
J'ai 14 ans et j'aimerais créer un jeu mobile mais je suis nouveau sur Unity alors voici mon problème. J'aimerais savoir comment faire pour que quand mon perso bouge, l'animation pour courir se fait, j'ai déjà pris un script que j'ai vu sur Youtube pour bouger (avec un joystick).
Voici mon script :

Code : Tout sélectionner

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

public class PlayerMove : MonoBehaviour
{
    public FixedJoystick moveJoystick;
    public FixedJoystick lookJoystick;

    // Update is called once per frame
    void Update()
    {
        UpdateMoveJoystick();
        UpdateLookJoystick();
    }

    void UpdateMoveJoystick()
    {
        float hoz = moveJoystick.Horizontal;
        float ver = moveJoystick.Vertical;
        Vector2 convertedXY = ConvertWithCamera(Camera.main.transform.position, hoz, ver);
        Vector3 direction = new Vector3(convertedXY.x, 0, convertedXY.y).normalized;
        transform.Translate(direction * 0.02f, Space.World);
    }

    void UpdateLookJoystick()
    {
        float hoz = lookJoystick.Horizontal;
        float ver = lookJoystick.Vertical;
        Vector2 convertedXY = ConvertWithCamera(Camera.main.transform.position, hoz, ver);
        Vector3 direction = new Vector3(convertedXY.x, 0, convertedXY.y).normalized;
        Vector3 lookAtPosition = transform.position + direction;
        transform.LookAt(lookAtPosition);
    }

    private Vector2 ConvertWithCamera(Vector3 cameraPos, float hor, float ver)
    {
        Vector2 joyDirection = new Vector2(hor, ver).normalized;
        Vector2 camera2DPos = new Vector2(cameraPos.x, cameraPos.z);
        Vector2 playerPos = new Vector2(transform.position.x, transform.position.z);
        Vector2 cameraToPlayerDirection = (Vector2.zero - camera2DPos).normalized;
        float angle = Vector2.SignedAngle(cameraToPlayerDirection, new Vector2(0, 1));
        Vector2 finalDirection = RotateVector(joyDirection, -angle);
        return finalDirection;
    }

    public Vector2 RotateVector(Vector2 v, float angle)
    {
        float radian = angle * Mathf.Deg2Rad;
        float _x = v.x * Mathf.Cos(radian) - v.y * Mathf.Sin(radian);
        float _y = v.x * Mathf.Sin(radian) + v.y * Mathf.Cos(radian);
        return new Vector2(_x, _y);
    }
}

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

Re: Animation du personnage avec un joystick

Message par Max » 07 Oct 2021 18:36

Bonsoir PaLapin,

Pour ton personnage il faut lui assigner un component Animator. Et il faut que tu ais un Animator Controller configuré selon tes besoins (donc qui va comprendre les animations souhaitées, comme par exemple repos - marcher - courir - etc...).
Après, au niveau script tu vas pouvoir déclencher ces animations en fonction des événements lié à ton personnage. Pour ce faire, il te faut regarder du coté de l'API et des fonctions de la classe Animator.
Tu peux aussi regarder pour plus d'informations la partie dédiée sur le Leanr: Controlling Animation
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

PaLapin
Messages : 8
Inscription : 06 Oct 2021 21:49

Re: Animation du personnage avec un joystick

Message par PaLapin » 09 Oct 2021 19:20

J'ai regarder "Controlling Animation" comme vous m'avez dit et je l'ai appliquer dans mon code. Mon personnage bouge mais toujours avec l'animation "repos" et il y a un message d'erreur dans la console qui dit " InvalidOperationException: You are trying to read Input using the UnityEngine.Input class, but you have switched active Input handling to Input System package in Player Settings." Si vous pouvez m'aidez car je ne comprend pas d'où viens le problème.
Voici mon code avec l'amélioration :

Code : Tout sélectionner

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

public class PlayerMove : MonoBehaviour
{
    public FixedJoystick moveJoystick;
    public FixedJoystick lookJoystick;
    Animator anim;

    void Start()
    {
        anim = GetComponent<Animator>();
    }

    void Update()
    {
        UpdateMoveJoystick();
        UpdateLookJoystick();

        float move = Input.GetAxis("Vertical");
        anim.SetFloat("Speed", move);
    }

    void UpdateMoveJoystick()
    {
        float hoz = moveJoystick.Horizontal;
        float ver = moveJoystick.Vertical;
        Vector2 convertedXY = ConvertWithCamera(Camera.main.transform.position, hoz, ver);
        Vector3 direction = new Vector3(convertedXY.x, 0, convertedXY.y).normalized;
        transform.Translate(direction * 0.02f, Space.World);
    }

    void UpdateLookJoystick()
    {
        float hoz = lookJoystick.Horizontal;
        float ver = lookJoystick.Vertical;
        Vector2 convertedXY = ConvertWithCamera(Camera.main.transform.position, hoz, ver);
        Vector3 direction = new Vector3(convertedXY.x, 0, convertedXY.y).normalized;
        Vector3 lookAtPosition = transform.position + direction;
        transform.LookAt(lookAtPosition);
    }

    private Vector2 ConvertWithCamera(Vector3 cameraPos, float hor, float ver)
    {
        Vector2 joyDirection = new Vector2(hor, ver).normalized;
        Vector2 camera2DPos = new Vector2(cameraPos.x, cameraPos.z);
        Vector2 playerPos = new Vector2(transform.position.x, transform.position.z);
        Vector2 cameraToPlayerDirection = (Vector2.zero - camera2DPos).normalized;
        float angle = Vector2.SignedAngle(cameraToPlayerDirection, new Vector2(0, 1));
        Vector2 finalDirection = RotateVector(joyDirection, -angle);
        return finalDirection;
    }

    public Vector2 RotateVector(Vector2 v, float angle)
    {
        float radian = angle * Mathf.Deg2Rad;
        float _x = v.x * Mathf.Cos(radian) - v.y * Mathf.Sin(radian);
        float _y = v.x * Mathf.Sin(radian) + v.y * Mathf.Cos(radian);
        return new Vector2(_x, _y);
    }
}
Merci.

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

Re: Animation du personnage avec un joystick

Message par Max » 10 Oct 2021 10:54

Bonjour,

concernant le message d'erreur, à priori c'est qu'il y a conflit entre les deux systèmes d'Input (le nouveau et le legacy).
Les fonctions employées au sein de ton code passent par UnityEngine.Input class (donc le système de base natif) alors que dans tes settings tu as certainement switché sur le nouveau (package new input system installé).
Concernant ton animation, la partie code ne suffit pas pour pouvoir te répondre, il faudrait aussi avoir les info sur ton AnimatorController et ses paramètres.
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

PaLapin
Messages : 8
Inscription : 06 Oct 2021 21:49

Re: Animation du personnage avec un joystick

Message par PaLapin » 10 Oct 2021 17:53

Et comment régler le problème des fonctions c'est dans le code ou dans les paramètre autre part car je ne sais pas comment le régler. Et est-ce que le reste du code est expliquer dans "Controlling Animation"?

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

Re: Animation du personnage avec un joystick

Message par Max » 10 Oct 2021 18:07

Bonsoir,
PaLapin a écrit :
10 Oct 2021 17:53
Et comment régler le problème des fonctions c'est dans le code ou dans les paramètre autre part car je ne sais pas comment le régler.
il faut aller dans la partie Project Setting et dans la zone Player basculer sur "Input Manager (Old)"
Image
PaLapin a écrit :
10 Oct 2021 17:53
Et est-ce que le reste du code est expliquer dans "Controlling Animation"?
Avant de coder quoique ce soit, tu dois créer un AnimatorController, avec l'ensemble des animations souhaités, ainsi que les différents paramètres permettant de les gérer (utilisés dans les transition). Pas besoin de code pour cette partie. Une fois bien établis, tu peux alors faire le lien entre ton contrôleur d'animation (via un component Animator) et ton code lié au contrôle de ton joueur.
Et dans le tuto Controlling Animation, dont je t'ai donné le lien, oui tout est expliqué, ce que je viens de décrire ainsi que la mise en œuvre avec la partie script. Il faut suivre le tuto du début à la fin, et les choses devraient être plus simple après.
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

PaLapin
Messages : 8
Inscription : 06 Oct 2021 21:49

Re: Animation du personnage avec un joystick

Message par PaLapin » 11 Oct 2021 17:13

Quand je fais sa j'ai toujours le message d'erreur mais mon personnage ne peux plus bouger ensuite j'ai deja un AnimatorController avec les animations etc. j'ai peut etre oublier de dire quelque chose je sais pas si cela peut jouer mais le projet est en IOS

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

Re: Animation du personnage avec un joystick

Message par Max » 11 Oct 2021 20:22

Tu utilises dans ton script Input.GetAxis, qui est issus de l'Input Manager Old, mais quid de la partie FixedJoystick ?
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

PaLapin
Messages : 8
Inscription : 06 Oct 2021 21:49

Re: Animation du personnage avec un joystick

Message par PaLapin » 12 Oct 2021 17:35

je ne sais pas ce que veut dire quid

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

Re: Animation du personnage avec un joystick

Message par Max » 12 Oct 2021 18:09

je vais le formuler autrement:
Tu utilises dans ton script Input.GetAxis, qui est issus de l'Input Manager Old, mais qu'en est-il de la partie FixedJoystick ? J'imagine que cela fait partie d'un outil que tu as intégré à ton projet.
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 « (C#) CSharp »