Как я могу сделать такое движение 3D-камеры в Unity? - PullRequest
1 голос
/ 24 февраля 2020

Это школьный проект. У меня есть большой куб, который похож на PL anet. У меня есть маленький кубик, который может двигаться с любой стороны куба pl anet. Игрок автоматически перемещается вперед по своей локальной оси z, и я поворачиваю его на 90 или -90 градусов для перемещения влево или вправо, но игрок может управлять им, как будто это движение вверх-вниз-влево-вправо (сделал сценарий, чтобы они не нужно вращать куб с помощью 2 клавиш). Это похоже на игру Tron, поэтому, если я нажимаю клавишу «вверх», я не могу нажать сразу, потому что я оставляю след, поэтому мне приходится нажимать левую или правую клавиши. У меня проблема с движением камеры. Камера следует за маленьким кубиком сверху, но я хочу, чтобы он немного наклонился, когда маленький игрок с кубиками приближается к краю стороны, поэтому он позволяет мне видеть другую сторону - там, где я планирую go.

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

Vector3 direction = (target.position - center.position).normalized;         
transform.position = target.position + direction * distance;

Тогда я Направьте вектор вперед моей камеры в направлении куба игрока. Я попробовал два кода, но ни один из них не работал идеально. Сначала я попытался повернуть камеру с помощью:

transform.rotation = Quaternion.LookRotation(-direction); 

Показано в видео . Проблема заключается в том, что, поскольку я не сообщаю программе векторы «вверх» и «вправо» (я думаю), она устанавливает для себя случайные числа, поэтому камера иногда делает свое дело, как пируэт.

Далее я попробовал это:

Quaternion rot = Quaternion.FromToRotation(transform.forward, -direction);                                                                          
transform.Rotate(rot.eulerAngles, Space.World); 

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

У вас есть какие-нибудь идеи, как я могу заставить его работать? Я надеюсь, вы понимаете, чего я хотел бы достичь. Я пытаюсь настроить камеру так, чтобы она всегда показывала, что, когда я нажимаю Вверх, мой куб движется вверх, когда я нажимаю Вправо, мой куб всегда движется вправо и т. Д. c. и когда я достигаю края моей стороны, камера немного наклоняется к той стороне, к которой я двигаюсь.

1 Ответ

2 голосов
/ 24 февраля 2020

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

Vector3 closestToUp;
float greatestDot = 0f;
foreach (Vector3 dir in new Vector3[]{
        target.forward, target.right, -target.forward, -target.right})
{
    float curDot = Vector3.Dot(dir,transform.up);
    if (curDot > greatestDot) 
    {
        greatestDot = curDot;
        closestToUp = dir;
    }
}

Затем используйте это направление в качестве второго параметра Quaternion.LookRotation. Это сохранит его локальное направление вверх, выровненное с «вершиной» куба, насколько это возможно при любом новом направлении вперед:

...