Problème de contrôle de direction

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
Avatar de l’utilisateur
Max
Messages : 8765
Inscription : 30 Juil 2011 13:57
Contact :

Re: Problème de contrôle de direction

Message par Max » 29 Déc 2018 11:23

Hello,
BlizZ a écrit :
28 Déc 2018 20:19
Bon et bien j'ai cherché toute la journée mais rien de très concluant, si vous voulez bien m'écrire le scripte au quel vous pensiez je suis preneur.
te fournir un script ne t'aidera pas. Si j'ai bien compris, tu as déjà un script. Poste le avec quelques explications (ce qui fonctionne et ce qui ne fonctionne pas), et on verra alors ce qui cloche, ou comment faire en sorte que cela aille dans le sens de ce que tu cherches à obtenir.

(je déplace le sujet dans la section CSharp)
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

BlizZ
Messages : 38
Inscription : 22 Déc 2018 20:59

Re: Problème de contrôle de direction

Message par BlizZ » 29 Déc 2018 14:22

Bonjour,

Je suis partant ! Pour ce qui est des scriptes je les ai déjà mis sur un poste d'avant. Depuis je n'ai rien changé car comme les scriptes d'hier ne marchais pas du tout j'ai tout supprimé par peur d'avoir changer quelque chose d'autre.

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

Re: Problème de contrôle de direction

Message par Max » 29 Déc 2018 15:02

BlizZ a écrit :
29 Déc 2018 14:22
je les ai déjà mis sur un poste d'avant.
Non pas d'image, fait comme je l'avais spécifié dans un précédent message:
Max a écrit :
27 Déc 2018 14:56
Poste directement ici ton/tes script(s), avec les bonnes balises, pas de screen pour des listings (le sujet sera déplacé dans la bonne section si il s'avère que c'est un soucis lié au code).
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

BlizZ
Messages : 38
Inscription : 22 Déc 2018 20:59

Re: Problème de contrôle de direction

Message par BlizZ » 29 Déc 2018 15:07

Pour l'instant j'utilise un carré pour essayer mes scriptes.

Le carré a ces trois scriptes :

Player :

Code : Tout sélectionner

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

public class player : MonoBehaviour
{

    public InputManager inputManager;
    private bool isMoving;
    private Rigidbody rigidBody;
    public float speed;



    void Start()
    {
        rigidBody = GetComponent<Rigidbody>();
    }

    void Update()
    {
        TrackMousePosition();
    }

    private void TrackMousePosition()
    {
        Vector3 directionOfRotation = inputManager.mousePositionInGameWorld - transform.position;
        transform.rotation = Quaternion.LookRotation(Vector3.forward, directionOfRotation);

        if (isMoving)
        {
            rigidBody.AddForce(transform.up * speed);
        }
    }

    public void StartEngine()
    {
        print("StartEngin");
        isMoving = true;
    }

    public void StopEngine()
    {
        print("StopEngine");
        isMoving = false;
    }
}

JMovement :

Code : Tout sélectionner

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

public class JMovement : MonoBehaviour
{

    //Vitesse de déplacement
    public float Speed = 350f;

    //Inputs -> Choix des touches
    public string inputFront;
    public string inputBack;
    public string inputLeft;
    public string inputRight;

    void Start()
    {

    }

    void Update()
    {
        if (Input.GetKey(inputLeft))
        {
            transform.Translate(-Vector3.right * Time.deltaTime * Speed);
        }

        if (Input.GetKey(inputRight))
        {
            transform.Translate(Vector3.right * Time.deltaTime * Speed);
        }

        if (Input.GetKey(inputFront))
        {
            transform.Translate(Vector3.forward * Time.deltaTime * Speed);
        }

        if (Input.GetKey(inputBack))
        {
            transform.Translate(-Vector3.forward * Time.deltaTime * Speed);
        }
    }
}
InputManager :

Code : Tout sélectionner

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

public class InputManager : MonoBehaviour
{
    public player player;
    public Vector3 mousePositionInGameWorld;


    void Start()
    {

    }

    void Update()
    {
        TrackMousePosition();
    }

    private void TrackMousePosition()
    {
        Vector3 mousePositionOnScreen = Input.mousePosition;


        mousePositionInGameWorld = new Vector3(mousePositionOnScreen.x, mousePositionOnScreen.y, Camera.main.transform.position.z *-1 );
        mousePositionInGameWorld = Camera.main.ScreenToWorldPoint(mousePositionInGameWorld);

    }
}
J’espère que j'ai bien fait comme tu voulais. Et encore merci de ton aide :)

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

Re: Problème de contrôle de direction

Message par Max » 30 Déc 2018 12:43

Bonjour,

Je ne comprend pas vraiment ton approche. Pourquoi, pour gérer le déplacement de ton player, tu passes par 3 scripts (qui contiennent des références croisées entre eux) ?
Dans l'un tu passes par une gestion du transform avec des InputKey, dans l'autre tu passe par le rigidbody. En règle générale c'est l'un ou l'autre (soit le transform sans passer par la physique, soit la physique mais on ne vient pas dans ce cas titiller le transform).
Et tu n'as aucun messages d'erreur sur ces scripts ?
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

BlizZ
Messages : 38
Inscription : 22 Déc 2018 20:59

Re: Problème de contrôle de direction

Message par BlizZ » 30 Déc 2018 13:41

Bonjour,

Eh bien comme je suis débutant effectivement j'ai surement fait des erreurs car je n'y connais quasiment rien donc c'est surement la raison pour la quelle j'ai fait ça..

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

Re: Problème de contrôle de direction

Message par Max » 30 Déc 2018 14:52

BlizZ a écrit :
30 Déc 2018 13:41
Eh bien comme je suis débutant effectivement j'ai surement fait des erreurs car je n'y connais quasiment rien donc c'est surement la raison pour la quelle j'ai fait ça..
Une réponse bien laconique. Mes interrogations sont techniques. Dommage que tu n'y réponde pas vraiment.
Mon précédemment message n’est pas à prendre sous la forme d'une critique. Je vois bien que tu débutes. Maintenant, tu t'es certainement appuyé sur quelque chose pour arriver à ce que tu as écris. Mieux comprendre ta démarche permettrait aussi de mieux expliquer ce qui ne va pas et vers quoi te diriger pour corriger cela.
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

BlizZ
Messages : 38
Inscription : 22 Déc 2018 20:59

Re: Problème de contrôle de direction

Message par BlizZ » 30 Déc 2018 17:54

Pour faire tout ce que j'ai fait la je me suis essentiellement appuyé sur des tutos youtube. Et je n'ai fait que de recopier en essayant de comprendre se que j'écrivais avec difficulté.

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

Re: Problème de contrôle de direction

Message par Max » 30 Déc 2018 19:39

Bon, on va partir sur un truc simple (ça va être l'heure de l'apéro, donc....), allant dans le sens de ce que tu cherches à faire (si j'ai bien compris), à toi de l'adapter par la suite à tes besoin.

Première phase, comment arriver à déterminer grâce au pointeur souris, le point vers lequel orienter ton player.
Il existe plusieurs méthodes, tu trouveras en faisant des recherches, des discutions comme celle-ci abordant différentes approches.
Là, on va faire simple, on va adopter la solution par 'Raycast'.
Pour tester le truc, on créé une scène, avec un sol (Ground) qui sera un grand carré plat, et un pseudo player, représenté par un cube. Le tout avec une vue du dessus, ou à peu près. Cela donne en gros ceci:
Image

Pour faciliter les choses, on va changer le Layer du sol (Ground). Pour ce faire on va en créer un nouveau, que l'on nommera 'Ground' (layer n°8 normalement). Bien penser à mettre le nouveau layer pour le sol. Cela va permettre lors du raycast, de ne prendre en compte que le sol, pas le reste. Maintenant on va écrire un petit script, que l'on va assigner au Player (on va y venir). Niveau inspector, pour le sol et le player, on doit avoir donc ceci:
Image

Maintenant, le script. Il comprend deux parties. La première est donc le picking sur le sol (nous venons d'en parler), la seconde partie est quand à elle destinée à faire avancer le Player, dans la direction pointé par la souris. Au plus simple, cela donnerais ceci (script à placer sur le player bien entendu):

Code : Tout sélectionner

using UnityEngine;

public class PlayerBase : MonoBehaviour {

    // INSPECTOR DATA
    [SerializeField]
    private float Speed = 1.0f;  // Vitesse de déplacement
    [SerializeField]
    private float distStop = 2.0f;

    // PRIVATE DATA
    private RaycastHit hit;
    private Ray ray;
    private int mask;   // mask pour lque seul le sol soit pris en compte lors du raycast

    // Use this for initialization 
    void Start()
    {
        mask = 1 << 8;
    }

    // Update is called once per frame
    void Update()
    {
        // picking sur le sol par raycast pour déterminer le point désigné
        // par la souris
        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out hit, Mathf.Infinity, mask))
        {   // si on est bien sur le sol, alors on oriente le player vers ce point
            transform.LookAt(hit.point);
        }

        // si on ne se trouve pas trop près du point désigné, on
        // autorise l'avancé du player
        if (Vector3.Distance(hit.point, transform.position) > distStop)
        {
            float motor = Input.GetAxis("Vertical") * Speed;
            transform.Translate(transform.forward * motor, Space.World);
        }
    }
}


C'est rigolo, et si tu captes bien le tout, alors tu devrais arriver à modifier et adapter à tes besoin.

Max, copyright - tout droit réservé, selon les lois jedi en vigueur
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

BlizZ
Messages : 38
Inscription : 22 Déc 2018 20:59

Re: Problème de contrôle de direction

Message par BlizZ » 30 Déc 2018 20:39

C'est super ! Merci beaucoup de ton aide ! Pour l'instant je vais me contenter de ça car je pense que ça suffira amplement. Je vais encore t’embêter un peu car 4 petits problèmes secondaires sont apparus.

Le premiers est que mon perso (car j'avais un personnage très basique en 3D) suit mon curseur mais c'est son dos qui le suis. Comment faire pour changer et que ça soit sa face qui suive le pointeur ?

Le second serai que j'aimerai jouer à la manette, y'a t'il un scripte similaire qui ferai la même chose ?

Ensuite, Peut t'on créer un sol qui aurait les mêmes propriétés que celui qui fait bouger la direction du perso mais qui serait transparent pour que le player puisse passer a travers ? Car j'ai essayé de faire un matériel qui serai transparent et le combiner a un cube plat et j'ai réussi mais le player ne passe pas a travers du coup :/

Serait t-il possible de réaliser des déplacement latérale mais qui n'aurait pas d'influence du tout avec le lieux ou se trouve le pointeur ? Car j'ai essayer de rajouter juste ce petit scripte au code mais du coup le perso tourne autour du pointeur.

Code : Tout sélectionner

if (Input.GetKey(KeyCode.Q))
        {
            transform.Translate(5, 0, 0);
        }
Si tu peux résoudre ces petits problèmes ou me donner des pistes je suis preneur. En attendant je te remercie encore pour le temps que tu m'as consacré !

Répondre

Revenir vers « (C#) CSharp »