1
votes

Comment savoir sur quel GameObject j'ai cliqué sur Unity?

Je veux créer un jeu de mémoire simple en utilisant C # sur Unity. C'est un jeu 2D. J'essaie de créer un jeu dans lequel le joueur PC clique sur une carte, puis le jeu doit appeler la mémoire de fonction (carte GameObject), mais je ne sais pas comment faire et je ne vois pas pour le trouver sur Internet. Comment je fais ça? Mon code est:

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

public class MemoryGame : MonoBehaviour
{

    private int counterOverturnedCards;
    private GameObject[] overturnedCards = new GameObject[2];
    public Sprite back, krunk, nash, smallNorm, bigNorm, geary, emperorVeloXXVII, realVelo, nTrance, nitrosOxide, zam, zem, mixvelo;

    // Start is called before the first frame update
    void Start()
    {
        gameObject.GetComponent<SpriteRenderer>().sprite = back;
        counterOverturnedCards = 0;
    }

    // Update is called once per frame
    void Update()
    {

    }

    void OnMouseDown()
    {
        if (gameObject.GetComponent<SpriteRenderer>().sprite == back && (counterOverturnedCards == 0 || counterOverturnedCards == 1))
        {
            if (gameObject == GameObject.Find("Cards/card10") || gameObject == GameObject.Find("Cards/card20"))
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = krunk;
                overturnedCards[counterOverturnedCards] = gameObject;
                counterOverturnedCards++;
            }
            else if (gameObject == GameObject.Find("Cards/card03") || gameObject == GameObject.Find("Cards/card21"))
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = nash;
                overturnedCards[counterOverturnedCards] = gameObject;
                counterOverturnedCards++;
            }
            else if (gameObject == GameObject.Find("Cards/card05") || gameObject == GameObject.Find("Cards/card13"))
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = geary;
                overturnedCards[counterOverturnedCards] = gameObject;
                counterOverturnedCards++;
            }
            else if (gameObject == GameObject.Find("Cards/card04") || gameObject == GameObject.Find("Cards/card24"))
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = mixvelo;
                overturnedCards[counterOverturnedCards] = gameObject;
                counterOverturnedCards++;
            }
            else if (gameObject == GameObject.Find("Cards/card06") || gameObject == GameObject.Find("Cards/card18"))
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = smallNorm;
                overturnedCards[counterOverturnedCards] = gameObject;
                counterOverturnedCards++;
            }
            else if (gameObject == GameObject.Find("Cards/card12") || gameObject == GameObject.Find("Cards/card22"))
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = bigNorm;
                overturnedCards[counterOverturnedCards] = gameObject;
                counterOverturnedCards++;
            }
            else if (gameObject == GameObject.Find("Cards/card01") || gameObject == GameObject.Find("Cards/card14"))
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = emperorVeloXXVII;
                overturnedCards[counterOverturnedCards] = gameObject;
                counterOverturnedCards++;
            }
            else if (gameObject == GameObject.Find("Cards/card08") || gameObject == GameObject.Find("Cards/card17"))
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = realVelo;
                overturnedCards[counterOverturnedCards] = gameObject;
                counterOverturnedCards++;
            }
            else if (gameObject == GameObject.Find("Cards/card07") || gameObject == GameObject.Find("Cards/card19"))
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = nTrance;
                overturnedCards[counterOverturnedCards] = gameObject;
                counterOverturnedCards++;
            }
            else if (gameObject == GameObject.Find("Cards/card09") || gameObject == GameObject.Find("Cards/card15"))
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = zam;
                overturnedCards[counterOverturnedCards] = gameObject;
                counterOverturnedCards++;
            }
            else if (gameObject == GameObject.Find("Cards/card11") || gameObject == GameObject.Find("Cards/card16"))
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = zem;
                overturnedCards[counterOverturnedCards] = gameObject;
                counterOverturnedCards++;
            }
            else if (gameObject == GameObject.Find("Cards/card02") || gameObject == GameObject.Find("Cards/card23"))
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = nitrosOxide;
                overturnedCards[counterOverturnedCards] = gameObject;
                counterOverturnedCards++;
            }
        }
        if (counterOverturnedCards == 2)
        {
            if (overturnedCards[0].GetComponent<SpriteRenderer>().sprite != overturnedCards[1].GetComponent<SpriteRenderer>().sprite)
            {
                StartCoroutine(waitTwoSeconds());
                overturnedCards[0].GetComponent<SpriteRenderer>().sprite = back;
                overturnedCards[1].GetComponent<SpriteRenderer>().sprite = back;
            }
            counterOverturnedCards = 0;
        }
    }

    IEnumerator waitTwoSeconds()
    {
        yield return new WaitForSeconds(2);
    }
}


0 commentaires

4 Réponses :


0
votes

Vous pouvez utiliser RaycastHit pour piéger GameObject par exemple: (Vous devez donc mettre un collisionneur sur GameObject)

Dans Game 3D:

    if (Input.GetMouseButtonDown(0)) {
        Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector2 mousePos2D = new Vector2(mousePos.x, mousePos.y);

        RaycastHit2D rayHit = Physics2D.Raycast(mousePos2D, Vector2.zero);
        if (rayHit.collider != null) {
            var gameobjClicked = rayHit.collider.gameObject
        }
    }

rayHit.collider .gameObject vous donne le gameobject cliqué

Pour adapter le script en 2D:

     if (Input.GetMouseButtonDown(0))
     {
         Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
         RaycastHit rayHit;
         if (Physics.Raycast(ray, out rayHit, 100.0f)){
             if(rayHit.collider.tag == "Something") //I test tag, but you could what you want..
             {
                 var GameObjClicked  = rayHit.collider.gameObject;
             }
         }
     }


0 commentaires

0
votes

Une solution possible serait d'assigner un collisionneur 2D à votre carte et d'y attacher un script, avec une fonction OnMouseDown ().

Par exemple (je ne l'ai toujours pas testé):

< pré> XXX


1 commentaires

La méthode OnMouseDown doit être dans votre objet "cliquable"



1
votes

Vous avez deux options:

1) Physics2D.Raycast , cela peut parfaitement fonctionner pour votre jeu puisque vous avez un seul script qui devrait détecter toutes les cartes.

  void OnMouseDown(){
     Debug.Log (this.gameObject.name);
  } 

2) OnMouseDown , vous pouvez attacher un script à toutes vos cartes avec la méthode OnMouseDown.

void Update () {
         if (Input.GetMouseButtonDown(0)) {
             CastRay();
         }       
     }

     void CastRay() {
         Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
         RaycastHit2D hit = Physics2D.Raycast (ray.origin, ray.direction, Mathf.Infinity);
         if (hit.collider !=null) {
             Debug.Log (hit.collider.gameObject.name);
     }


1 commentaires

@EduardodeQuadros, comme je l’ai dit dans ma réponse, si votre code est attaché à chaque objet de carte, alors ‘OnMouseDown’ devrait fonctionner. Cependant, s'il est simplement connecté à la caméra principale, utilisez Raycast. Dans tous les cas, assurez-vous simplement d'avoir des collisionneurs 2D sur chaque sprite de carte.



0
votes

J'utiliserais un raycast pour obtenir quel objet vous frappez. vous pouvez le stocker dans le casting Ray ray = nouveau Ray (transform.position + offset, dir);

    Debug.DrawRay(transform.position + offset, dir * sightDis, Color.green);
            if (Physics.Raycast(ray, out RaycastHit hit,sightDis * sightDis))
            {
              //  print(hit);

                if (hit.transform == attackTarget) return true;
                //clear line of vision


                // if distances < thershold && raycast from player to boss hits..
                // transtion to prsue

            }


0 commentaires