[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
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

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

Message par freepl » 04 Nov 2019 11:52

Bonjour

J'ai réalisé un personnage avec Mixamo avec plusieurs animations.
Le personnage marche, est en attente en baillant, monte et descend des escaliers ( animation de descente à faire)

Dans Inspector j'ai complété le script Animation avec celles-ci
Andromeda_baille
Andromeda_marche
Andromeda_montee_escalier
Andromeda_montee_escalier ( dupliquée de la précédente car je dois la modifiée sur Maya en descente_escalier)

Quand je lance la scène, le script me dit que les animations n'existent pas alors qu'elles sont visibles dans Project !?
Z041.jpg
Z041.jpg (74.61 Kio) Consulté 3398 fois


Le prefab à utiliser est Pieton_9.
Clic sur Corps
Z042.jpg
Z042.jpg (9.7 Kio) Consulté 3398 fois
Z043.jpg
Z043.jpg (88.48 Kio) Consulté 3398 fois


Code de base

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>();
	}

	// Update is called once per frame
	void Update () {
		if (trajetVl.kmh == 0) {
			anim.Play(idle);
		} 
		if (trajetVl.kmh == 4.9) {
			anim.Play(montee);
		} 
		if (trajetVl.kmh == 4.8) {
			anim.Play(descente);
		} 
		else {
			anim.Play(walk);
		}
	}
}
Voici le perso
https://melanissimo-ng.din.developpemen ... dyy7I-rNMw

code erreur

Code : Tout sélectionner

The animation state Andromeda_marche could not be played because it couldn't be found!
Please attach an animation clip with the name 'Andromeda_marche' or call this function only for existing animations.
UnityEngine.Animation:Play(String)
PietonAnimationEscalier:Update() (at Assets/SCRIPT/PietonAnimationEscalier.cs:23)
Merci du coup de main

Ps : J'espère être dans la bonne section cette fois-ci car j'ai le choix entre script ou animation.
Dernière édition par freepl le 15 Nov 2019 10:44, édité 1 fois.

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 » 04 Nov 2019 12:18

As-tu bien orthographié les noms des animations en respectant la casse?
Je vois que les strings d'animation commencent par une minuscule alors que le nom des animations par une majuscule.

Sinon, mis à part cela, ton code est inutile.
Dans ton Update (), tu vas continuellement jouer la première frame de l'animation walk ou descente si tu vas à 4.8km tout pile.
Il faut lier les conditions pour pas qu'elles se supplantent. Ici seules les deux dernières le sont avec le else, donc elles primeront sur les 2 premières. Un switch serait adapté.
Aussi, l'important c'est la vitesse, pas l'animation, donc tout devrait décliner de celle-ci. Tu devrais définir un changement de vitesse et pas un test constant.

Par exemple:

Code : Tout sélectionner

void Update () {
	if (currentSpeed != trajetVl.kmh) {
		UpdateAnimation (trajetVl.kmh);
		currentSpeed = trajetVl.kmh;
	}
}

private void UpdateAnimation (float _speed) {
	switch (Math.Round(_speed*10)) {
		case 0: anim.Play (idle);
			break;
		case 48: anim.Play (descente);
			break;
		case 49: anim.Play (montee);
			break;
		case default: anim.Play (walk);
			break;
	}
}
Ici, tu ne joues une animation que si la vitesse a changé. Les animations sont séparées en fonction de la vitesse (redéfinie par un entier arrondi) et ne peuvent être supplantées.
"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 » 04 Nov 2019 12:31

Salut

J'ai terminé mon perso tard hier soir et j'ai fait cette erreur.
Je viens de modifier mais l'erreur est toujours présente.
Z044.jpg
Z044.jpg (37.58 Kio) Consulté 3384 fois

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 » 04 Nov 2019 12:37

Je crois donc qu'on en revienne au même point que ton précédent post: Les animations doivent être en Legacy.
J'ai aussi édité ma réponse précédente (pour d'autres soucis à venir)
"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 » 04 Nov 2019 12:56

Exact pour le legacy. J'ai mis intentionnellement en Humanoïd car je l'avais vu sur un tuto dédié à Mixamo.
J'ai donc mis les trois animations en Legacy.
Le perso se déplace en marchant mais normalement en touchant un objet avec le script ci-dessous

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class Panneau : MonoBehaviour {
	//choix vitesse du panneau
	public float vitesse;
}
Sa vitesse doit passer à 4.9 comme renseignée
Z045.jpg
Z045.jpg (11.71 Kio) Consulté 3372 fois
Et une fois vitesse = 4.9, l'animation de montee doit être active, ce n'est pas le cas.
Le perso continue d'avancer.
Par contre celle à v=0 est actve.
Mon script de changement d'animation me semble bon .

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>();
	}

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

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 » 04 Nov 2019 13:45

Je viens de lire ton edit :roll:

si j'ai bien compris mon script d'origine fonctionne car je n'ai que 2 animations, soit l'une soit l'autre.
Pour plus il faut ton système.
J' ai modifié le script mais j'ai une erreur avec les accolades alors qu'elles sont bien par paire.
le script

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 Update () {
		if (currentSpeed != trajetVl.kmh) {
			UpdateAnimation (trajetVl.kmh);
			currentSpeed = trajetVl.kmh;
		}
	}
	
	private void UpdateAnimation (float _speed) {
		switch (Math.Round(_speed*10)) {
		case 0: anim.Play (idle);
			break;
		case 48: anim.Play (descente);
			break;
		case 49: anim.Play (montee);
			break;
		case default: anim.Play (walk);
			break;
		}
	}
}
le code erreur

Code : Tout sélectionner

Assets/SCRIPT/PietonAnimationEscalier.cs(28,17): error CS8032: Internal compiler error during parsing, Run with -v for détails
Assets/SCRIPT/PietonAnimationEscalier.cs(27,29): error CS1525: Unexpected symbol `default:'
Je dois utiliser la touche v ?

Avatar de l’utilisateur
Max
Messages : 8764
Inscription : 30 Juil 2011 13:57
Contact :

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

Message par Max » 04 Nov 2019 17:34

Salut,

Ce n'est pas case default: mais simplement default:.
Pareil, je pense que c'est plutôt Mathf.Round() au lieu de Math.Round()
Et ta variable currentSpeed, elle sort d'où. Car elle n'est pas déclarée dans ton script.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

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 » 04 Nov 2019 18:16

salut
Pour la variable currentspeed, c'est en fait la variable trajetVl.kmh qui me renseigne sur la vitesse (rectifié).

J'ai modifié mais autre erreur, il ne semble pas reconnaître

Code : Tout sélectionner

(Mathf.Round(_speed*10)

Code : Tout sélectionner

Assets/SCRIPT/PietonAnimationEscalier.cs(20,17): error CS0151: A switch expression of type `float' cannot be converted to an integral type, bool, char, string, enum or nullable type
code complet

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 Update () {
		if (trajetVl.kmh != trajetVl.kmh) {
			UpdateAnimation (trajetVl.kmh);
			trajetVl.kmh = trajetVl.kmh;
		}
	}
	
	private void UpdateAnimation (float _speed) {
		switch (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;
		}
	}
}
PS : comme vous le savez je fais des maquettes de projet routier. Du point de vue routier, tout fonctionne parfaitement, les feux, les vitesses, les priorités.J'aimerai pouvoir ajouter des persos en les créant moi-même ( ça j'y arrive, maya, Mixamo) et leur mettre 4 animations : idle, marche, montée et descente des escaliers.
Depuis mercredi dernier , pratiquement 7 jours, j'essaie mais je tourne en rond. Il ne me manque que ce petit plus pour avoir un super rendu. Actuellement mes perso des animations sont en low ply et en texure de basse qualité.
Les nouveaux sont bcp mieux.

Merci à tous pour vos coup de main.

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 » 04 Nov 2019 18:38

Le code erreur explique tout il faut un cast en int

Code : Tout sélectionner

((int)Mathf.Round(_speed*10)
Concernant ton premier code, il ne fait pas que les 2, il fait soit le premier, soit le deuxième, soit aucun des deux, ET l'un des deux derniers.
Le problème ce situe dans la structure de tes conditions, elles ne sont pas liées, il faudrait un else entre chaque condition.

Code : Tout sélectionner

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);
				}
			}
		}
	}
"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 11:03

Bonjour
Merci boubouk50
J'ai modifié le script.
J'ai cette erreur

Code : Tout sélectionner

NullReferenceException: Object reference not set to an instance of an object
PietonAnimationEscalier.Update () (at Assets/SCRIPT/PietonAnimationEscalier.cs:12)
Je comprend bien que le script n'arrive pas à instancier un objet mais sur le net je ne trouve que des articles sur l'erreur cs 1002, (recherche unity erreur cs : 12)

C# error CS 1002 " ; expected " - Unity Answers
Comment savoir quel objet n'est pas créé ?


Code complet

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 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;
		}
	}
}

si je remets mon code de base pas de msg d'errreur

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class PietonAnimation : MonoBehaviour {

	private TrajetVl trajetVl;
	public Animation anim;
	public string idle, walk;
	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 {
				anim.Play(walk);
		}
	}
}
Dernière édition par freepl le 05 Nov 2019 11:57, édité 2 fois.

Répondre

Revenir vers « (C#) CSharp »