У меня есть возможность как перемещать, так и поворачивать мою камеру. Вращение моего кода работает, вращая родительский объект моей камеры, и мой код движения также перемещает мой родительский объект.Unity Всегда перемещать объект вперед
Однако, когда я поворачиваю родительский объект, мой код движения идет не так. На данный момент, если я использую два пальца и прокручиваю вверх, я хочу, чтобы моя камера всегда двигалась вперед в зависимости от того, где она выглядит. Аналогично, когда я двигаюсь вниз, влево и вправо. Я бы хотел, чтобы моя камера двигалась назад, влево и вправо соответственно.
В настоящий момент, когда я впервые запускаю приложение, все работает нормально. Но тогда, когда я поворачиваю свой родительский объект на 90 градусов вправо, когда я сажусь, моя камера движется влево. Поскольку я не уверен, как компенсировать это вращение из моего прямого направления.
Это мои два метода:
void MoveCamera()
{
Vector2 delta = Input.GetTouch(0).deltaPosition;
// invert option is if I want to manually change the direction everything moves
// move fingers left to go right etc
float positonX = delta.x * sensitivityX * Time.deltaTime;
positonX = invertX ? positonX : positonX * -1;
float positionY = delta.y * sensitivityY * Time.deltaTime;
positionY = invertY ? positionY : positionY * -1;
transform.parent.position += new Vector3(positonX, 0, positionY);
}
Vector2 CameraOrbit()
{
Vector2 touchDeltaPosition = Input.GetTouch (0).deltaPosition;
//vertical movement is corresponded to rotation in x-axis
orbitSpeedX = -touchDeltaPosition.y * rotXSpeedModifier;
//horizontal movement is corresponded to rotation in y-axis
orbitSpeedY = touchDeltaPosition.x * rotYSpeedModifier;
//get the current rotation
float x = transform.parent.rotation.eulerAngles.x;
float y = transform.parent.rotation.eulerAngles.y;
//make sure x is between -180 to 180 so we can clamp it propery later
if (x > 180)
{
x -= 360;
}
//y = ClampAngle(y, yMinLimit, yMaxLimit);
//calculate the x and y rotation
Quaternion rotationY = Quaternion.Euler (0, y, 0) * Quaternion.Euler (0, orbitSpeedY, 0);
Quaternion rotationX = Quaternion.Euler (Mathf.Clamp (x + orbitSpeedX, minRotX, maxRotX), 0, 0);
//apply the rotation
transform.parent.rotation = rotationY * rotationX;
orbitSpeedX *= (1 - Time.deltaTime * 12);
orbitSpeedY *= (1 - Time.deltaTime * 3);
return touchDeltaPosition;
}
Прежде чем я имел этот код, я шевелить камеру с помощью transform.Translate
и это работало, и я не мог двигаться вперед независимо от того, мое вращение. Но положение камеры Y будет двигаться, когда мне нужно, чтобы оставаться на том, что когда-либо было, когда я начинаю двигаться. Это заставило бы его выглядеть так, будто он уменьшал масштаб, чем больше я продвигался вперед.
Что значит, что вы хотите двигаться вперед? как при ходьбе вперед/масштабирование? или скользить вверх пальцами? что ты имеешь ввиду? что такое 'invertX' /' invertY'? – maksymiuk
Я отредактирую свой вопрос, чтобы не оставлять слишком много комментариев. – N0xus