[Résolu] Problème de caméra qui "saute"

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

[Résolu] Problème de caméra qui "saute"

Message par Badfly » 29 Juin 2017 18:37

Bonjour à tous,

Je me tourne vers vous car j'ai un problème au niveau de ma caméra :

Je souhaite qu'elle tourne sur son axeY, j'ai donc ceci comme code :

Code : Tout sélectionner

          
if (Input.GetMouseButton(1) && (Input.GetAxis("Mouse X") != 0))
{
     rotationY += Input.GetAxis("Mouse X");          
     transform.rotation = Quaternion.Euler(transform.localEulerAngles.x, rotationY, transform.localEulerAngles.z);
 }
Bon jusqu'à là tout va bien, la caméra tourne bien. Maintenant quand j'appuis sur "Espace" la caméra doit se replacer derrière le joueur, avec la bonne orientation. Pour se faire, j'ai placé un gameObject qui est lié au personnage. Donc à l'appuis sur Espace, je place la caméra sur ce gameObject, voici le code :

Code : Tout sélectionner

 if (Input.GetKeyDown(KeyCode.Space))
 {
     GameObject.Find("Main Camera (1)").GetComponent<Transform>().position = GameObject.Find("posCamera").GetComponent<Transform>().position;
     GameObject.Find("Main Camera (1)").GetComponent<Transform>().rotation = GameObject.Find("posCamera").GetComponent<Transform>().rotation;                
            }
Et là encore ça fonctionne, a l'appuis de la touche, la caméra se replace bien.
Mais le problème c'est que si on souhaite modifier son orientation, et donc la faire pivoter, la caméra va faire un "bond" jusqu'à l'orientation qu'elle avait avant "Espace". Je sais pas si c'est très clair, au besoin je réexpliquerais.

Merci d'avance : )

Avatar de l’utilisateur
Greg
Messages : 156
Inscription : 08 Mai 2017 15:22

Re: Problème de caméra qui "saute"

Message par Greg » 29 Juin 2017 20:49

Bonjour,
il faut utiliser LookAt.

:merci:
Mon jeu de développement cellulaire : MICROBIOME (encore quelques bugs...)
(merci bien à ceux qui passent mettre des étoiles ! ^^)

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: Problème de caméra qui "saute"

Message par Badfly » 29 Juin 2017 21:01

Bonjour, et merci de m'avoir répondu.
Greg a écrit :Bonjour,
il faut utiliser LookAt.

:merci:

Code : Tout sélectionner

   
      if (Input.GetKeyDown(KeyCode.Space))
            {
                GameObject.Find("Main Camera (1)").GetComponent<Transform>().position = GameObject.Find("posCamera").GetComponent<Transform>().position;
                transform.LookAt(player);
            }
Cela ne change rien. J'oriente la caméra, appuis sur Space. Quand je souhaite réorienter la caméra, elle fait un bond à son ancienne position.

Avatar de l’utilisateur
Greg
Messages : 156
Inscription : 08 Mai 2017 15:22

Re: Problème de caméra qui "saute"

Message par Greg » 29 Juin 2017 23:31

Désolé, tout a l'heure j'ai répondu en faisant autre chose! :cote:

Alors premier problème... La fonction 'GameObject.Find' est gourmande en ressource, il vaut mieux déclarer ses objets publiques et les assigner dans l'éditeur ou alors dans le start des scripts. Mais pour ton code, si l'objet 'posCamera' est le premier enfant de ton objet 'player', je pense que le plus propre est ceci :

Code : Tout sélectionner

if (Input.GetKeyDown(KeyCode.Space))
        {
            Camera.main.transform.position = player.transform.GetChild(0).transform.position;
            transform.LookAt(player);
        }
Ensuite tu dis d'abord :
Badfly a écrit :Mais le problème c'est que si on souhaite modifier son orientation, et donc la faire pivoter, la caméra va faire un "bond" jusqu'à l'orientation qu'elle avait avant "Espace".
puis ensuite :
Badfly a écrit : J'oriente la caméra, appuis sur Space. Quand je souhaite réorienter la caméra, elle fait un bond à son ancienne position.
position ou orientation? déjà que c'est pas très clair ^^

bref dans les deux cas cela doit être le même problème.
Soit la position (ou l'orientation) est visiblement gérer ailleurs (dans un update sans doute).

Soit ce que tu cherches à faire est plutôt ceci je pense :

Code : Tout sélectionner

if (Input.GetKeyDown(KeyCode.Space))
        {
            Transform cam = Camera.main.transform;
            cam.LookAt(player);
            cam.position = player.transform.GetChild(0).transform.position;
            cam.parent = player.transform.GetChild(0).transform;
        }
Mon jeu de développement cellulaire : MICROBIOME (encore quelques bugs...)
(merci bien à ceux qui passent mettre des étoiles ! ^^)

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: Problème de caméra qui "saute"

Message par Badfly » 30 Juin 2017 00:01

Merci pour tes réponses, mais je pense que tu ne cible pas bien mon problème. Cela serait plus simple en vidéo mais bon je vais essayer d'expliquer un peu mieux :

Ma caméra se déplace de gauche à droite et de haut en bas. Et elle peut tourner sur elle même pour voir autour.
Au moment d'appuyer sur la touche espace, la caméra se déplace derrière le personnage, sur le GameObject posCamera.
Donc tout cela fonctionne.

Mais, après avoir repositionné et réorienter la caméra. (Donc positionné sur le posCamera, et en regardant le joueur), si je souhaite faire pivoter la caméra, l'orienter différemment, alors elle va faire un bond. Mais après cela, je peux la faire pivoter fluidement sans de nouveaux bonds.

Mais elle ne fait pas un bonds au pif, la caméra reprend la même angle, avant que j'appuis sur espace.

Code : Tout sélectionner

        	rotationY += Input.GetAxis("Mouse X");          
                transform.rotation = Quaternion.Euler(transform.localEulerAngles.x, rotationY, transform.localEulerAngles.z);
Je pense que mon problème vient plutôt de ce code. Quand j'appuis sur espace, rotationY lui ne change pas. Donc quand je souhaite faire pivoter la caméra, même très légèrement, alors elle va se position à rotationY.

Tu comprend mieux mon problème ? ^^
Mais je ne sais pas comment régler cela justement.

Avatar de l’utilisateur
Greg
Messages : 156
Inscription : 08 Mai 2017 15:22

Re: Problème de caméra qui "saute"

Message par Greg » 30 Juin 2017 00:27

pas vraiment... un bond... ça veut dire quoi un bond?
Ensuite tu dis encore 'elle va se position à rotationY'... position, rotation... c'est ambigu...

Tu devrais poster ton controler en entier qu'on comprenne le code et éventuellement le problème...

au pif je tenterais :

Code : Tout sélectionner

if (Input.GetMouseButton(1))
{
     rotationY = Input.GetAxis("Mouse X");         
     transform.rotation = Quaternion.Euler(transform.rotation.x, transform.rotation.y + rotationY, transform.rotation.z);
 }
 
Mon jeu de développement cellulaire : MICROBIOME (encore quelques bugs...)
(merci bien à ceux qui passent mettre des étoiles ! ^^)

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: Problème de caméra qui "saute"

Message par Badfly » 30 Juin 2017 00:43

Un bond, ou se téléporter comme tu veux.

Position bah c'est la position en axe Y, X (transform.position)
et rotation bah c'est la rotation de la caméra sur son axe Y(transform.rotation)

Mon problème c'est que quand je souhaite faire pivoter ma caméra, elle va se téléporter (et je précise, elle ne se téléporte pas sur son axe X,Y,Z, mais juste l'angle Y va admettons passer de 0, à 45 d'un coup).

Petit exemple concret. Je lance le jeu, je fais pivoter la caméra sur son axe Y, c'est fluide, c'est jolie.
Je la place à transform.rotation.Y = 45.
Ensuite, j'appuis sur Espace, la caméra va donc se remettre à 0 (transform.rotation.Y = 0)
Et à ce moment là, si je souhaite la faire pivoter de nouveau, même juste très légèrement, elle va se remettre directement à
transform.rotation.Y = 45.
Pourtant, après cette "téléportation", "bond", on peut appeler comme on veut hein, je peux la faire pivoter sur son axe Y avec fluidité, il n'y a plus de "bond". (Mais si je la recentre grâce à Espace, elle va refaire un "bond")
Le je place la caméra à transform.rotation.Y = 20, puis espace. Quand je voudrais faire pivoter la caméra, elle se remettra d'abord à transform.rotation.Y = 20 avant de se pivoter normalement.


Le bout de script que j'ai mis est le même que plus haute (sans le if) tout les scripts que j'ai mis sont sur le même fichier. Et ce script est collé sur la caméra.

Et je pense pas que ça intéresse que je mette les bouts de code quand je déplace la caméra avec les flèches. ^^

Mais je répète, la caméra pivote bien sur elle même, elle se déplace bien sur son axe X, Y.
Quand j'appuis sur espace, elle se place bien derrière le jouer, et s'oriente vers le joueur. Tous cela fonctionne bien. Donc a part les bouts de code pour faire pivoter la caméra, et pour replacer la caméra, je ne vois pas ce qui peut être utile.
Et le tout est dans la fonction Update de la caméra.

Et nan, ta solution "au piff" ne fonctionne pas :)

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: Problème de caméra qui "saute"

Message par evereal » 30 Juin 2017 08:50

Salut,

Au vu du comportement, je pense que le problème vient de la variable rotationY. Comme l'a dit Greg, il faudrait le code entier pour voir si c'est bien ça.
Tu px essayer ça en ajoutant ceci (remplace le nom du script de ta camera)

Code : Tout sélectionner

if (Input.GetKeyDown(KeyCode.Space))
 {
     GameObject.Find("Main Camera (1)").GetComponent<Transform>().position = GameObject.Find("posCamera").GetComponent<Transform>().position;
     GameObject.Find("Main Camera (1)").GetComponent<Transform>().rotation = GameObject.Find("posCamera").GetComponent<Transform>().rotation;
     GameObject.Find("Main Camera (1)").GetComponent<MonScriptDeControleCamera>().rotationY = 0;
 }
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: Problème de caméra qui "saute"

Message par Badfly » 30 Juin 2017 13:40

Bonjour et merci à toi de te joindre à nous evereal :)

Alors oui, je suis moi même convaincu que cela vient de rotationY. Mais en modifiant ce que tu m'as dis, il y'a toujours le problème. En revanche, la caméra fait un "bond" à rotation..y = 0 au lieu de reprendre "son ancienne position avant de faire espace". Du coup j'ai remplacé en dur par rotationY = -34.42F (ce qu'il correspond à rotation.Y une fois appuyer sur espace) donc il ne saute plus amazing.
Mais étrange de devoir le faire à la main, en dur :(

Et comme vous avez tous l'air d'avoir une envie folle de voir le fichier movementCamera donc le voilà :D Mais la variable rotationY n'est pas utilisé autre part.

Code : Tout sélectionner

public void OnUpdate()
	{
	if (!EventController.inRepaireMod)
        {
            if (Input.GetKey(KeyCode.UpArrow))
            {
                transform.localPosition = new Vector3(transform.position.x, transform.position.y, transform.position.z + 1);
                inMove = true;
            }
            if (Input.GetKey(KeyCode.DownArrow))
            {
                transform.localPosition = new Vector3(transform.position.x, transform.position.y, transform.position.z - 1);
                inMove = true;
            }
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                transform.localPosition = new Vector3(transform.position.x - 1, transform.position.y, transform.position.z);
                inMove = true;
            }
            if (Input.GetKey(KeyCode.RightArrow))
            {
                transform.localPosition = new Vector3(transform.position.x + 1, transform.position.y, transform.position.z);
                inMove = true;
            }

            if (Input.GetMouseButton(0) && (Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0) && !(EventSystem.current.IsPointerOverGameObject()) && EventController.editorMovingMod == false && !EventController.inventoryIsOpen)
            {
                Cursor.visible = false;
                inMove = true;
                float horizontalTranslation = Input.GetAxis("Mouse X") * sensitivity * Time.deltaTime;
                float vertcialTranslation = Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime;

                transform.localPosition = new Vector3(transform.position.x, 37.82F, transform.position.z);
                transform.Translate(horizontalTranslation * -1, 0, vertcialTranslation * -1);
                transform.localPosition = new Vector3(transform.position.x, 37.82F, transform.position.z);                
            }

            if (Input.GetMouseButtonUp(0))
            {
                Cursor.visible = true;
                inMove = false;
            }

            if (Input.GetKeyDown(KeyCode.Space))
            {
                GameObject.Find("Main Camera (1)").GetComponent<Transform>().position = GameObject.Find("posCamera").GetComponent<Transform>().position;
                GameObject.Find("Main Camera (1)").GetComponent<Transform>().rotation = GameObject.Find("posCamera").GetComponent<Transform>().rotation;
                GameObject.Find("Main Camera (1)").GetComponent<CameraMovement>().rotationY = -33.65F;
            }

            if (Input.GetMouseButton(1) && (Input.GetAxis("Mouse X") != 0))
            {
                rotationY += Input.GetAxis("Mouse X");
                transform.rotation = Quaternion.Euler(transform.localEulerAngles.x, rotationY, transform.localEulerAngles.z);  
            }
        }

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

Re: Problème de caméra qui "saute"

Message par boubouk50 » 30 Juin 2017 13:45

Ce n'est tout simplement un manque d'initialisation de la variable rotationY?
Avant de commencer à bouger, il faut que cette variable soit réinitialisée (et seulement à ce moment) avec la bonne rotation, celle en cours donc, sinon, elle aura toujours l'ancienne valeur et donc sautera à cette position.

EDIT - Ah bah si on s'édite en même temps ^^
"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

Répondre

Revenir vers « Scripting »