Как мне узнать, на каком GameObject я щелкнул в Unity? - PullRequest
1 голос
/ 07 мая 2020

Я хочу создать простую игру на память, используя C# на Unity. Это 2D-игра. Я пытаюсь создать игру, в которой игрок P C щелкает по карте, а затем игре необходимо вызвать функцию памяти (карта GameObject), но я не знаю, как это сделать, и я не вижу найти его в инте rnet. Как я могу это сделать? Мой код:

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);
    }
}

Ответы [ 4 ]

0 голосов
/ 09 мая 2020

Я бы использовал raycast, чтобы узнать, в какой объект вы попали. вы можете сохранить его в литом Ray ray = new 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 голосов
/ 07 мая 2020

Возможное решение - назначить 2D-коллайдер вашей карте и прикрепить к нему скрипт с функцией OnMouseDown ().

Например (хотя еще не тестировал):

public class Card : MonoBehaviour {

public Card(){
        // Constructor, modify it depending on what you need
    }

void OnMouseDown()
    {
        // Find the game object with the "memoria" script as you please. In this example 
        // you find it by name but there are many ways to do this
        GameObject myMemory =  GameObject.Find("Name of the gameobject with the memoria script");
        myMemory.GetComponent<memoria>().memory(gameObject); //Call the memory method and pass the clicked gameObject
    }
}
0 голосов
/ 07 мая 2020

У вас есть два варианта:

1) Physics2D.Raycast , это может отлично работать для вашей игры, так как у вас есть единственный скрипт, который должен обнаруживать все карты.

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);
     }

2) OnMouseDown , вы можете прикрепить скрипт ко всем своим картам с помощью метода OnMouseDown в них.

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

Оба варианта дадут вам имя объекта , особой разницы, особенно для небольшой игры. Основное отличие в том, что Physics2D.Raycast работает только для 2D-коллайдеров. С другой стороны, OnMouseDown является общим c.

Обратите внимание, что для обоих решений на ваших игровых объектах должны быть 2D-коллайдеры.

0 голосов
/ 07 мая 2020

Вы можете использовать RaycastHit для перехвата GameObject, например: (Таким образом, вы должны поместить коллайдер в GameObject) Вы нажали игровой объект

Чтобы адаптировать сценарий к 2D:

    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
        }
    }
...