Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Unity] bloquer sur une condition script C#

    27 avril 2017 à 17:14:13

    Bonjour a tous, 

    Etant toujours débutant et en plein progression sur Unity et la programmation en c#, je rencontre souvent des problèmes que j'essaye tant bien que mal de régler mais cet fois ci je vois blanc même si j'ai essayé de me débrouiller seul mais faut faut s'avouer vaincu des fois et rendre els armes et demander de l'aide. 

    bref passons a mon problème les amis, donc ca peut paraître simple pour certain et j'aurai aimer que ce soit le cas pour moi ( je m’égare encore, excusez moi j'aime écrire), j'essaye de donner une condition a mon NavMeshAgent pour realiser une animation en fonction de sa vitesse qui est a la base = a 0, mon animation est en type Blend tree avec 2 animation Float, la première " idle " ==0 et deuxième "walk" ==1,  ce que j'aimerai realiser c'est de poser une condition " si je clique sur ma souris, la vitesse de mon agent passe a 1 jusqu'a la fin de sa course" sauf que je sais pas comment poser une telle condition, enfin la ou ca me pose probleme c'est comment dire jusqu'a la fin de sa course et ensuite la vitesse repassera a 0, ce qui va me permettre de jouer mon animation sans aucun soucis, voici mon script :

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.AI;
    
    public class ClickToMve : MonoBehaviour {
    
        //Variables
    
        public    RaycastHit HitInfo = new RaycastHit();
        private  NavMeshAgent Agent;
    
    
    
    
    
        // Use this for initialization
        void Start () {
            Agent = GetComponent<NavMeshAgent>();
            Agent.speed = 0f;
    
    	}
    	
    	// Update is called once per frame
    	void Update () {
    
            if (Input.GetMouseButtonDown(0))
            {
    
    
                
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                if (Physics.Raycast(ray.origin, ray.direction, out HitInfo))
    
                   Agent.destination = HitInfo.point;
                Agent.speed = 1f;
    
            }
    
    	}
    
    }

    voila ca fait quelques jours que je cherche je voulais pas déranger le monde mais bon j'ai le dos au mur, 

    merci d'avance pour votre aide !

    • Partager sur Facebook
    • Partager sur Twitter
      30 avril 2017 à 17:53:32

      Salut,

      Je ne suis pas programmeur de base mais j'ai quelques connaissances, donc ce que je dis n'est pas la science infuse.

      soit :

      1. tu regardes ça : http://answers.unity3d.com/questions/362629/how-can-i-check-if-an-animation-is-being-played-or.html

      2. soit tu utilise dans la fonction Update une condition du style if(!Animation.IsPlaying()){//si l'animation est arrêtée faire quelque chose, ex. mettre la vitesse à 0}

      3. tu crées une "coroutine" avec un WaitForSeconds(time) dedans, tu vas regarder la durée que fait l'animation et tu la mets à la place du "time"

      Enfin c'est des idées qui me vienne comme ça, j'ai pas testé ;)

      J'espère que ça pourra t'aider, a+

      • Partager sur Facebook
      • Partager sur Twitter
        25 août 2017 à 15:24:29

        Salut MrAmine! 

        Alors si j'ai bien compris, tu veux simplement changer d'animation dans ton blendTree, en fonction de si l'agent se déplace ou non.

        La propriété speed de NavMeshAgent ne permet pas de savoir la vitesse actuelle, mais la vitesse max. La mettre à 0 bloque juste l'agent sur place. La mettre à 1 dit qu'il se déplacera vers sa destination à 1 mètres par seconde. Pour ton problème, il serait plus simple de tester si l'agent est arrivé à destination ou non, et de modifier les animations en fonction.

        using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
        using UnityEngine.AI;
         
        public class ClickToMve : MonoBehaviour {
         
            //Variables
         
            public    RaycastHit HitInfo = new RaycastHit();
            NavMeshAgent Agent;
            Animator anim; //C'est lui qui s'occupe du changement d'animation.
         
            // Use this for initialization
            void Start () {
                Agent = GetComponent<NavMeshAgent>();
                //Agent.speed = 0f; 
                anim = GetComponent<Animator>(); // L'animator attaché au gameObject 
            }
             
            // Update is called once per frame
            void Update () {
         
                if (Input.GetMouseButtonDown(0))
                {          
                    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                    if (Physics.Raycast(ray.origin, ray.direction, out HitInfo))
                       Agent.destination = HitInfo.point;
                }
                AnimerEnFonctionPositionAgent();
        
            }
            void AnimerEnFonctionPositionAgent() 
            {
                if(agent.nextPosition != anim.transform.position) //nextPosition: Position suivante de l'agent.
                {
                    anim.SetFloat("ParamDeLanimQuiControleLeBlendtree", 1); //Demande une transition vers l'animation Walk==1 (dans ton ex)
                }
                else
                    anim.SetFloat("ParamDeLanimQuiControleLeBlendtree", 0); //Demande une transition vers l'animation Idle==0
            }
         
        }



        L'idée c'est que les animations sont jouées en fonction de la prochaine position. Si la prochaine position (Agent.nextPosition) est égale à l'actuelle, c'est PROBABLEMENT que  l'agent est arrivé à destination. On veut que l'animation jouée soit "Idle".

        Si la prochaine position de l'agent est différente de la position actuelle, alors on veut marcher.  

        J'espère que j'aurai pu t'apporter un début de réponse :)

        -
        Edité par Quevyn 25 août 2017 à 15:26:26

        • Partager sur Facebook
        • Partager sur Twitter
          31 août 2017 à 17:08:06

          @Quevyn : Ce que tu dis pour NavMeshAgent.speed est correct mais je ne suis pas sûr que ta méthode convienne à l'utilisation d'un BlendTree. J'imagine que l'effet recherché est d'avoir personnage qui marche plus ou moins lentement en fonction de sa vitesse. Dans ce cas là, mettre ce paramètre arbitrairement à 1 ou 0 rendrait l'interpolation inutile.

          Du coup, même si je n'ai pas de code à proposer, je pense qu'il serait plus adapté de regarder du côté de [NavMeshAgent.velocity] qui renvoie la vélocité courante de l'objet. Comme les NavMeshAgent prennent en compte les variations de vitesse quand ils se déplacent (accélération au démarrage, décélération à l'arrivée, etc.), ça devrait fonctionner avec le BlendTree.

          • Partager sur Facebook
          • Partager sur Twitter

          [Unity] bloquer sur une condition script C#

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown