[RESOLU][DB-AL] Téléportation du joueur

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
Bedouw
Messages : 6
Inscription : 11 Fév 2019 01:01

[RESOLU][DB-AL] Téléportation du joueur

Message par Bedouw » 11 Fév 2019 01:22

Bonsoir,

Je programme une petite application pour visiter des bâtiments. Je veux ajouter une fonction qui permet de se téléporter d'un bâtiment à un autre à partir d'un menu pause et de boutons. Le problème est que le script de téléportation ne fonctionne absolument pas avec mon player (qui peut se déplacer et regarder autours de lui).
Pourtant le script fonctionne parfaitement avec une capsule. Ainsi je ne trouve pas de solution pour téléporter mon player sauf en supprimant la ligne "player.Move(MoveDirection * Time.deltaTime);". Or cette ligne me permet de me déplacer :/
Je vous joins les deux scripts ainsi que quelques photos utiles.
Image

Image
Merci de vous pencher sur mon problème et de m'aider à le résoudre. :-D


PlayerCC Script

Code : Tout sélectionner

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

public class PlayerCC : MonoBehaviour
{
    public float WalkSpeed = 4f;
    public float SprintSpeed = 6f;
    public float JumpSpeed = 4f;
    public float sensitivity = 2.5f;
    public Vector3 MoveDirection = new Vector3(0, 0, 0);
    CharacterController player;

    public GameObject eyes;

    float rotX;
    float rotY;

    float gravity = 9.81f;

    // Start is called before the first frame update
    void Start()
    {
        player = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        rotX += Input.GetAxis("Mouse X") * sensitivity;

        if(rotY < -180f)
        {
            rotY = 180f;
        }
        
        if(rotY > 180f)
        {
            rotY = -180f;
        }

        rotY -= Input.GetAxis("Mouse Y") * sensitivity;
        rotY = Mathf.Clamp(rotY, -90, 90);

        if(player.isGrounded)
        {
            MoveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            MoveDirection = transform.rotation * MoveDirection;

            if(Input.GetKey(KeyCode.LeftShift))
            {
                MoveDirection *= SprintSpeed;
            }
            else
            {
                MoveDirection *= WalkSpeed;
            }

            if(Input.GetButton("Jump"))
            {
                MoveDirection.y = JumpSpeed;
            }
        }

        transform.localRotation = Quaternion.Euler(0, rotX, 0);
        eyes.transform.localRotation = Quaternion.Euler(rotY, transform.localRotation.y, 0);

        MoveDirection.y -= gravity * Time.deltaTime;
        player.Move(MoveDirection * Time.deltaTime);

    }
}
Teleport Script

Code : Tout sélectionner

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

public class Teleport : MonoBehaviour
{
    public GameObject Target;

    public GameObject TPA;
    public GameObject TPB;
    public GameObject TPC;
    public GameObject TPE;

    public void BATA()
    {
        Target.transform.position = TPA.gameObject.transform.position;
    }

    public void BATB()
    {
        Target.transform.position = TPB.gameObject.transform.position;
    }

    public void BATC()
    {
        Target.transform.position = TPC.gameObject.transform.position;
    }

    public void BATE()
    {
        Target.transform.position = TPE.gameObject.transform.position;
    }
}
.
 ! Message de : Max
Utilisez les balises code SVP
Merci de lire la Charte et sa FAQ, en particulier Comment insérer un script dans un messages ?.
Idem pour les bonnes méthodes pour poster des images.
Dernière édition par Bedouw le 11 Fév 2019 23:11, édité 1 fois.

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

Re: [DB-AL] Téléportation du joueur

Message par Max » 11 Fév 2019 13:31

Bonjour,
Bedouw a écrit :
11 Fév 2019 01:22
Le problème est que le script de téléportation ne fonctionne absolument pas avec mon player
C'est vague "ne fonctionne absolument pas".... :-/
Techniquement de ce que j'ai pu lire de tes scripts, il n'y a pas de raison. A savoir que ton player voit son comportement lié au CharacterController. Donc suivant ou tu le feras atterrir dans ton environnement, il aura tendance à passer au dessus de certains éléments en fonction de collider présent sur la scène.
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

Bedouw
Messages : 6
Inscription : 11 Fév 2019 01:01

Re: [DB-AL] Téléportation du joueur

Message par Bedouw » 11 Fév 2019 13:59

Bonjour,
Merci pour votre réactivité.
En effet le script fonctionne, mais avec le player il y a un problème.
J’ai pu faire certains tests avec le menu pause et j’ai constaté que le player se téléportait correctement, car le Time.TimeScale était modifié à 0. Mais lorsque qu’on reprend en quittant le menu et que le Time.TimeScale vaut 1, mon player retourne aussitôt à sa position initiale. Du coup, mon player ne change pas sa position (Évidement le code était modifié avec des Time.TimeScale :-D).
Je peux peut être vous transmettre mon projet pour que vous puissiez mieux comprendre le problème.
Je vous partage le dossier dès que possible si ça ne vous dérange pas (via Mega si c’est possible :D).

Merci de votre aide :-D

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

Re: [DB-AL] Téléportation du joueur

Message par Max » 11 Fév 2019 14:07

Bedouw a écrit :
11 Fév 2019 13:59
Je peux peut être vous transmettre mon projet pour que vous puissiez mieux comprendre le problème.
Oui pouquoi pas, cela permet d'avoir l'ensemble des éléments à disposition.
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

Bedouw
Messages : 6
Inscription : 11 Fév 2019 01:01

Re: [DB-AL] Téléportation du joueur

Message par Bedouw » 11 Fév 2019 18:51

Bonsoir,

J'ai refait mon script avec le pause menu. Je n'arrive plus à mettre en évidence que le joueur se téléporte puis reviens à sa position initiale mais le projet est quand même là ^^.
Merci pour votre aide :D

Lien du Projet

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

Re: [DB-AL] Téléportation du joueur

Message par Max » 11 Fév 2019 19:12

Re,

ben écoute, chez moi cela fonctionne bien. Bon tes points de spawn sont dans les airs, mais pour le reste, le player apparait bien aux endroit prévu, il faut lui laisser le temps de redescendre sur le sol, mais pas de soucis.
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

Bedouw
Messages : 6
Inscription : 11 Fév 2019 01:01

Re: [DB-AL] Téléportation du joueur

Message par Bedouw » 11 Fév 2019 19:33

Re,

ah bah c'est étrange. Sur mes deux pc j'ai le même bug du coup :/
Tu penses que la réinstallation du logiciel pourrait résoudre le problème ?
Ou ça vient peut-être de ma version "2018.3.5f1". Parce que chez moi la téléportation du joueur ne fonctionne pas, même sur le build d’ailleurs.


Build

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

Re: [DB-AL] Téléportation du joueur

Message par Max » 11 Fév 2019 19:45

Je viens de tester de nouveau, et là par contre, cela ne fonctionne plus (Editor comme Build).
Je vais regarder cela dans la soirée. Là il faut que je parte.
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

Bedouw
Messages : 6
Inscription : 11 Fév 2019 01:01

Re: [DB-AL] Téléportation du joueur

Message par Bedouw » 11 Fév 2019 19:48

D'accord merci :)
Bonne soirée

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

Re: [DB-AL] Téléportation du joueur

Message par Max » 11 Fév 2019 22:57

Re,

bon je viens de jeter de nouveau un coup d'oeil. En fait c'est vicieux, car cela dépend de l'ordre d’exécution des scripts.
Si PlayerCC est exécuté avant Teleport, alors pas de soucis, sinon ça coince.
Le soucis est en fait toujours le même: la cohabitation hasardeuse entre des instructions direct sur les transforms et la physique (dans ce cas un CharacterController).

Pour régler ton soucis, il faut faire le transform.position après le move. Donc tu peux modifier le script PlayerCC, avec genre un flag actant un éventuel changement après le move.
Autre solution, désactiver le CharacterController avant d'effectuer le transform.position, puis de le réactiver.
En pratique cela resemblerait à:

dans PlayerCC, tu rajoutes:

Code : Tout sélectionner

    public void Spawn(Vector3 pos)
    {
        player.enabled = false;
        transform.position = pos;
        player.enabled = true;
    }
et ton script Teleport.cs devient;

Code : Tout sélectionner

public class Teleport : MonoBehaviour
{
    public PlayerCC targetscript;

    public GameObject TPA;
    public GameObject TPB;
    public GameObject TPC;
    public GameObject TPE;

    public void BATA()
    {
        targetscript.Spawn(TPA.transform.position);
    }

    public void BATB()
    {
        targetscript.Spawn(TPB.transform.position);
    }

    public void BATC()
    {
        targetscript.Spawn(TPC.transform.position);
    }

    public void BATE()
    {
        targetscript.Spawn(TPE.transform.position);
    }
}
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 »