Salut,
Est-ce que vérifier dans un script une variable qui est dans un autre component (qui aura été référencé par une variable du script dans Start) est mauvais niveau optimisation ? Parce que j'ai un algorithme simple dans Update qui fait que regarder un bool dans un tableau de référence de taille 20 qui contient des components (cf mon code en dessous), et ca me fait ramer alors que j'ai un bon PC, je passe de 80 à environ 50-60 fps.
Mon component qui remplit mon tableau de taille 20 est le suivant :
using UnityEngine;
using System.Collections;
public class SegmentCollDetect : MonoBehaviour {
public bool coll;
public int num;
void Start()
{
coll = false;
}
public void OnCollisionEnter2D(Collision2D other)
{
if(!LayerMask.LayerToName(other.gameObject.layer).Equals("TongueA"))
{
coll = true;
}
}
public void OnCollisionExit2D(Collision2D other)
{
if (!LayerMask.LayerToName(other.gameObject.layer).Equals("TongueA"))
{
coll = false;
}
}
}
Je check juste le bool coll de mes SegmentCollDetect. J'ai vraiment besoin de mettre cet algo dans Update, même si je peux éviter une itération par frame je voudrais savoir pourquoi ca rame autant et si il y a un moyen d'éviter de ramer sans toucher à l'itération de l'algo.
Salut,
J'ai suivi un tuto pour les déplacements du personnage, lui: https://www.youtube.com/watch?v=ruxqMhUtk1g
Je me suis arrêté à 16:30 pour tester mais j'ai un message d'erreur "NullReferenceException: Object reference not set to an instance of an object" et quand je lance le jeu le bouton pause reste bloqué
Le script
Une solution svp?
Salut MakiavelloX.
Je t'avoue que j'ai pas envie de regarder les 16 minutes de vidéo. Du coup, tu pourrai préciser quels sont toutes les erreurs et les lignes (il y a plusieurs choses de souligner dans le script). Quel est le langage utilisé aussi (JavaScript ou C#). Je suppose que c'est du JS, as-tu vérifié que le fichier n'était pas en .cs ?
As-tu bien un composant de type CharacterController
sur le GameObject ou tu as placé ce script ?
Salut,
voilà un screen de l'erreur
Pour le langage oui j'utilise le JavaScript, non le fichier n'est pas en .cs, et oui j'ai placé un composant "CharacterController" sur le GameObject où j'ai placé le script
Le 02 octobre 2016 à 21:01:24 MakiavelloX a écrit :
Salut,
voilà un screen de l'erreur
Pour le langage oui j'utilise le JavaScript, non le fichier n'est pas en .cs, et oui j'ai placé un composant "CharacterController" sur le GameObject où j'ai placé le script
Le problème vient de la ligne 12. Tu n'indiques pas de quel objet tu désires le Component. Utilise gameObject.GetComponent().
Le problème vient de la ligne 12. Tu n'indiques pas de quel objet tu désires le Component. Utilise gameObject.GetComponent().
Comment je dois faire stp? Comment je dois utilisé le "gameObject.GetComponent()" ?
c'est pas normal que les mots soient soulignés comme ça, partage ton fichier si ça marche toujours pas.
pour l'autre pb d'optimisation j'ai pas le niveau comme surement pas mal ici
Hello thelastofus2,
Est-ce que vérifier dans un script une variable qui est dans un autre component (qui aura été référencé par une variable du script dans Start) est mauvais niveau optimisation ? Parce que j'ai un algorithme simple dans Update qui fait que regarder un bool dans un tableau de référence de taille 20 qui contient des components
C'est une bonne option.
Maintenant reste à savoir la réalité de la vraie routine de ton Update et du mode de référencement dans ton Start.
Il n'est pas normal que ton Fps descente de cette façon si tu as opéré tel que tu le dit.
Une portion de code de ton Start et Update sur cette portion précise peut permettre éventuellement de t'aiguiller vers la bonne solution.
D'ailleurs à la lecture de ta classe "SegmentCollDetect", celle ci mérite déjà un minimum d'optimisation même si cela n'est pas liée à ta demande.
Je reste à ton écoute, si tu nous donne ici le code manquant à la compréhension du problème.
A+
TheLastOfUs2
Je n'ai pas très bien compris ce que tu fais. Regarder l'état d'une variable dans un autre component est une action banale et ne consomme pas spécialement, pas au point de baisser ton framerate. Cependant ce que je ne comprends pas c'est quand tu dis
tableau de référence de taille 20 qui contient des components (cf mon code en dessous)
Quel tableau ? Dans ton code rien ne fait référence à un tableau ? Peux tu être plus précis ?
MakiavelloX
Salut, je vois que tu est très débutant sur Unity et en programmation, à la place de répondre à ton problème je vais plus essayer de te rediriger vers de tutoriels plus adaptés à ton niveau et où tu comprendras mieux la logique algorithmique.
Celui là te permettra de comprendre les base d'Unity https://unity3d.com/learn/tutorials/projects/roll-ball-tutorial
Ce tutoriel est en anglais mais tu peux activer les sous titres sur les vidéos et les traduire automatiquement en français depuis le lecteur YouTube. Cet exercice va aussi te permettre de t'améliorer en anglais si tu n'es pas déjà un as, puisque l'anglais est extrêmement nécessaire de nos jours, pour tout les domaines et surtout l'informatique.
Sinon, je te conseille de faire des recherches par toi même pour trouver des solutions à tes erreurs et de ne poser tes questions sur le forum qu'en cas de blocage majeur, il est important de n'être dépendant de personne et donc le plus autodidacte possible.
Bonne chance
Hello MakiavelloX,
Le tutoriel sur lequel tu tente d'apprendre Unity date de 2012 !!!
Nous sommes presque en 2017 et Unity à énormément évolué depuis cette date.
Il te faut donc adapter les informations qui te sont données à celles possibles pour la version de ce jour. C'est un sacré handicap pour un débutant !!!
Je te conseille plutôt de suivre les tutoriels présents sur le site de Unity.
Ceux ci sont clairs, exempts de malformations et surtout facilement réalisables.
Bon courage et à bientôt.
Okay merci beaucoup pour votre aide !
Hello MakiavelloX,
Merci de votre merci. Cela fait plaisir .
Par contre si vous avez besoin d'être aiguillé sur le bon tuto à suivre en fonction de ce que vous avez comme envie du type de jeu que vous souhaitez approcher, n'hésitez pas à en préciser votre demande.
C'est avec plaisir que je tenterais de vous apporter la bonne réponse.
A+
Salut,
Merci pour votre aide, je vais plus détailler mon problème, en fait je tombe même jusqu'à 10 fps ou moins
Voilà mon algorithme :
public void raycastSetup(int n) // Parcours segColl[] de 0 à seg.length avec 2 for et une récursion
{
Debug.Log("raycastSetup :");
int s = -1, e=-1;
for (int i = n; i < segColl.Length; i++)
{ // Si segColl[i] == false, on stop le for et on break
if (!segColl[i].coll)
{
s = segColl[i].num;
Debug.Log("s : " + s);
break;
}
}
if(s!=-1&&s<tongueLength - 2)
{
for (int i = s+1;i<segColl.Length;i++)
{ // On reprend à s+1 Si segColl[i] == true, on stop le for et on break
if (segColl[i].coll && i > s + 1)
{
e = segColl[i-1].num;
Debug.Log("e : " + e);
break;
}
else if (segColl[i].coll && i == s + 1)
break;
}
if (e == -1 && s != segColl.Length - 1)
e = segColl.Length - 1;
if (e != -1)
{
raycastDrawnAndConstrain(s, e);
if (e < tongueLength - 3)
raycastSetup(e + 2);
// On veut reprendre l'algo de e à segColl.length
}
}
else
{
Debug.Log("Fin de rec");
}
}
Puis ces autres fonctions ne sont pas ce qui me fait ramer (après avoir tester avec et sans), c'est surtout l'algo du dessus. Je les mets quand même, même si ce n'est pas vraiment utile d'en tenir compte je pense :
public void raycastDrawnAndConstrain(int s, int e)
{
Debug.Log("Drawcast cree -- s : " + s + ",e : " + e);
RaycastHit2D ray;
Debug.DrawRay(segments[s].transform.position, segments[e].transform.position- segments[s].transform.position, Color.red,0f,true); //LayerMask.NameToLayer("TongueA")
constrainSeg(s, e);
}
private void constrainSeg(int s, int e)
{
for(int i = s;i<=e;i++)
{
segmentsRB[i].constraints = RigidbodyConstraints2D.FreezeRotation | RigidbodyConstraints2D.FreezePositionY;
}
}
Je vais expliquer mon algo raycastSetup parce que c'est pas forcément ultra lisible : Je veux parcourir mon tableau segColl entièrement, chaque segColl à un bool et je veux choper les suites de false (de s à e) pour appliquer mes autres fonctions dessus (qui ne font pas ramer après vérification, ou pas beaucoup). Et si je n'attends pas le bout du tableau segColl à la fin de la fonction, je recommence à e + 2.
Et pour finir ma fonction FixedUpdate :
void FixedUpdate()
{
if (isStickToObject && collDetect)
{
raycastSetup(0);
collDetect = false;
}
}
isStickToObject est toujours vrai et ne change pas dans Update, collDetect permet d'éviter de trop répéter l'algo (et donc sans ca je rame plus). J'utilise FixedUpdate parce que je manipule des composants physiques (cf mes fonctions osef que si je les retire ca ne rame pas moins).
Puis dans mon update il n'y a rien en rapport avec tout ca. Tout ca pour dire que c'est bien l'algo en lui même qui fait ramer à fond.
Puis POUR FINIR voilà comment j'initialise mon tableau segColl dans Start() :
segColl = new SegmentCollDetect[tongueLength - 1];
for (int i = tongueLength - 2; i >= 0; i--)
{
segColl[i] = segments[i].AddComponent<SegmentCollDetect>();
segColl[i].num = i;
}
C'est le tableau de l'objet que j'ai posté avant, je le remets :
using UnityEngine;
using System.Collections;
public class SegmentCollDetect : MonoBehaviour {
public bool coll;
public int num;
private Tongue tongueInfo;
void Start()
{
tongueInfo = GameObject.Find("Mayo").GetComponent<Tongue>();
coll = false;
}
public void OnCollisionEnter2D(Collision2D other)
{
if(!LayerMask.LayerToName(other.gameObject.layer).Equals("TongueA") && !coll)
{
coll = true;
tongueInfo.collDetect = true;
}
}
public void OnCollisionExit2D(Collision2D other)
{
if (!LayerMask.LayerToName(other.gameObject.layer).Equals("TongueA") && coll)
{
coll = false;
tongueInfo.collDetect = true;
}
}
J'ai ajouté un truc de type Tongue dedans mais pas besoin d'en tenir compte, ca me sert à optimiser l'algo.
Tout ca pour dire que c'est bien mon algo dans raycastSetup qui me fait rame. Désolé pour le gros pavé
Tout dépends de la taille de segColl, mais appeler un for à chaque frame ce n'est pas une bonne idée. As tu besoin de l'appeler à chaque frame ? Et si la configuration ne change pas pourquoi refaire le test ?
Tu ne dois appeler cette fonction que lorsque c'est réellement nécessaire, l'appeler une fois dans une seconde ne devrait pas poser de problème, mais à chaque frame ?
Sinon je ne comprends vraiment pas où tu veux en venir avec ton algo, qu'essaie tu de faire ? Il y a peut être un moyen plus simple et optimisé ?
J'ai crée un petit jeu sur android mais une fois exporté certains sprites perdent enormement en qualité. Une idée d'où ca vient ?
Quand tu sélectionnes ta sprite, dans le menu d'import, tu peux Override pour Android, et mettre en "True color".
fait mais ca ne change rien , je dois faire autre chose non ?
Coucou
J'aimerais savoir si c'est possible que quand je maintien x touche, mon perso charge une attaque et quand je lâche cette touche à partir de x secondes, il lance l'attaque?
J'ai cherché sur internet mais j'ai rien trouvé :/
C'est évidemment possible.
Une solution :
Dans ta classe tu créés une variable float debut que tu initialises à 0.0f.
Tu as une méthode qui te permet de savoir si une touche est enfoncée ou non :
https://docs.unity3d.com/ScriptReference/Input.GetKeyUp.html
https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html
Dans ta fonction Update() :
Si debut est différent de 0, et GetKeyDown("X") est true, alors debut = Time.time.
Si debut est égal à 0, et GetKeyUp("X") est true, alors la durée de la pression est : Time.time - debut. Et tu remets debut à 0.
J'espère avoir était suffisamment clair, si tu as une quesiton n'hésite pas. Peut être quelqu'un pourra proposé une meilleure idée ?
Le 06 octobre 2016 à 19:25:04 -Adridu84- a écrit :
Tout dépends de la taille de segColl, mais appeler un for à chaque frame ce n'est pas une bonne idée. As tu besoin de l'appeler à chaque frame ? Et si la configuration ne change pas pourquoi refaire le test ?
Tu ne dois appeler cette fonction que lorsque c'est réellement nécessaire, l'appeler une fois dans une seconde ne devrait pas poser de problème, mais à chaque frame ?Sinon je ne comprends vraiment pas où tu veux en venir avec ton algo, qu'essaie tu de faire ? Il y a peut être un moyen plus simple et optimisé ?
Je veux pouvoir créer une sorte de corde qui est composé de segments (17 dans ce cas là, soit la taille du tableau) qui serait initialement figé, et chacun de ces segments s'active une fois qu'ils rentrent en collision avec un objet. Même si je n'active pas la physique des segments, l'algo fait quand même laggé. Je vais chercher d'autres moyens d'éviter à la l'algo d'être appeler trop souvent si je ne peux pas optimiser l'algo en lui même