我想在 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/