Цель на сегодня — попрактиковаться в использовании группы макетов сетки и событий для разработки пользовательского интерфейса для игры с плитками, позволяя пользователю использовать мышь, чтобы щелкнуть плитку и открыть изображение за ней.

Настройка сцены

У меня есть объект TileGame, содержащий холст и диспетчер игр для моей сцены. К объекту TileGame прикреплен скрипт для случайного создания плиток в сетке и префабах для разных плиток.

Префабы

У меня есть три разных префаба тайлов: сердце, бомба и освещение. У каждого префаба есть свой скрипт, полученный из скрипта базового тайла, кнопки, изображения и изображения обложки.

Тайл Скрипт (Варианты Тайлов)

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

Плитка базового класса

using UnityEngine;

public class Tile : MonoBehaviour
{
    public SelectTile GameManager { get; set; }
    
    public virtual int Score { get; }

    private void Start() {
        GameManager = FindObjectOfType<SelectTile>();
    }
}

Детская плитка бомбы

using UnityEngine;
using UnityEngine.UI;

public class BombTile : Tile
{
    private SelectTile _gameManager;
    [SerializeField] GameObject _coverImage;
    private Button _button;
   
    public override int Score => -1;

    private void Start() {
        _button = GetComponent<Button>();
        _gameManager = FindObjectOfType<SelectTile>();
        _button.onClick.AddListener(delegate { _gameManager.TileSelect(_coverImage); }); 
    }
}

Холст

Canvas имеет фоновое изображение, сетку и score_text. Важнейшим объектом для этой установки является объект сетки.

Объект сетки

Объект сетки содержит компонент группы компоновки сетки. Помещение изображений в эту группу макетов приведет к привязке изображений к настраиваемой сетке, которую можно настроить в инспекторе.

Создание плиток

Создание плиток осуществляется с помощью скрипта, прикрепленного к игровому объекту плитки. Этот скрипт берет список плиток и создает их экземпляры в объекте сетки. После создания экземпляров тайлов следующим шагом будет поиск менеджера игры. Он содержит событие выбора плитки и подписывается на метод, который обрабатывает поведение выбранной плитки, в данном случае обновляя счет.

public class TileSpawn : MonoBehaviour
{
    [SerializeField] private GameObject[] _tile;
    [SerializeField] private GameObject _grid;
    [SerializeField] private TMP_Text _scoreText;
    SelectTile _selectTile;
    private int _score;
    void Start()
    {
        for (int i = 0; i < 24; i++) {
            Instantiate(_tile[Random.Range(0, _tile.Length)], _grid.transform);
        }
           _selectTile = FindObjectOfType<SelectTile>();
        _selectTile.OnTileSelect += _selectTile_OnTileSelect;
    }

    private void _selectTile_OnTileSelect(object sender, SelectTile.TileSelectEventArgs e) {
        _score += e.tile.Score;
        _scoreText.text = "Score: " + _score.ToString();
    }
}

Менеджер игры

Обрабатывает событие выбора плитки. У меня есть аргументы события, выбранные плиткой, которые получают выбранную плитку, отключают изображение обложки и передают эту плитку всем подписчикам.

public class SelectTile : MonoBehaviour {
    
    public event EventHandler<TileSelectEventArgs> OnTileSelect;
    public class TileSelectEventArgs : EventArgs {
        public Tile tile { get; }
        public TileSelectEventArgs(Tile tile) {
            this.tile = tile;
        }

    }
    public void TileSelect(GameObject image) {
        Tile selectedTile = image.GetComponentInParent<Tile>();
        OnTileSelect?.Invoke(this,new TileSelectEventArgs(selectedTile));
        image.SetActive(false);
    }
}

В заключение, это все необходимые компоненты, которые я использовал для разработки этой базовой игры с плитками.