Девлог №1

Прошлый пост вот здесь.

За 3 недели продвинулся не сильно. Да и времени на игру было не особо много.

Камера

Во-первых, добавил управление камерой на ЛКМ, вместо WSAD (говорят, так удобнее). Вот как это было:

1) Сначала получаю координаты курсора (_lastMousePosition) в момент зажатия ЛКМ и объявляю, что начал перемещение камеры (_dragging.Status).

if (Input.GetMouseButtonDown(0)) { _dragging.Status = true; _lastMousePosition = Input.mousePosition; }

2) Затем получаю смещение курсора (mouseDelta) и перезаписываю его координаты. Потом обнуляю Y-координату, так как камера должна перемещаться только в плоскости XZ, и нормализую векторы, чтобы скорость была одинакова во всех направлениях перемещения. В конце записываются координаты, куда надо переместиться и компенсируется скорость при изменении масштаба, чтобы скорость не зависела от текущего масштаба.

if (_dragging.Status) { Vector3 mouseDelta = Input.mousePosition - _lastMousePosition; _lastMousePosition = Input.mousePosition; if (mouseDelta.sqrMagnitude > 0f) { Vector3 right = _camera.transform.right; right.y = 0f; right.Normalize(); Vector3 forward = _camera.transform.forward; forward.y = 0f; forward.Normalize(); var move = (-mouseDelta.x * right - mouseDelta.y * forward) * _dragSpeed * (_camera.fieldOfView / _multiply); _rb.MovePosition(_rb.position + move); } }

3) Когда камера оказалась в нужной точке, объявляю, что перемещение завершено путём отпускания ЛКМ.

if (Input.GetMouseButtonUp(0)) { _dragging.Status = false; }

Собственно результат

Индикация совпадения граней

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

Tile illumination - небольшие квадратные триггерные зоны. Большой зелёный параллелепипед - триггер, весящий на каждом Block.
Tile illumination - небольшие квадратные триггерные зоны. Большой зелёный параллелепипед - триггер, весящий на каждом Block.

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

Сначала снял только взаимодействие с блоками внутри родителя Tile (слой New Tile и, да, у триггеров объекта Tile illumination - слой Default), но это не помогло и объекты свечения появлялись либо в случайных местах, либо срабатывала не та индикация. Оказалось, что триггеры как-то задевают плитки-подсказки (слой Empty Tiles), поэтому, чтобы триггер точно взаимодействовал только с ранее установленными плитками, снял галочку и на пересечении со слоем Empty Tiles.

Настройка слоёв
Настройка слоёв

Скрипт выглядит довольно просто:

if (!_tileVisible.Status) { _illuminatedObject.SetActive(false); } _isCoincidence = other.CompareTag(obj.tag); if (_isCoincidence && _tileVisible.Status) { _illuminatedObject.SetActive(true); _illuminatedObject.GetComponent<Renderer>().material.color = _trueColor; } else if (!_isCoincidence && _tileVisible.Status) { _illuminatedObject.SetActive(true); _illuminatedObject.GetComponent<Renderer>().material.color = _falseColor; }

При срабатывании триггера проверяю, что плитку видно на экране (_tileVisible.Status), и если не видно, скрываю все объекты свечения. Далее, проверяю теги и в зависимости от результата выдаю нужное свечение. Когда триггер перестаёт с чем-либо взаимодействовать, просто отключаю объект свечения.

Для большей убедительности объекты Tile illumination удаляются также и с объекта-дубликата. После установки текущей плитки, чтобы подсветка случайно не сработала, скрипт подсветки отключается.

И вот что из этого вышло:

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

Спасибо, что дочитали до конца.

2