Page 1 sur 2

Animation du personnage avec un joystick

Publié : 07 Oct 2021 15:26
par PaLapin
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);
    }
}

Re: Animation du personnage avec un joystick

Publié : 07 Oct 2021 18:36
par Max
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

Re: Animation du personnage avec un joystick

Publié : 09 Oct 2021 19:20
par PaLapin
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.

Re: Animation du personnage avec un joystick

Publié : 10 Oct 2021 10:54
par Max
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.

Re: Animation du personnage avec un joystick

Publié : 10 Oct 2021 17:53
par PaLapin
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"?

Re: Animation du personnage avec un joystick

Publié : 10 Oct 2021 18:07
par Max
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.

Re: Animation du personnage avec un joystick

Publié : 11 Oct 2021 17:13
par PaLapin
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

Re: Animation du personnage avec un joystick

Publié : 11 Oct 2021 20:22
par Max
Tu utilises dans ton script Input.GetAxis, qui est issus de l'Input Manager Old, mais quid de la partie FixedJoystick ?

Re: Animation du personnage avec un joystick

Publié : 12 Oct 2021 17:35
par PaLapin
je ne sais pas ce que veut dire quid

Re: Animation du personnage avec un joystick

Publié : 12 Oct 2021 18:09
par Max
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.