[RÉSOLU] Stopper des états d'animation avec un TAG

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Nek3D
Messages : 13
Inscription : 24 Juin 2018 13:37

[RÉSOLU] Stopper des états d'animation avec un TAG

Message par Nek3D » 30 Juin 2020 18:00

Salut la communauté, :hello:

J'ai une petite question :

J'aimerai savoir si il est possible sans boolean d'interdire certains états dans mon animation controller.

Plus concrètement, je fabrique un monde ou beaucoup de PNJ se ballade sur un navmeshagent mais lorsqu'ils commencent a prendre des escaliers tous ensemble, un embouteillage monstre se met en place.
Disons que le personnage a une animation Idle et une autre Walking.
Dès le départ, le PNJ marche. Je répète l'état une dizaine de fois en utilisant le root motion et ensuite je passe une fois en idle et retourne au départ de l'animation donc il recommence a marcher et ainsi de suite.
J'ai taggé mes états Idle avec le mot Idle.
Donc la question est :
Ai-je la possibilité d'interdire les états tagés Idle lorsqu'ils empruntent un escalier.
Pour l'instant j'ai ça qui fonctionne très bien (je n'ai que deux hauteurs de sols dans ce monde) mais je ne sais pas quoi entrer comme code pour dire au PNJ. « Hè mec, tu es sur un escalier alors continue à marcher» :lol:

Code : Tout sélectionner

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

public class EscalierPNJ : MonoBehaviour
{
    Animator anim;

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

    // Update is called once per frame
    void Update()
    {
        if (transform.position.y >=1.3f && transform.position.y <= 9)
        {
            Debug.Log("Escalier");

        }

    }
}

Merci d'avance pour votre aide
 ! Message de : boubouk50
Merci d'utiliser les balises prévues pour encapsuler le code
Dernière édition par Nek3D le 01 Juil 2020 21:26, édité 3 fois.

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Stopper des états d'animation avec un TAG

Message par EmileF » 30 Juin 2020 19:36

Salut

Une façon de savoir si ton PNJ est dans un escalier serait d'équiper ton escalier d'un trigger et utiliser la fonction OnTriggerEnter()

Une simple idée.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Nek3D
Messages : 13
Inscription : 24 Juin 2018 13:37

Re: Stopper des états d'animation avec un TAG

Message par Nek3D » 30 Juin 2020 19:54

Oui mais là n'est pas le problème.
Grace à la hauteur du PNJ dans la scène je peux savoir si il est dans un escalier ou pas comme expliqué au-dessus.
Mais comment lui expliquer que certains états dans l'animation ne devrait plus être joués a ce moment ?
J'ai pourtant été clair dans ma question non ? :roll:

Avatar de l’utilisateur
hbollon
Messages : 10
Inscription : 18 Juin 2020 13:13
Contact :

Re: Stopper des états d'animation avec un TAG

Message par hbollon » 30 Juin 2020 21:38

Salut,
Pourquoi ne pas vouloir utiliser de booléen alors que ce que tu veux faire dépend d'un état binaire (donc d'un booléen) pour trigger ou non un événement?
Personnellement, j'utiliserai dans cette situation un attribut privé booléen avec onCollisionEnter/onCollisionExit (ou onTrigger selon ton cas), un truc du genre :

Code : Tout sélectionner

private boolean onStairs;

private void OnCollisionEnter(Collision other) {
        if(other.gameObject.tag.Equals("Stairs") && !onStairs)
        	onStairs = !onStairs;
}
private void OnCollisionExit(Collision other) {
         if(other.gameObject.tag.Equals("Stairs") && onStairs)
        	onStairs = !onStairs;
}

private void Update(){
	// Ton traitement
}
Après sinon, tu pourrai éventuellement utiliser une collection générique contenant tes 2 anims servant de "pool" et avec le même principe que le précédent, tu retire l'anim idle quand il est dans les escaliers empêchant ton npc de prendre ce statut avec un petit traitement dans ton Update ou ta coroutine. (Pour la collection, une List de System.Collections.Generic fera largement l'affaire et est facile à manipuler).

Voilà, comme ça je pense à rien d'autre :mrgreen:

PS : Tu aurai dû poster dans le sous-forum "Scripting Javascript, C# et Boo", ici c'est plus pour les partages de scripts :)

EDIT : Ah et puis à mon avis tu ferai mieux de gérer la détection des escalier par le biais d'un trigger ou d'une collision que par la position du npc, c'est un bon moyen de faire une usine à gaz et si par la suite tu fait d'autres trucs en hauteur faudra tout adapter ^^

Nek3D
Messages : 13
Inscription : 24 Juin 2018 13:37

Re: Stopper des états d'animation avec un TAG

Message par Nek3D » 01 Juil 2020 10:54

Ok merci pour vos réponses.
Je l'ai joué avec un trigger du coup et ça fonctionne parfaitement. :super:

Code : Tout sélectionner

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

public class EscalierPNJ : MonoBehaviour
{
    Animator anim;

    void Start()
    {
        anim = GetComponent<Animator>();
    }

    void Update()
    {
        if (transform.position.y >=1.3f && transform.position.y <= 9)
        {
            anim.SetTrigger("WalkingTrigg");
            anim.ResetTrigger("IdleTrigg");
        }
        else
        {
            anim.SetTrigger("IdleTrigg");
            anim.ResetTrigger("WalkingTrigg");
        }
    }
}

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: Stopper des états d'animation avec un TAG

Message par djulio74 » 01 Juil 2020 18:12

Salut,
Quand as à un post dont le problème a été résolu, pense à éditer le premier message pour y ajouter [RÉSOLU] au début du titre :)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Répondre

Revenir vers « Scripting »