Создать массив из полученных значений и присвоить элементу значение нового массива Unity

150
18 ноября 2020, 20:50

Есть два типа объектов:

  • кнопка (не UI элемент, а спрайт с коллайдером, и компонентом AudioSourse);
  • карта (тоже спрайт с коллайдером).

Суть задачи: из набора карт (ну пусть будет штук 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, что бы лишний раз не смущать народ)

Не получается у меня именно присвоить кнопке значение одной из появившейся карты. Либо присваивается звук любой карты из всего массива карт, либо первой появившейся карты, либо последней карты.

Вопросы:

  1. правильно ли я думаю, что нужно создать новый массив, который будет хранить id сгенерированных карт и уже из него рандомно присваивать значение для id ButtonScript.
  2. как создать такой массив?
  3. как рандомно присвоить значение из этого массива? Нужно ли применять метод перемешивания как в скрипте выше или есть более простой способ?
READ ALSO
Как подключиться из C# к другому .NET процессу?

Как подключиться из C# к другому .NET процессу?

Как средствами C# подключиться к другому процессу и мониторить некоторые данные из него? Известно, что исследуемое приложение так же написано...

164
Умирает объект созданный при помощи EasyHook

Умирает объект созданный при помощи EasyHook

Я немного не до понимаю время жизни меж-доменных объектов, они же MarshalByRefObject, но вот я поставил хук на IDirect3DDevice9::EndScene, далее происходит какое-то...

207
Получить AssemblyVersion из Assembly

Получить AssemblyVersion из Assembly

Можно ли получить AssemblyVersion из Assembly без загрузки ее в процесс(Из файла)?

169
Как реализовать запрос c Row_Number в MySQL?

Как реализовать запрос c Row_Number в MySQL?

Как реализовать ROW_NUMBER() OVER ( PARTITION BY row1, row2 ORDER BY row3) с двумя поля в PARTITION BY, как пример:

132