Вроде все написал как в книге, однако при старте игры карточкам-клонам присваивается ID=0, из за этого вне зависимости от картинки система считает их одинаковыми. Не могу выловить где косяк. Вот листинг:
SceneController:
Синтаксис:
Используется csharp
using System.Collections;
using UnityEngine;
public class SceneController : MonoBehaviour
{
[SerializeField] private MemoryCard originalCard;
[SerializeField] private Sprite[] images;
[SerializeField] private TextMesh scoreLabel;
public const int gridRows = 2;
public const int gridCols = 4;
public const float offsetX = 2f;
public const float offsetY = 2.5f;
private int _score = 0;
private void Start()
{
Vector3 startPos = originalCard.transform.position;
int[] numbers = { 0, 0, 1, 1, 2, 2, 3, 3 };
numbers = ShuffleArray(numbers);
for (int i = 0; i < gridCols; i++)
{
for (int j = 0; j < gridRows; j++)
{
MemoryCard card;
if (i == 0 && j == 0) { card = originalCard; }
else
{
card = Instantiate(originalCard) as MemoryCard;
}
int index = j*gridRows+i;
int id = numbers[index];
Debug.Log("Match? " + id);
originalCard.SetCard(id, images[id]);
Debug.Log("B " + id);
float posX = (offsetX * i) + startPos.x;
float posY = -(offsetY * j) + startPos.y;
card.transform.position = new Vector3(posX, posY, startPos.z);
}
}
}
private int[] ShuffleArray(int[] numbers)
{
int[] newArray = numbers.Clone() as int[];
for (int i = 0; i < newArray.Length; i++)
{
int tmp = newArray[i];
int r = Random.Range(i, newArray.Length);
newArray[i] = newArray[r];
newArray[r] = tmp;
}
return newArray;
}
private MemoryCard _firstRevealed;
private MemoryCard _secondRevealed;
public bool canReveal
{
get { return _secondRevealed == null; }
}
public void CardRevealed(MemoryCard card)
{
if (_firstRevealed == null)
{
_firstRevealed = card;
}
else
{
_secondRevealed = card;
Debug.Log("Match? " + _firstRevealed.id+" "+ _secondRevealed.id);
StartCoroutine(CheckMatch());
}
}
public IEnumerator CheckMatch()
{
if (_firstRevealed.id==_secondRevealed.id)
{
_score++;
scoreLabel.text = "Score: " + _score;
}
else
{
yield return new WaitForSeconds(.5f);
_firstRevealed.Unreveal();
_secondRevealed.Unreveal();
}
_firstRevealed = null;
_secondRevealed = null;
}
}
using UnityEngine;
public class SceneController : MonoBehaviour
{
[SerializeField] private MemoryCard originalCard;
[SerializeField] private Sprite[] images;
[SerializeField] private TextMesh scoreLabel;
public const int gridRows = 2;
public const int gridCols = 4;
public const float offsetX = 2f;
public const float offsetY = 2.5f;
private int _score = 0;
private void Start()
{
Vector3 startPos = originalCard.transform.position;
int[] numbers = { 0, 0, 1, 1, 2, 2, 3, 3 };
numbers = ShuffleArray(numbers);
for (int i = 0; i < gridCols; i++)
{
for (int j = 0; j < gridRows; j++)
{
MemoryCard card;
if (i == 0 && j == 0) { card = originalCard; }
else
{
card = Instantiate(originalCard) as MemoryCard;
}
int index = j*gridRows+i;
int id = numbers[index];
Debug.Log("Match? " + id);
originalCard.SetCard(id, images[id]);
Debug.Log("B " + id);
float posX = (offsetX * i) + startPos.x;
float posY = -(offsetY * j) + startPos.y;
card.transform.position = new Vector3(posX, posY, startPos.z);
}
}
}
private int[] ShuffleArray(int[] numbers)
{
int[] newArray = numbers.Clone() as int[];
for (int i = 0; i < newArray.Length; i++)
{
int tmp = newArray[i];
int r = Random.Range(i, newArray.Length);
newArray[i] = newArray[r];
newArray[r] = tmp;
}
return newArray;
}
private MemoryCard _firstRevealed;
private MemoryCard _secondRevealed;
public bool canReveal
{
get { return _secondRevealed == null; }
}
public void CardRevealed(MemoryCard card)
{
if (_firstRevealed == null)
{
_firstRevealed = card;
}
else
{
_secondRevealed = card;
Debug.Log("Match? " + _firstRevealed.id+" "+ _secondRevealed.id);
StartCoroutine(CheckMatch());
}
}
public IEnumerator CheckMatch()
{
if (_firstRevealed.id==_secondRevealed.id)
{
_score++;
scoreLabel.text = "Score: " + _score;
}
else
{
yield return new WaitForSeconds(.5f);
_firstRevealed.Unreveal();
_secondRevealed.Unreveal();
}
_firstRevealed = null;
_secondRevealed = null;
}
}
MemoryCard
Синтаксис:
Используется csharp
using System.Collections;
using UnityEngine;
public class MemoryCard:MonoBehaviour{
[SerializeField] private GameObject cardBack;
[SerializeField] private SceneController controller;
private int _id;
public int id {get {return _id;} }
public void SetCard (int id, Sprite image)
{
_id = id;
Debug.Log(_id);
GetComponent<SpriteRenderer>().sprite = image;
}
public void OnMouseDown()
{
if (cardBack.activeSelf && controller.canReveal)
{
cardBack.SetActive(false);
controller.CardRevealed(this);
}
}
public void Unreveal()
{
cardBack.SetActive(true);
}
}
using UnityEngine;
public class MemoryCard:MonoBehaviour{
[SerializeField] private GameObject cardBack;
[SerializeField] private SceneController controller;
private int _id;
public int id {get {return _id;} }
public void SetCard (int id, Sprite image)
{
_id = id;
Debug.Log(_id);
GetComponent<SpriteRenderer>().sprite = image;
}
public void OnMouseDown()
{
if (cardBack.activeSelf && controller.canReveal)
{
cardBack.SetActive(false);
controller.CardRevealed(this);
}
}
public void Unreveal()
{
cardBack.SetActive(true);
}
}