Урок посвящен динамическим изменениям в игре во время игрового процесса. Рассмотрим добавление новых условий, корректировку поведения камеры и изменение цвета заднего фона в зависимости от игровых событий.
Улучшение 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 (не реализован в примере).
В уроке реализовано динамическое изменение игры: плавное управление камерой в зависимости от количества и расположения кубиков, а также динамическое изменение цвета заднего фона. Эти улучшения делают игровой процесс более интересным и интерактивным. Дальнейшие работы могут включать в себя добавление большего количества цветов заднего фона и более сложной логики изменения камеры.