[RESOLU][DB - AL] Souci de Listes pour un Ghost

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
Littlekitykat
Messages : 40
Inscription : 22 Fév 2019 18:22
Contact :

[RESOLU][DB - AL] Souci de Listes pour un Ghost

Message par Littlekitykat » 25 Fév 2019 17:49

Je voudrais mettre un Ghost sur mon jeu , le joueur fait un premier de circuit , j'enregistre les valeurs des vecteurs X et Y ainsi que ses valeurs de Scale et de Rotation a chaque Frame, que je met dans des listes différentes. Je passe ces Listes en static afin de le récupérer afin que le Ghost puisse a chaque frame du tour suivant prendre les valeurs de transformation de ces listes. Sauf que voila les valeurs ne semblent pas identiques et le ghost fait n'importe quoi .

Donc je me demandait si il y avait quelques choses a savoir ou si je faisais les choses pas comme il faut !

Coté Main.

Code : Tout sélectionner

public class BoatMouvement : MonoBehaviour {

    //déclaration de mes propres variables
    public float Velocity;    
    public static float BoatDirection, BoatRotation,BoatDirectionTemp, xSpeed , ySpeed, JumpVelocity;
    public float Turnspeed, CoefRotation,CoefFrottement,Gravity,NewScaler, StartJumpVelocity;
    Vector3 GetKey,SetMouvement,SetScale;
    public static Quaternion targetRotation;
    public bool IsBoatJumping;
    public static bool IsTurboAvaible;
    public static int TurboCount;

    public static List<float> GhostX;
    public static List<float> GhostY;
    public static List<float> GhostScale;    
    public static List<float> GhostRotation;
    


    // Procédure qui récupére les valeur des touches
    void GetInput()
    {

        GetKey.x = Input.GetAxisRaw("Horizontal");
        GetKey.y = Input.GetAxisRaw("Vertical");
        GetKey.z = 0.0f;  
        
       if (Mathf.Abs(GetKey.x) > 0)
        {
            BoatRotation -= Turnspeed * GetKey.x;
           //BoatRotation = BoatRotation % 360;
        }
        if (GetKey.y > 0)
        {

            ySpeed += Mathf.Cos(BoatDirection * Mathf.Deg2Rad) * Velocity * Time.deltaTime;
            xSpeed += Mathf.Sin(BoatDirection * Mathf.Deg2Rad) * Velocity * Time.deltaTime;
            
        }


        if (Input.GetKeyDown("space")){

            if (!IsBoatJumping)
            {
                IsBoatJumping = true;
                JumpVelocity = StartJumpVelocity;
            }
        }

        if (IsBoatJumping)
        {
            JumpVelocity -= Gravity;
            NewScaler += (JumpVelocity / 120);

            if (NewScaler < 0.8f)
            {
                IsBoatJumping = false;                
                JumpVelocity = 0;
                NewScaler = 0.8f;
            }

        }

        BoatRotation *= CoefRotation;        
        BoatDirectionTemp = BoatDirection + (BoatRotation / 8);
        xSpeed *= CoefFrottement;
        ySpeed *= CoefFrottement;
        
        targetRotation = Quaternion.Euler(0, 0, BoatDirectionTemp);
        //transform.rotation = targetRotation;

        BoatDirection = BoatDirectionTemp;
        SetMouvement.x = -xSpeed;
        SetMouvement.y = ySpeed;
        SetMouvement.z = 0.0f;  
        SetScale = new Vector3(NewScaler, NewScaler ,NewScaler);

        transform.position += SetMouvement ;
        transform.rotation = targetRotation;
        transform.localScale = SetScale;

        GhostScale.Add(NewScaler);
        GhostX.Add(SetMouvement.x);
        GhostY.Add(SetMouvement.y);
        GhostRotation.Add(BoatDirectionTemp);

    }

    // Use this for initialization
    void Start () {

        //Init values        
        Velocity = 0.13f;
        BoatRotation = 0;
        BoatDirection = 0;
        Turnspeed = 5;
        CoefRotation =0.85f;
        CoefFrottement = 0.97f;
        IsBoatJumping = false;
        JumpVelocity = 0;
        NewScaler = 0.8f;
        Gravity = 0.7f;
        StartJumpVelocity = 12;
        GhostX = new List<float>();
        GhostY = new List<float>();
        GhostScale = new List<float>();
        GhostRotation = new List<float>();
    }
	
	// Update is called once per frame
	void Update () {

        if (!PauseManager.IsPauseOn)
        {

            GetInput();
        }
        if (StartLineManager.IsStartLinereach)
        {
            if (GhostX.Count > 1)
            {

                print(GhostX.Count);
                
            }
            GhostX.Clear();
            GhostY.Clear();
            GhostScale.Clear();
            GhostRotation.Clear();

        }
                             
        
    }
   


}
Coté Ghost

Code : Tout sélectionner

public class GhostBehavior : MonoBehaviour
{

    public Vector3 SetMouvement, SetScale;
    public Quaternion setRotation;
    public int FrameCount;

    public static List<float> GhostGhostX;
    public static List<float> GhostGhostY;
    public static List<float> GhostGhostScale;
    public static List<float> GhostGhostRotation;





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

        SetMouvement = new Vector3(0.0f, 0.0f, 0.0f);
        SetScale =  new Vector3(0.8f, 0.8f, 0.8f);
        FrameCount = 0;
        GhostGhostX = new List<float>();
        GhostGhostY = new List<float>();
        GhostGhostScale = new List<float>();
        GhostGhostRotation = new List<float>();
    }

    // Update is called once per frame
    void Update()
    {
        FrameCount++;
        if (StartLineManager.IsStartLinereach)
        {
            FrameCount = 0;     

        }
        if (GhostGhostX.Count > 1 && FrameCount < GhostGhostX.Count)
        {
            SetMouvement.x = GhostGhostX[FrameCount]*0.8f;
            SetMouvement.y = GhostGhostY[FrameCount]*0.8f;
            SetMouvement.z = 0.0f;
            SetScale.x = GhostGhostScale[FrameCount];
            SetScale.y = GhostGhostScale[FrameCount];
            SetScale.z = GhostGhostScale[FrameCount];

            transform.position += SetMouvement;
            transform.localScale = SetScale;

            transform.rotation = Quaternion.Euler(0, 0, GhostGhostRotation[FrameCount]);
        }


    }
}
Pour ceux qui voudrait mon Cv ! :
https://scratch.mit.edu/users/littlekitykat/
Le reste a disparu depuis fort longtemps ^^

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB - AL] Souci de Listes pour un Ghost

Message par boubouk50 » 25 Fév 2019 18:31

Tu pourrais enregistrer le transform de l'objet plutôt que chacun de ses composants.
Aussi, il te faut fixer le framerate pour être sur d'avoir le même timing ou bien enregistrer le timing en même temps que le transform, puis faire une interpolation des données entre la précédente et suivante.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Littlekitykat
Messages : 40
Inscription : 22 Fév 2019 18:22
Contact :

Re: [DB - AL] Souci de Listes pour un Ghost

Message par Littlekitykat » 25 Fév 2019 19:22

Donc a priori le code est bon ? Tu pourrais être plus claire sur cette histoire de timing ? En fait le Framerate ne devrait pas avoir d'influence sur la position... , Mais juste sur le fait que le Ghost soit plus lent ou plus rapide .

Mais le ghost ne reproduit pas du tout les mouvements !!

OMG je viens de penser a un truc !! Quand j'utilise la fonction Add(); de la liste ... Ou se place l'enregistrement ? A n=1 ou n=List.count +1 ? Parceque ca ce trouve je ca fais tout a l'envers ?
Pour ceux qui voudrait mon Cv ! :
https://scratch.mit.edu/users/littlekitykat/
Le reste a disparu depuis fort longtemps ^^

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB - AL] Souci de Listes pour un Ghost

Message par boubouk50 » 26 Fév 2019 10:29

Ce que je voulais dire, c'est qu'au lieu de récupérer les mouvements donnés et de recalculer les transformations, tu peux récupérer le transform, cela t'éviterai de refaire le calcul.
Pour ma part, j'enregistrerai à temps fixe, tous les 1/30s, dans un FixedUpdate ().
Puis de la même manière, je réinjecterai à temps fixe, tous les 1/30s dans un FixedUpdate ().
L'enregistrement devrait être détaché du CharacterController BoatMouvement

https://answers.unity.com/questions/327 ... nd-th.html
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Littlekitykat
Messages : 40
Inscription : 22 Fév 2019 18:22
Contact :

Re: [DB - AL] Souci de Listes pour un Ghost

Message par Littlekitykat » 26 Fév 2019 19:20

J'ai vu hier en regardant les vidéos d’apprentissage qu'il existait ce petit détail ( fixUpdate et lastUpdate) . J'ai pas eu le temps de faire des essais . Je fais des tests et je reviens vers vous dés que c fais !!
Pour ceux qui voudrait mon Cv ! :
https://scratch.mit.edu/users/littlekitykat/
Le reste a disparu depuis fort longtemps ^^

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB - AL] Souci de Listes pour un Ghost

Message par boubouk50 » 27 Fév 2019 10:01

FixedUpdate () est un Update () qui est appelé à un intervalle fixe.
LateUpdate () est un Update () qui est appelé une fois tous les Update () de la scène ont été exécutés.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Littlekitykat
Messages : 40
Inscription : 22 Fév 2019 18:22
Contact :

Re: [DB - AL] Souci de Listes pour un Ghost

Message par Littlekitykat » 27 Fév 2019 17:11

Je n'ai pas encore trouvé comment enregistrer le Transform. ... mais j'ai fais passé mes calculs en fixupdate ... cela ne corrige en rien le problème.

Tu parles aussi de sortir l'enregistrement du CharacterController BoatMouvement mais que préconises tu fais un script sur un Gameobject vide ailleurs ?
Pour ceux qui voudrait mon Cv ! :
https://scratch.mit.edu/users/littlekitykat/
Le reste a disparu depuis fort longtemps ^^

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB - AL] Souci de Listes pour un Ghost

Message par boubouk50 » 27 Fév 2019 17:42

Oui un enregistreur indépendant qui enregistre les données d'un GameObject. Il pourrait être sur le gameObject ou non, on s'en fiche. Son rôle ne serait que de récupérer et enregistrer les transformations du gameObject à un temps donné. (où toutes les x millisecondes)
Concernant le transform, tu peux sinon récupérer le position, rotation et localscale.

Question: est-ce que le ghost à la même hiérarchie et composition que le bateau du joueur?
Parce que les transformations sont dépendantes de ces caractéristiques.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
Littlekitykat
Messages : 40
Inscription : 22 Fév 2019 18:22
Contact :

Re: [DB - AL] Souci de Listes pour un Ghost

Message par Littlekitykat » 27 Fév 2019 19:17

Je crois que tu va pouvoir te moquer ^^ :mdr1: j'ai pas eu le temps de tester avant de partir au travail. Mais j'ai vu mon erreur.

1 ) j'utilise la caméra comme support du script pour l'enregistrer. Comme on utilise la position du bateau pour placer la caméra, j'ai ajouter une void FixeUpdate et j'ai ajouté l'enregistrement de la Position , du Scale et de la Rotation.

2) le Bateau n'est pas un "Player". comme je débute je ne connaissais pas ce détails. Je dois reprendre la scéne plus tard et utiliser des translate et des rotate, car actuellement je fais tous par des fonctions mathématiques persos et j'applique des vectors.

3) Quand le joueurs pas la ligne d'arrivée je copie mes listes "lignes par lignes" ( car je ne sais pas encore si je peux copier une liste d'un coup ..." ) et je fais un Clear() de la liste d'enregistrement.

4) Dans mon Ghost, qui a les même caractéristiques de base, de mon bateau , je vérifie dans le FixeUpadte si la liste n'est pas vide et si elle n'est pas vide je passe a chaque Frame les coordonnées de la liste.

Je pense que dans mon code ( au 3 ) j'ai fais un mauvais copier/coller ey je passe en valeur Y les données de X.... :langue2: :langue2: :langue2: donc forcément ca ne marche pas. Reste a vérifier si ca marche.

Ps; pour le coup j'ai fait un Countdown avec des feux :) et lui par contre il marche :p
Pour ceux qui voudrait mon Cv ! :
https://scratch.mit.edu/users/littlekitykat/
Le reste a disparu depuis fort longtemps ^^

Avatar de l’utilisateur
Littlekitykat
Messages : 40
Inscription : 22 Fév 2019 18:22
Contact :

Re: [DB - AL] Souci de Listes pour un Ghost

Message par Littlekitykat » 01 Mars 2019 19:54

Le point est clos !! j'ai réussi !! Merci pour votre aide !! :super: :super: :super:
Pour ceux qui voudrait mon Cv ! :
https://scratch.mit.edu/users/littlekitykat/
Le reste a disparu depuis fort longtemps ^^

Répondre

Revenir vers « (C#) CSharp »