Trajet ITWEEN changé en trajet DOTWEEN

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

Trajet ITWEEN changé en trajet DOTWEEN

Message par freepl » 04 Juil 2015 18:16

Bonjour

suite à vos recommandations je suis passé de ITWEEN à DOTWEEN
J'essaie de modifier mon code en utilisant DOTWEEN mais j'ai des erreurs et je ne sais pas quelle variable utiliser pour remplacer "myPathWaypointsArray".

principe du code
Je connais le nombre d'index, l'écart entre eux, et en fonction de la vitesse affichée , on calcule le temps mis pour effectuer le path

code erreur sur 2 lignes ( normal , j'ai dupliqué la même)
"Assets/SCRIPT/Route/TrajetVl.cs(43 et 50 ,35): error CS1501: No overload for method `DOPath' takes `4' arguments"

Code : Tout sélectionner

using UnityEngine;
using System;
using System.Collections;
using DG.Tweening;

public class TrajetVl : MonoBehaviour {

	//chemin à prendre
	public GameObject target_Path;
	//vitesse km/h
	public float kmh;
	//distance entre point
	public float mEntrePoint = 5.0f;
	
	private float time;
	public float fraction;	
	private bool start;
	private Transform[] tabt;
	
	void Start () {
		SetPath(target_Path);
	}
	
	void SetPath (GameObject pathObject) {
		int id = 0;
		tabt = new Transform[pathObject.transform.childCount];
		foreach (Transform child in pathObject.transform) {
			tabt[id++] = child.transform;
		}

		start = true;
	}





	void LateUpdate () {
		//nombre de point * distance entre point / km/h / 3.6
		time = (tabt.Length * mEntrePoint)/(kmh / 3.6f);
		if (start) {			
			//transform.position = iTween.PointOnPath(tabt, fraction); // ligne ITWEN qui fonctionne
			transform.DOPath(myPathWaypointsArray, time, PathType.CatmullRom).SetOptions(true).SetLookAt(0.0001f).SetLoops(-1);
			
			fraction += Time.deltaTime / time;
			if (fraction > 1.0f)
				fraction = 0.0f;
			
			//transform.LookAt(iTween.PointOnPath(tabt, fraction + 0.001f));// ligne ITWEN qui fonctionne
			transform.DOPath(myPathWaypointsArray, time, PathType.CatmullRom).SetOptions(true).SetLookAt(0.0001f).SetLoops(-1);
         }
	}
}


Avatar de l’utilisateur
cayou66
Codeur
Codeur
Messages : 6450
Inscription : 30 Juin 2011 14:45
Localisation : Montréal

Re: Trajet ITWEEN changé en trajet DOTWEEN

Message par cayou66 » 05 Juil 2015 16:20

Salut,
je vois nulle part où est défini "myPathWaypointsArray", le 1er argument du DoPath est un Array de Vector3.

Edit: (en réfléchissant un peu, je me suis dit...) Si tu veux transformer ton array de Transform en array de Vector3:

Code : Tout sélectionner

Vector3[] myPathWaypointsArray= new Vector3[tabt.length];
for(int iPos = 0; iPos < tabt.length; iPos++)
{
    myPathWaypointsArray[iPos] = tabt[iPos].position;
}
Je pense qu'on peut faire plus élégant avec Linq, mais ça devrait marcher.

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: Trajet ITWEEN changé en trajet DOTWEEN

Message par freepl » 05 Juil 2015 17:27

Salut

J'ai modifié le code mais cela ne fonctionne pas.
J'ai 2 erreurs

Assets/SCRIPT/Route/TrajetVl.cs(43,47): error CS1061: Type `UnityEngine.Transform[]' does not contain a definition for `length' and no extension method `length' of type `UnityEngine.Transform[]' could be found (are you missing a using directive or an assembly reference?)


Assets/SCRIPT/Route/TrajetVl.cs(42,66): error CS1061: Type `UnityEngine.Transform[]' does not contain a definition for `length' and no extension method `length' of type `UnityEngine.Transform[]' could be found (are you missing a using directive or an assembly reference?)


En fait je désire passer de ITWEEN à DOTWEEN pour avoir des animations plus fluides.
Actuellement dans ma maquette je suis monté à 2 800 Draws calls et fps vers 10.
Image

Si vous avez une idée d'amélioration pour la fluidité ?

Merci

Code : Tout sélectionner

using UnityEngine;
using System;
using System.Collections;
using DG.Tweening;

public class TrajetVl : MonoBehaviour {
	
	//chemin à prendre
	public GameObject target_Path;
	//vitesse km/h
	public float kmh;
	//distance entre point
	public float mEntrePoint = 5.0f;
	
	private float time;
	public float fraction;   
	private bool start;
	private Transform[] tabt;
	
	void Start () {
		SetPath(target_Path);
	}
	
	void SetPath (GameObject pathObject) {
		int id = 0;
		tabt = new Transform[pathObject.transform.childCount];
		foreach (Transform child in pathObject.transform) {
			tabt[id++] = child.transform;
		}
		
		start = true;
	}
	
	

	
	
	void LateUpdate () {

		// pour transformer l' array de Transform en array de Vector3:

		Vector3[] myPathWaypointsArray= new Vector3[tabt.length];
		for(int iPos = 0; iPos < tabt.length; iPos++)
		{
			myPathWaypointsArray[iPos] = tabt[iPos].position;
		}



		//nombre de point * distance entre point / km/h / 3.6
		time = (tabt.Length * mEntrePoint)/(kmh / 3.6f);
		if (start) {   


			//transform.position = iTween.PointOnPath(tabt, fraction); // ligne ITWEN qui fonctionne
			transform.DOPath(myPathWaypointsArray, time, PathType.CatmullRom).SetOptions(true).SetLookAt(0.0001f).SetLoops(-1);
			
			fraction += Time.deltaTime / time;
			if (fraction > 1.0f)
				fraction = 0.0f;
			
			//transform.LookAt(iTween.PointOnPath(tabt, fraction + 0.001f));// ligne ITWEN qui fonctionne
			transform.DOPath(myPathWaypointsArray, time, PathType.CatmullRom).SetOptions(true).SetLookAt(0.0001f).SetLoops(-1);
		}
	}





}



Avatar de l’utilisateur
cayou66
Codeur
Codeur
Messages : 6450
Inscription : 30 Juin 2011 14:45
Localisation : Montréal

Re: Trajet ITWEEN changé en trajet DOTWEEN

Message par cayou66 » 05 Juil 2015 17:42

Est-ce que tu lis le code ou alors tu fais un simple copier coller? :evil: :evil: :evil: :evil:

c'était Length et pas length, j'ai fais une erreur de frappe. Mais si t'avais essayé de comprendre le code tu aurais sans doute pu comprendre...Ou même une simple recherche google.

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: Trajet ITWEEN changé en trajet DOTWEEN

Message par freepl » 05 Juil 2015 18:05

Merci Cayou

J' essaie de comprendre le code mais je reconnais ne pas avoir encore le reflexe majuscule / minuscule :oops:
Le code fonctionne ( plus d'erreur).

Sur la vue dont j'ai pris le Draw Call j'avais des véhicules créés avec le système basé sur ITWEEN, (environ 80 voitures) ce qui faisait un draw call
à 2500 / 2 800

En utilisant le code modifié avec DOTWEEN plus de création de véhicules car tout est très lent.
Je suis passé à 2 fps et 700 Draw Call , sans véhicule créés.
Image
Je ne comprends pas car DOTWEEN est censé être plus performant .

Avatar de l’utilisateur
cayou66
Codeur
Codeur
Messages : 6450
Inscription : 30 Juin 2011 14:45
Localisation : Montréal

Re: Trajet ITWEEN changé en trajet DOTWEEN

Message par cayou66 » 06 Juil 2015 15:40

J' essaie de comprendre le code mais je reconnais ne pas avoir encore le reflexe majuscule / minuscule :oops:
Pas de problème alors ;)

Et sinon il dit quoi le profiler? DOTween est LARGEMENT plus performant que iTween et même qu'HOTween, tout dépend de ce que tu fais bien entendu. Au pif je dirais que t'appelle le DOPath à chaque frame?

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: Trajet ITWEEN changé en trajet DOTWEEN

Message par freepl » 06 Juil 2015 16:38

Salut

Par chance, ( je ne sais même pas comment !) le créateur de DOTWEEN a vu ce script .
Il m'a déjà répondu ceci , ( je laisse la version originale)
"In there, instead of storing the waypoint data once then updating the position of the vehicle every frame, you're actually storing the waypoint data every frame, plus creating a tween (which is useless in your case) every single frame."

Mais j'ai compris grosso modo que mon script, au lieu de stocker que les données de point de cheminement à chaque update, stocke beaucoup d'autres éléments inutiles et donc, cela rame énormément. Il devrait regarder ce qui bloque.
Je vous tiens au courant

Avatar de l’utilisateur
E3DStef
Administrateur
Administrateur
Messages : 1646
Inscription : 14 Juil 2013 18:30
Localisation : https://www.carte-des-membres.com/fr/Unity3D-France/

Re: Trajet ITWEEN changé en trajet DOTWEEN

Message par E3DStef » 06 Juil 2015 19:53

Cool qu'il t'ai répondu :-)

C'est chouette les dev qui suivent leur app !

Oui tiens nous au courant avec plaisir..
Le Savoir n'est Précieux que s'il est Partagé

Si besoin urgent de me contacter, faites moi un mail sur : franceunity3d@gmail.com

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: Trajet ITWEEN changé en trajet DOTWEEN

Message par freepl » 06 Juil 2015 20:41

pas de pb

A+

Avatar de l’utilisateur
cayou66
Codeur
Codeur
Messages : 6450
Inscription : 30 Juin 2011 14:45
Localisation : Montréal

Re: Trajet ITWEEN changé en trajet DOTWEEN

Message par cayou66 » 06 Juil 2015 21:19

Si je traduis:
"In there, instead of storing the waypoint data once then updating the position of the vehicle every frame, you're actually storing the waypoint data every frame, plus creating a tween (which is useless in your case) every single frame."
Ici, à la place de stocker les données du waypoint une fois et ensuite de mettre à jour la position de chaque véhicule chaque frame, tu stocke les données du waypoint à chaque frame en plus de créer un tween (ce qui est inutile dans ton cas) chaque frame.
En effet, tu ne devrais pas invoquer de Tween à chaque frame, mais plutôt qu'une seule fois.

Edit: C'est le principe du tween, à la différence d'un Update en faisant un Lerp tu appelle une et une unique fois le tween, qui va faire pour toi la boucle d'Update.

Répondre

Revenir vers « (C#) CSharp »