Page 1 sur 1

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

Publié : 30 Juin 2020 18:00
par Nek3D
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

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

Publié : 30 Juin 2020 19:36
par EmileF
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.

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

Publié : 30 Juin 2020 19:54
par Nek3D
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:

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

Publié : 30 Juin 2020 21:38
par hbollon
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 ^^

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

Publié : 01 Juil 2020 10:54
par Nek3D
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");
        }
    }
}

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

Publié : 01 Juil 2020 18:12
par djulio74
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 :)