Unity: Динамика в игре — Урок 6. Изменяем цвета и камеру

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

Улучшение Game Controller: Добавление условий

В функцию Update контроллера игры (Game Controller) добавим условие, предотвращающее срабатывание кода при отсутствии объекта allClips или при взаимодействии игрока с пользовательским интерфейсом. Это улучшит стабильность игры и предотвратит ошибки в консоли. Код будет выполняться только при существовании allClips и отсутствии взаимодействия с UI.

if (allClips != null && !isUiClicked) {
    // ...существующий код...
}

Динамическое управление камерой

При построении высоких башен кубики могут выходить за пределы видимости камеры. Для решения проблемы необходимо динамически изменять положение камеры в зависимости от количества и расположения кубиков. Камера должна перемещаться по осям X, Y и Z, обеспечивая видимость всех установленных блоков.

Определение максимальных координат и перемещение камеры

Функция MoveCameraAndChangeBG определяет максимальные координаты X, Y и Z среди всех установленных кубиков (allClips.position). Значения координат преобразуются в целые числа (ToInt32) и берутся по модулю (Mathf.Abs), чтобы учитывать как положительные, так и отрицательные координаты. Камера плавно перемещается по оси Y с помощью MoveTowards, а по осям X и Z — отдаляется при достижении определенного количества кубиков в ряд.

void MoveCameraAndChangeBG() {
    int maxX = 0;
    int maxY = 0;
    int maxZ = 0;

    foreach (Vector3 pos in allClips.position) {
        if (Mathf.Abs(Convert.ToInt32(pos.x)) > maxX) {
            maxX = Mathf.Abs(Convert.ToInt32(pos.x));
        }
        if (Convert.ToInt32(pos.y) > maxY) {
            maxY = Convert.ToInt32(pos.y);
        }
        if (Mathf.Abs(Convert.ToInt32(pos.z)) > maxZ) {
            maxZ = Mathf.Abs(Convert.ToInt32(pos.z));
        }
    }

    camMoveYPos = 5.9f + maxY - 1; // 5.9f - начальная позиция, -1 - компенсация
    int maxHorizontal = Mathf.Max(maxX, maxZ);
    if (maxHorizontal % 3 == 0 && lastMaxHorizontal != maxHorizontal) {
        mainCam.transform.localPosition += new Vector3(0, 0, -2f);
        lastMaxHorizontal = maxHorizontal;
    }
}

public float camMoveYPos = 0;
public float camMoveSpeed = 2f;
int lastMaxHorizontal = 0;

void Update() {
    mainCam.transform.localPosition = Vector3.MoveTowards(mainCam.transform.localPosition, 
                                                        new Vector3(mainCam.transform.localPosition.x, camMoveYPos, mainCam.transform.localPosition.z), 
                                                        camMoveSpeed * Time.deltaTime);
    // ... остальной код ...
}

Динамическое изменение цвета заднего фона

Цвет заднего фона меняется в зависимости от высоты башни кубиков. Используется массив цветов bgColors, а новый цвет устанавливается с помощью Color.Lerp для плавного перехода.

public Color[] bgColors = new Color[3]; //массив цветов
Color targetCameraColor;

void MoveCameraAndChangeBG() {
    // ... определение maxX, maxY, maxZ ...

    if (maxY >= 2) {
        targetCameraColor = bgColors[0];
    } else if (maxY >= 5) {
        targetCameraColor = bgColors[1];
    } else if (maxY >= 7) {
        targetCameraColor = bgColors[2];
    } else {
        targetCameraColor = bgColors[0]; // Добавлено для избежания ошибок при maxY < 2
    }

    mainCam.backgroundColor = Color.Lerp(mainCam.backgroundColor, targetCameraColor, Time.deltaTime / 1.5f);
}

Обработка крайних случаев

Добавлены проверки на случай, если существует только один вариант размещения кубика или если вариантов вообще нет (проигрыш игрока). В первом случае выбирается единственный доступный вариант, во втором – устанавливается флаг gameOver (не реализован в примере).

В уроке реализовано динамическое изменение игры: плавное управление камерой в зависимости от количества и расположения кубиков, а также динамическое изменение цвета заднего фона. Эти улучшения делают игровой процесс более интересным и интерактивным. Дальнейшие работы могут включать в себя добавление большего количества цветов заднего фона и более сложной логики изменения камеры.

Что будем искать? Например,программа