[DB-AL] Probleme de collider box 2D

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
botigeek
Messages : 3
Inscription : 31 Juil 2018 13:27

[DB-AL] Probleme de collider box 2D

Message par botigeek » 31 Juil 2018 13:38

Bonjour,

Je commence a apprendre a utiliser Unity et je suis en train de faire un jeux de casse tete avec sur une grille. Pour faire court le principe est de trouver ou sont positionner les chateaux et donc quand je clique sur une case elle doit faire apparaitre un chateau avec une animation. Je fais ceci avec une box collider2D et un script :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour {

    public int pass = 0;
    public int k = 0;
    Animator m_Animator2;    
// Use this for initialization

    void Start () {
	m_Animator2 = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update () {
            if (Input.GetMouseButtonDown(0)) {
            Debug.Log("Pressed left click, casting ray.");
            CastRay2();
        }       
    }

    void CastRay2() {
        Ray ray1 = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit2D hit1 = Physics2D.Raycast (ray1.origin, ray1.direction, Mathf.Infinity);
        if (hit1) {
		k++;
		m_Animator2.SetTrigger("CastleAppear1");
        }
    }   

} 
Malheureusement quand je clique sur une case tous les chateaux apparaissent en meme temps. J'ai essayer de faire des GameObject differents, des scripts differents ect... Rien ne marche.

Merci d'avance.
Dernière édition par botigeek le 31 Juil 2018 15:11, édité 2 fois.

Avatar de l’utilisateur
DevAmat
Messages : 435
Inscription : 23 Nov 2016 11:50

Re: Probleme de collider box 2D

Message par DevAmat » 31 Juil 2018 14:00

Si ton script est présent sur chacun de tes châteaux, il est normal que toutes tes animations se jouent non?
Une solution possible:
- chaque châteaux a son collider (c'est déjà le cas normalement)
- ajouter un même script dans tes châteaux avec la fonction "MonoBehaviour.OnMouseDown()"
Cette fonction d'Unity est appelé si l'objet possède un Collider et qu'un click souris est détecté.
doc:
https://docs.unity3d.com/ScriptReferenc ... eDown.html
- dans cette fonction tu auras juste a jouer ton animation en récupérant "Animator Controller" comme tu l'as déjà fait.

Autre chose, essaye de donner des noms plus clair à tes variables. Par exemple "k" n'est pas du tout explicite.

ps: Dans ton script tu vérifies à chaque click souris si celui ci provoque une collision sur un objet. Si c'est le cas tu joues ton animation. Mais on est d'accord que si il y a collision avec le click souris elle est vraie dans tout tes GameObject car ton script dit juste "Ok il y a collision avec un objet donc je déclenche mon animation" sans tenir compte de quel GameObject précisément il s'agit...

botigeek
Messages : 3
Inscription : 31 Juil 2018 13:27

Re: Probleme de collider box 2D

Message par botigeek » 31 Juil 2018 15:10

Merci pour ta reponse rapide, pardon je ne connais pas encore bien Unity3D. Tu sais comment verifier sur quel GameObject je suis car c'est justement mon probleme. Au debut j'avais fait un trigger different pour chaques chateaux mais ca fait beaucoup quand ma carte est grande . Donc dans l'ideal je voudrais avoir un seul GameObject aue je duplique sur ma carte et quand je clique sur un je doit declancher le trigger de celui-ci pour lancer l'animation. Ou alors est ce au'il me faut obligatoirement un GameObject different pour chaque case de ma carte ?

De plus j'ai essaye la fonction que tu m'as dit mais elle n'est jamais appeler.

Autodidactelife
Messages : 47
Inscription : 21 Fév 2018 23:04
Localisation : France

Re: [DB-AL] Probleme de collider box 2D

Message par Autodidactelife » 02 Août 2018 00:29

Bonjour, pourquoi chercher le gameObject puisque ton script est déjà dessus :aille2:

Tu créer un seul château, tu y glisse le script avec la variable publique type animator (ex: public Animator monAnimation;)
Tu glisse ton château (qui possède l'animation donc un animator) sur le nouvelle emplacement type Animator qui ces afficher dans l'inspecteur de ta scène sur ton script du château.
Tu appel la variable pour setTrigger (monAnimation.setTrigger("mon trigger");) qui ce trouvera évidemment dans la fonction OnMouseDown();

Un fois ceci fait, tu déplace ton château dans tes assets pour créer un prefab. Si tu glisse le prefab sur ta scène ça en créera un nouveau, chaque script d'objet n'est pas lié, donc activé un château n'activera pas les autres.

Contrairement à ton script l'event sera déclencher uniquement si le château subit un clique, donc si tu cliques sur un les autres ne reçoit pas l’événement étant donner que tu ne leurs à pas tous cliquer dessus en même temps, alors que toi ton script dit "si il y à un clique je m'active".

Edit: Je n'ai jamais utiliser OnMouseDown() mais d'après les conseils de la personne précédente:
Déjà il faut bien l'écrire une majuscule pas mise peut faire que ça ne marche pas.
Il faut que l'objet possède un collider (vérifie bien qu'il en possède un l'objet où il y à le script, il faut qu'il soit sur l'objet même du script le collider pas sur un enfant ni sur un autre).
Et vérifie aussi on sait jamais que le raycast du collider soit bien activer.

Edit2: Dans ton script que tu as donner la fonction de détection de clique est dans ton Update sans aucune vérification, c'est à dire que si tu fais un clique n'importe où, tout les scripts le possédant vont faire effectuer la fonction. On peut très bien faire ça mais c'est pas du tout une bonne façon puisqu'on à les events déjà créer pour ce genre de chose :)

botigeek
Messages : 3
Inscription : 31 Juil 2018 13:27

Re: [DB-AL] Probleme de collider box 2D

Message par botigeek » 02 Août 2018 17:07

Merci beaucoup ! Tout marche parfaitement comme je le voulais merci pour ta reponse complete. :-D

Mon code est devenu tout simple :

Code : Tout sélectionner

public class Test : MonoBehaviour {

    public Animator MonAnimation;    
// Use this for initialization

    void OnMouseDown()
    {
	MonAnimation.SetTrigger("CastleAppear");
    }

}

Répondre

Revenir vers « (C#) CSharp »