Есть два типа объектов:
Суть задачи: из набора карт (ну пусть будет штук 8) на экране появляется три рандомных. При нажатии кнопки должен воспроизвестись звук соответствующий одной из появившихся карт. Скрипт карты:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MemoryCard : MonoBehaviour {
[SerializeField] private SceneController controller;
private int _id;
public int id
{
get { return _id; } //Добавление функции чтения
}
public void SetCard(int id, Sprite image) // Открытый метод, которым могут пользоваться другие сценарии для передачи указанному объекту новых спрайтов.
{
_id = id;
GetComponent<SpriteRenderer>().sprite = image;
}
private void OnMouseDown()
{
Debug.Log("id карточки" + _id);
}
}
Скрипт кнопки:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ButtonScript : MonoBehaviour
{
[SerializeField] private SceneController controller;
private int _id;
public int id
{
get { return _id; } //Добавление функции чтения
}
private AudioSource Voice;
public void SetButton(int idV, AudioClip Clip) // Открытый метод, которым могут пользоваться другие сценарии для передачи указанному объекту новых спрайтов.
{
_id = id;
GetComponent<AudioSource>().clip = Clip;
}
private void OnMouseDown()
{
Voice = GetComponent<AudioSource>();
Voice.Play();
Debug.Log("id кнопки" + _id);
}
}
Скрипт Контроллера сцены:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SceneController : MonoBehaviour {
[SerializeField] private MemoryCard originalCard;
[SerializeField] private ButtonScript originalButton;
[SerializeField] private Sprite[] images;
[SerializeField] private AudioClip[] Clips;
public const int gridRows = 1; // количество рядов
public const int gridCols = 3; // количество карт в ряду
public const float offsetX = 4f; // расстояние между картами
public const float offsetY = 4f;
// Use this for initialization
void Start()
{
Vector3 startPos = originalCard.transform.position; // положение первой карты
int[] numbers = { 0, 1, 2, 3, 4, 5, 6, 7 }; // массив для индетификаторов спрайтов, НАДО ПЕРЕДЕЛАТЬ В ЦИКЛ
numbers = ShuffleArray(numbers); // вызов функции перемешивания
// numbersVoices = ShuffleArrayVoices(numbersVoices);
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 * gridCols + i;
int id = numbers[index]; // Получаем идентификаторы из перемешанного списка, а не из случайных чисел.
card.SetCard(id, images[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;
}
}
(из SceneController здесь удалил всё что было связано с ButonScript, что бы лишний раз не смущать народ)
Не получается у меня именно присвоить кнопке значение одной из появившейся карты. Либо присваивается звук любой карты из всего массива карт, либо первой появившейся карты, либо последней карты.
Вопросы:
ButtonScript.Сборка персонального компьютера от Artline: умный выбор для современных пользователей