[Résolu] [MY-AL]Animations non trouvées sur perso mais existantes dans Project

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
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY-AL]Animations non trouvées sur perso mais existantes dans Project

Message par boubouk50 » 05 Nov 2019 11:22

NullReferenceException est l'erreur la plus commune, tu l'as déjà rencontré, c'est certain. Sa définition est très claire dans la documentation: NullReferenceException: Une NullReferenceException est levée lorsque vous essayez d’accéder à un membre sur un type dont la valeur est nulle. Une NullReferenceException reflète généralement l’erreur du développeur[...]
Dans ton code trajetVl, n'est pas initialisé avant d'être utilisé, il est donc null. Tu ne peux donc pas y accéder.
Normal, le Start a disparu:

Code : Tout sélectionner

void Start () {
		if (chien)
			trajetVl = transform.parent.parent.GetComponent<TrajetVl>();
		else 
			trajetVl = transform.parent.GetComponent<TrajetVl>();
	}
"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
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [MY-AL]Animations non trouvées sur perso mais existantes dans Project

Message par freepl » 05 Nov 2019 12:33

Salut

Plus de code d'erreur, merci.
Le perso avance en marchant puis l'animation cesse ( elle ne tourne pas en boucle apparemment) et le perso glisse le long de son path sans jouer d'animation.





code modifié

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class PietonAnimationEscalier : MonoBehaviour {
	
	private TrajetVl trajetVl;
	public Animation anim;
	public string idle, walk, montee, descente;
	public bool chien;

	void Start () {
		if (chien)
			trajetVl = transform.parent.parent.GetComponent<TrajetVl>();
		else 
			trajetVl = transform.parent.GetComponent<TrajetVl>();
	}



	void Update () {
		if (trajetVl.kmh != trajetVl.kmh) {
			UpdateAnimation (trajetVl.kmh);
			trajetVl.kmh = trajetVl.kmh;
		}
	}
	
	private void UpdateAnimation (float _speed) {
		switch ((int)Mathf.Round(_speed*10)) {
		case 0: anim.Play (idle);
			break;
		case 48: anim.Play (descente);
			break;
		case 49: anim.Play (montee);
			break;
		default: anim.Play (walk);
			break;
		}
	}
}

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

Re: [MY-AL]Animations non trouvées sur perso mais existantes dans Project

Message par boubouk50 » 05 Nov 2019 12:44

C'est à définir dans tes animations.
Tu dois dire à Unity qu'elles bouclent (LOOP). Ce doit être dans les Imports Settings dans l'onglet Animation.
"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
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [MY-AL]Animations non trouvées sur perso mais existantes dans Project

Message par freepl » 05 Nov 2019 13:09

Je vais refaire complètement mon animation et on va voir.


Dois-je respecter un ordre particulier ?
walk, idle et autre ou bien idle,walk... ?

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

Re: [MY-AL]Animations non trouvées sur perso mais existantes dans Project

Message par boubouk50 » 05 Nov 2019 14:48

Pourquoi cela? Il suffit de dire à Unity qu'elle boucle en fin d'animation et c'est bon. (loop)

C'est toi qui définis les noms et l'ordre, tu fais bien comme tu veux.
"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
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [MY-AL]Animations non trouvées sur perso mais existantes dans Project

Message par freepl » 05 Nov 2019 16:37

Je viens de refaire le perso avec les 3 animations dans un projet vide.
Je confirme que si je suis en humanoîd, les animations se jouent.
Mais si je modifie en legacy, aucune ne se lance.

Du coup je ne comprends pas le script. Lui il lui faut du legacy, mais le perso ne fait pas les enchainements si je le passe en legacy.

Je vous donne le pack pour que vous vérifiez mes dires
grosfi.ch/dyaScZyhmfd

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

Re: [MY-AL]Animations non trouvées sur perso mais existantes dans Project

Message par boubouk50 » 05 Nov 2019 16:54

J'utilise le Legacy (depuis 3dsMax avec skin) et cela fonctionne très bien.
A savoir, Humanoid fonctionne avec Animator et Legacy avec Animation. Donc tu ne peux pas avoir l'un sans l'autre.
Je ne trouve pas d'infos concernant l'impossibilité d'importer une animation Mixamo en Legacy, donc c'est possible sans souci. Il suffit d'importer le rig et les animations en Legacy / Store in roots, et ça devrait marcher.
Aussi, dans Mixamo, il faut exporter le FBX pour Unity et pas le FBX normal.
Je te conseille plutôt de te familiariser avec l'import d'animations en suivant des tutos ou documentation. Ça grouille: https://www.youtube.com/watch?v=r5yZe8nx8S0
C'est un exemple, pas forcément la formule magique.
"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
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [MY-AL]Animations non trouvées sur perso mais existantes dans Project

Message par freepl » 05 Nov 2019 22:24

Voilà donc j'ai réussi sur un perso pour les animations en legacy.
A v=0, le perso est bien en idle.
A v=4 ou 5 …, il est en walk.
Mais si je change sa vitesse en 4.9, le perso continue d'avancer au lieu de lancer l'animation montee comme demande dans le script.
Quand je vérifie la vitesse du perso, elle est bien passée à 4.9

Voici mon perso avec 3 animations en legacy ( je dois faire la quatrième)
grosfi.ch/LsLuGEu6QWs

le script

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class PietonAnimation : MonoBehaviour {

	private TrajetVl trajetVl;
	public Animation anim;
	public string idle, walk,descente,montee;
	public bool chien;

	void Start () {
		if (chien)
			trajetVl = transform.parent.parent.GetComponent<TrajetVl>();
		else 
			trajetVl = transform.parent.GetComponent<TrajetVl>();
	}

	// Update is called once per frame
	void Update () {
		if (trajetVl.kmh == 0) {
				anim.Play(idle);
		} else {
			if (trajetVl.kmh == 4.9) {
				anim.Play(montee);
			} 
			else {
				if (trajetVl.kmh == 4.8) {
					anim.Play(descente);
				} 
				else {
					anim.Play(walk);
				}
			}
		}
	}
}

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

Re: [MY-AL]Animations non trouvées sur perso mais existantes dans Project

Message par boubouk50 » 05 Nov 2019 23:11

Tu fais une comparaison de floats. Et c'est limite interdit.
Un float est un nombre décimal qui peut avoir quelques approximations.
4.9 peut valoir 4.900001 ou 4.899999 que ça ne change rien en soit mais pour la comparaison, c'est mort.
C'est pour cela que je te conseillais de passer par un switch qui lui oblige à passer par des entiers.
Sinon, il faut créer un entier à partir de ton float dans ce code, en multipliant par 10 puis castant en int. (Comme pour le switch). Ainsi tu auras des valeurs sures: 0, 48, 48 et 50 sur lesquelles travailler.
Tu peux aussi utiliser la comparaison de float: Mathf.Approximately qui prend en charge les approximations.
"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
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [MY-AL]Animations non trouvées sur perso mais existantes dans Project

Message par freepl » 06 Nov 2019 06:25

Bonjour très matinal.

J'ai modifié avec Math.approximately mais je ne vois pas ce que je dois mettre dans la ligne après la condition pour modiifer la valeur de la vitesse.
Il faut un Math.approximately par valeur non ? Ici pour 4.8 +/- des % et 4.9+/- des % ?
J'ai mis des encarts de +/- 0.02 . Faut-il plus ou moins ?

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class PietonAnimationEscalier : MonoBehaviour {
	
	private TrajetVl trajetVl;
	public Animation anim;
	public string idle, walk, montee, descente;
	public bool chien;
	
	void Start () {
		if (chien)
			trajetVl = transform.parent.parent.GetComponent<TrajetVl>();
		else 
			trajetVl = transform.parent.GetComponent<TrajetVl>();
		if (Mathf.Approximately(4.8f, 4.78f / 4.83f))
		{
			print("The values are approximately the same");
		}
		
		if (Mathf.Approximately(4.9f, 4.85f / 4.93f))
		{
			print("The values are approximately the same");
		}
	}
	






	
	void Update () {
		if (trajetVl.kmh != trajetVl.kmh) {
			UpdateAnimation (trajetVl.kmh);
			trajetVl.kmh = trajetVl.kmh;
		}
	}
	
	private void UpdateAnimation (float _speed) {
		switch ((int)Mathf.Round(_speed*10)) {
		case 0: anim.Play (idle);
			break;
		case 48: anim.Play (descente);
			break;
		case 49: anim.Play (montee);
			break;
		default: anim.Play (walk);
			break;
		}
	}
}

Répondre

Revenir vers « (C#) CSharp »