c# - 我如何知道我在 Unity 上单击了哪个 GameObject?

标签 c# unity-game-engine 2d gameobject

我想在 Unity 上使用 C# 制作一个简单的内存游戏。这是一款 2D 游戏。我正在尝试制作一款游戏,其中PC玩家点击一张卡,然后游戏需要调用函数内存(GameObject卡),但我不知道该怎么做,也找不到它互联网上。我怎么做?我的代码是:

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

最佳答案

您有两个选择:

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 是通用的。

请注意,对于这两种解决方案,您的游戏对象上都必须有 2D 碰撞器。

关于c# - 我如何知道我在 Unity 上单击了哪个 GameObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61658245/

相关文章:

c# - 无法从 C# 中的另一个项目引用项目

c# - 同时更改两个列表

c# - 以编程方式从 GridLayoutGroup 获取计数的列和行

c# - 尝试在 Unity 中使用 Xamarin.iOS 制作的库

linux - 是否可以将 Kinect 连接到 Unity3D 并编译使其在 Jetson TK1 上运行?

java 插件在 Android Studio 项目中工作,但在 Unity 中不起作用

javascript 跳跃字符不起作用

c - C中矩形数组的二维旋转

c++ - 嵌套 for 循环 - 一维索引

c# - Fortran Dll导入