Цель на сегодня — попрактиковаться в использовании группы макетов сетки и событий для разработки пользовательского интерфейса для игры с плитками, позволяя пользователю использовать мышь, чтобы щелкнуть плитку и открыть изображение за ней.
Настройка сцены
У меня есть объект 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); } }
В заключение, это все необходимые компоненты, которые я использовал для разработки этой базовой игры с плитками.