Pathfinding A*, gerrer les inclinaisons du sol

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
megablast2
Messages : 152
Inscription : 15 Août 2013 16:47

Pathfinding A*, gerrer les inclinaisons du sol

Message par megablast2 » 19 Mars 2022 18:59

Bonjour,
Je suis en train de faire un pathfinding Astar qui de base fonctionne. J'ai voulu l'améliorer en découvrant le character controller et en voyant qu'il permet de gerer l'inclinaison des plans ou de détecter les hauteurs pour les déplacements.
Dans l'idée j'avais en tête de faire le pathfinding avec des coordonnes uniquement en x,z et de laisser au character controller de gerer l'axe y. (pour le moment je me deplace sur des surface plate).

J'ai crée une coroutine pour gérer le déplacement. Je n'ai pas de soucis (pour le deplacement) si j'utilise transform.Translate ou Vector3.MoveTowards. Par contre si j'essai d'utiliser le character controler, une fois sur deux, il de détecte pas les changement de direction et il va tres vite. J'ai aussi essayé de le mettre dans l'update (je pensais que ça allait peut être trop vite avec la coroutine)et de laisser à la coroutine uniquement les changements de direction mais ça ne marche pas non plus. Pourtant n utilisant les touches du clavier pour le déplacer, le character controler ne pose pas de soucis.

Vous auriez une idée pour régler se problème ou une autre piste de component?

Code : Tout sélectionner

private void OnPathFound(ActionPath[] newpath, bool pathSuccessful)
    {    
        if (pathSuccessful)
        {
            _paths = newpath;
            StopCoroutine(FollowPath());
            StartCoroutine(FollowPath());
        }
    }

Code : Tout sélectionner

IEnumerator FollowPath()
    {       
        BaseTile currentTile = _paths[0].Neighbor;

        while (true)
        {
            //je supprime y pour mermettre la detection avec currentTile.PosPath dont le y=0
            Vector3 pos = transform.position;
            pos.y = 0;
           
            if (Vector3.Distance(pos, currentTile.PosPath) <= 0.05f)
            {
                Vector3 pos_hero= new Vector3(currentTile.PosPath.x, transform.position.y, currentTile.PosPath.z);
                transform.position = pos_hero;

                targetIndex++;
                if (targetIndex >= _paths.Length)
                {
                    pos = Vector3.zero;
                    yield break;
                }
                currentTile = _paths[targetIndex].Neighbor;
            }
           
            //character controller
            //Direction, un Vector3 qui donne la direction sur x et z avec une valeur de 1            
            _motor.MoveToPoint(_paths[targetIndex].Direction);
            
            yield return null;
           
        }
    }
_controller est le character controller

Code : Tout sélectionner

public void MoveToPoint(Vector3 direction)
    {     
        //_isGrounded = Physics.CheckSphere(GroundCheck.position, GroundDistance, Groundmask);
        //temp
        _isGrounded = true;

        if (_isGrounded && _velocity.y < 0)
        {
            _velocity.y = -2f;
        }
      
        _controller.Move(direction * Speed * Time.deltaTime);       

         // Je n'utilise pasla gravité pour le momment
        //_velocity.y += Gravity * Time.deltaTime;

        //_controller.Move(_velocity * Time.deltaTime);
    }
Bonne journée,

Répondre

Revenir vers « Scripting »