zoom sur un pentaminoL en boucle

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
juliuson
Messages : 110
Inscription : 03 Mai 2017 18:00

zoom sur un pentaminoL en boucle

Message par juliuson » 03 Jan 2025 20:29

Salut à tous,

J'ai un bug que je n'arrive pas à élucider.
En effet lorsque je clique sur le cube, il apparaît bien le pentamino L, mais si je laisse le bouton enfoncé (sans le relâcher) , le pentamino fait un zoom avan jusqu'à prendre tout l'écran, puis redevient petit pour rezoomer vers l'avant en boucle.

Voici une vidéo pour mieux comprendre.

https://youtu.be/IOMeZDQLCnw

J'ai éssayé le code suivant:

Code : Tout sélectionner

 if (hit.point.z <= 1.6f)
                {
                    pent.transform.localScale = new Vector3(1.6f, 1.6f, 1.6f);
                    pent.transform.position = hit.point; // Mettre à jour la position du cube
                }
Dans le code suivant:

Code : Tout sélectionner

public class clicCube : MonoBehaviour
{
    public GameObject cube; // Référence au cube à rendre transparent
    public GameObject pent; // Référence au pentaminio à déplacer
    private bool isDragging = false;
    private void OnMouseDown()
    {

        if (pent != null)
        {
            isDragging = true;
        }
        else
        {
            Debug.LogWarning("Aucun cube assigné !");
        }

        cube.GetComponent<Renderer>().enabled = false;

        //pent.transform.localScale = new Vector3(1.6f, 1.6f, 1.6f);
    }

    private void Update()
    {
        if (isDragging && pent != null)
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out RaycastHit hit))
            {
                if (hit.point.z <= 1.6f)
                {
                    pent.transform.localScale = new Vector3(1.6f, 1.6f, 1.6f);
                    pent.transform.position = hit.point; // Mettre à jour la position du cube
                }
                if ((hit.transform.gameObject.name == "cubeU") || (hit.transform.gameObject.name == "cubeL"))
                    if (cube != null)
                    {
                        cube.SetActive(false); // Désactiver le cube cible
                    }
            }
        }
    }

    private void OnMouseUp()
    {
        isDragging = false;
    }
}
J'ai cherché des traces de de 'localScale', mais je n'en ai pas trouvé, le pentamino L n'arrête pas de s'agrandir.

Merci pour votre aide,

A+

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

Re: zoom sur un pentaminoL en boucle

Message par boubouk50 » 06 Jan 2025 09:50

Salut,
ton problème n'est pas le scale mais la position (on voit l'ombre qui montre le déplacement vers le haut).

Code : Tout sélectionner

pent.transform.position = hit.point;
Ton hit.point doit se faire sur ton gameObject donc un peu plus haut à chaque fois et ça le fait monter.

Code : Tout sélectionner

if (hit.point.z <= 1.6f)
Cette condition est donc à revoir. Le plus simple est d'utiliser un ou plusieurs booléens qui te permettent de savoir si tu as un objet sélectionné en cours, si tu es en mode drag, etc.
Tu peux aussi décider de passer par des enum pour statuer sur des 'modes' qui entraineront chacun un comportement différent. (un peu comme un statemachine)
"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

juliuson
Messages : 110
Inscription : 03 Mai 2017 18:00

Re: zoom sur un pentaminoL en boucle

Message par juliuson » 06 Jan 2025 13:28

Ma question est la suivante:

comment corriger mon code:

Code : Tout sélectionner

if (hit.point.z <= 1.6f)
 {
     pent.transform.localScale = new Vector3(1.6f, 1.6f, 1.6f);
     pent.transform.position = hit.point; // Mettre à jour la position du cube
 }
J'ai éssayé de rentrer le code suivant:

Code : Tout sélectionner

hit.point.z = 1.6f
Mais cela renvoie une erreur.

si vous avez des idées

Merci à vous,

A+

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

Re: zoom sur un pentaminoL en boucle

Message par boubouk50 » 06 Jan 2025 18:59

Comprends-tu ce que tu fais ?

Il n'y a pourtant rien de sorcier, et je ne parle pas de code, mais compréhension et d'analyse.
Lorsque tu testes si hit.point.z <= 1.6f, cela revient à faire un choix.
SI je suis au-dessus d'une valeur en z (ici 1.6) ALORS
-- Je fais ça
SINON
-- Je fais ça (ou je ne fais rien)

À quel moment dans ton jeu, est-ce utile ?
Si tu me réponds, parce que les cubes dont au-dessus de cette limite et pas le jeu, alors pose-toi la question suivante : est-ce que la hauteur est un bon critère de sélection ?
Unity te met à disposition des layers, des tags, des noms, etc. pour identifier les choses. Ne serait-il pas plus judicieux de savoir sur quoi tu as cliqué plutôt qu'une hauteur ?

Ici, ton problème n'est pas le code, c'est ta logique. Ton code n'en est que le reflet, et plus tu persisteras à ne pas réfléchir à ce qui est le plus logique, sensé, judicieux pour ton jeu, plus tu t'engouffreras dans du code de plus en plus dur à maintenir.
Je ne peux donc pas t'aider pour ton code, parce qu'il n'a pas de logique et je ne sais pas quoi faire pour que ça fonctionne. if (hit.point.z <= 1.6f) n'a aucun sens pour moi.
"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

juliuson
Messages : 110
Inscription : 03 Mai 2017 18:00

Re: zoom sur un pentaminoL en boucle

Message par juliuson » 07 Jan 2025 18:02

Ma question est la suivante:

comment empêhcer le pentamion L de grandir sur l'axe des Z.

En vous remerciant,

A+

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

Re: zoom sur un pentaminoL en boucle

Message par boubouk50 » 07 Jan 2025 18:44

Juliuson,
ça fait un sacré moment que tu es parmi nous maintenant, et j'ai encore l'impression que tu ne fais toujours aucun effort de compréhension. Si tu avais correctement lu mon message précédent, tu te rendrais combien ta question n'a pas de sens.
D'une parce qu'il ne "grandit" pas, de deux, parce que la réponse ne peut pas être donnée sans revoir ta logique de jeu.

La meilleure réponse à ta mauvaise question est :
Ne pas le positionner au point d'impact de la collision.

Code : Tout sélectionner

// pent.transform.position = hit.point;
Mais ce n'est pas ton problème. Ton problème est que tu dois déplacer ton pentamino différemment en changeant ta condition, ou bien changer ton Raycast pour qu'il ne détecte que le plateau de jeu en utilisant un Layer par exemple.

Donc :
  • Crée un layer Plateau
  • Place ton plateau de jeu dans ce layer
  • Modifie ton Raycast pour qu'il n'agisse que sur ce layer.
Ainsi, le hit sera toujours au niveau du plateau de jeu.
"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

juliuson
Messages : 110
Inscription : 03 Mai 2017 18:00

Re: zoom sur un pentaminoL en boucle

Message par juliuson » 07 Jan 2025 20:21

Salut,

Je ne comprends pas ce que tu entends par cela:

* Crée un layer Plateau
* Place ton plateau de jeu dans ce layer
* Modifie ton Raycast pour qu'il n'agisse que sur ce layer.

Chez moi la grille est constituée de petits plans bleus.
Dans quel layer et comment placer le plateau dans ce layer.
Pourquoi modifier le rayCast, puisqu'il gère le clic sur un cube (voir code)
Mais je ne comprends pas pourquoi il y a un effet de zoom lorsque l'on clique sur le pentamino L.

Bien à vous,

A+

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

Re: zoom sur un pentaminoL en boucle

Message par boubouk50 » 08 Jan 2025 12:29

juliuson a écrit :
07 Jan 2025 20:21
Je ne comprends pas ce que tu entends par cela:

* Crée un layer Plateau
* Place ton plateau de jeu dans ce layer
* Modifie ton Raycast pour qu'il n'agisse que sur ce layer.

Chez moi la grille est constituée de petits plans bleus.
Dans quel layer et comment placer le plateau dans ce layer.
Pourquoi modifier le rayCast, puisqu'il gère le clic sur un cube (voir code)
Mais je ne comprends pas pourquoi il y a un effet de zoom lorsque l'on clique sur le pentamino L.
Dans Unity, tu as la possibilité de "ranger" tes objets dans des layers (des calques). Ces layers ont des propriétés propres que tu peux atteindre depuis le code. Ainsi, il t'est possible de n'interagir qu'avec un layer et pas les autres, et donc de cibler un ensemble d'objets.
La fonction Raycast () a plusieurs utilisations, dont une qui te permet de choisir sur quel layer faire la collision (grâce au LayerMask). Ainsi, tu peux dire à ta fonction Raycast () de ne pointer que sur le layer de ton "sol", pour ne toucher que les objets de ton "sol", et ne pas toucher les autres objets. Le point de contact (hit) sera donc sur ton "sol", et pas sur ton pentaminoL (puisque le PentaminoL sera sur un autre Layer).

Ici, c'est le OnMouseDown () qui gère le clic sur le cube (et pas le Raycast comme tu le dis!!). Ton Raycast ne gère QUE le drag (et il ne devrait gérer que cela, sinon tu fais une autre fonction avec un autre Raycast). Il faut donc que tu le drag comme il faut, c'est-à-dire en suivant le "sol".

Pour les Layers, quand tu sélectionnes un objet, en haut à droite de l'inspecteur, tu as un menu déroulant Layer (à côté de Tag). Par défaut, tu as les 8 premiers layers d'existant (utiles pour Unity) mais tu peux en créer quelques-uns spécifiques en cliquant sur Add Layer. Ensuite, tu choisis ce nouveau layer de ton objet.
Enfin, dans ta fonction Raycast (), tu utilises le LayerMask pour donner le bit de ton layer (si tu l'appelles MonSol) :

Code : Tout sélectionner

LayerMask layerMask = LayerMask.GetMask("MonSol");
Des exemples sont donnés dans la documentation.
Le manuel d'utilisation des layers (traduit automatiquement par ton navigateur) et un tuto
"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

juliuson
Messages : 110
Inscription : 03 Mai 2017 18:00

Re: zoom sur un pentaminoL en boucle

Message par juliuson » 08 Jan 2025 13:26

Merci pour votre aide,

mais ce que je ne comprends pas , c'est l'effet de zoom du pentamino L.
Lorsque l'on clique dessus (voir vidéo youtube ci dessus).

Encore merci.

A+

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

Re: zoom sur un pentaminoL en boucle

Message par boubouk50 » 08 Jan 2025 17:28

Quand tu fais ton Raycast, tu vas chercher le point de collision entre tes objets et ton rayon.
Le pentaminoL se retrouve sous le raycast, donc le point de collision se trouve sur ton pentaminoL. Ensuite, tu déplaces ton pentaminoL au niveau de ce point (qui est plus haut).
À la frame suivante, ça recommence. Donc, tu déplaces ton pentaminoL un peu plus haut.
Et ainsi de suite, il monte. Comme il monte, il se rapproche de la caméra et fait croire qu'il grossit. Mais il ne grossit pas. C'est un effet d'optique. Tu peux voir l'ombre qui se déplace sur le sol sans grossir.
Une fois que le pentaminoL est trop haut, le raycast n'intersecte plus avec lui, mais avec le "sol". Donc le hit se trouve au niveau du sol. Du coup, tu déplaces ton pentaminoL à cet endroit, et il revient donc en position au sol.
Puis il recommence à monter, et ainsi de suite jusqu'à ce que tu bouges ta souris ailleurs, et ça recommencera ailleurs ou nulle part si tu ne rentres en collision avec rien.

Donc le raycast doit ignorer le pentaminoL pour ne pas le prendre en compte dans le calcul d'intersection de ton Raycast. Et pour ce faire, tu peux tout simplement utiliser les Layers et Layermasks.
"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 »