Unity3D: камера не может двигаться со скриптом от первого лица

2

Объект относится к типу спутника, поэтому у меня есть скрипт для перемещения объекта по орбите, используя его положение. И у меня также есть скрипт для перемещения объекта спутника в режиме от первого лица.

Проблема в том, что пользователь не может перемещать камеру по оси "Мышь X" и "Мышь Y" для режима от первого лица. Проблема возникает из-за того, что сценарий орбиты и сценарий от первого лица управляют камерой, поэтому она не может двигаться. В игре, когда вы перемещаете мышь, вы видите рывок камеры, и когда я отключаю скрипт орбиты, работает первый человек.

Как я могу решить эту проблему?

Решением может быть использование только положения для орбиты и вращения для контроля от первого лица. Режим от первого лица не будет контролировать положение объектов только вращением. Орбита не будет контролировать только вращение объектов.

Спасибо!

Скрипт Орбиты

private void FixedUpdate()
{
    transform.RotateAround(centerOfOrbit.position, orbitAxis, orbitSpeed * Time.deltaTime);
    desiredOrbitPosition = (transform.position - centerOfOrbit.position).normalized * orbitRadius + centerOfOrbit.position;
    transform.position = Vector3.MoveTowards(transform.position, desiredOrbitPosition, Time.deltaTime * orbitAdjustSpeed);
}

Управление режимом от первого лица (не работает с Orbit)

private void Update()
{
    if(allowFirstPerson)
    {
        x+= Input.GetAxis ("Mouse X") * turnSpeed;
        if (allowTiltingForward)
        {
            y -= Input.GetAxis("Mouse Y") * turnSpeed;
        }

        y = ClampAngle(y, minVerticalAngle, maxVerticalAngle);
        if (minHorizontalAngle != 0 || maxHorizontalAngle != 0)
        {
            x = ClampAngle(x, minHorizontalAngle, maxHorizontalAngle);
        }
        Quaternion rotation = Quaternion.Euler(y, x, 0);
        Vector3 direction = (rotation * Vector3.forward * 100);
        aimPoint = new Vector3(direction.x + aimError, direction.y + aimError, direction.z + aimError);
        aimDir = (aimPoint - playerCamera.transform.position).normalized;
    }
}

Этот элемент управления режима Top View работает со сценарием Orbit, но вид сверху не использует те же элементы управления, что и от первого лица, но я не могу понять, почему один работает, а другой - нет.

Управление режимом Top View (работает с Orbit)

private void Update()
{
    if(allowTopView)
    {
        Ray ray = playerCamera.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        topDownAimPoint = new Vector3(0,0,0);
        if(Physics.Raycast(ray, out hit))
        {
           topDownAimPoint = hit.point;
        }
        aimPoint = new Vector3(topDownAimPoint.x + aimError, topDownAimPoint.y + aimError, topDownAimPoint.z + aimError);
    }
}
Теги:
unity3d

1 ответ

0

Насколько я понимаю, ваша проблема вызвана двумя сценариями, которые пытаются установить вращение для одного и того же объекта: камеры. В этом случае вы можете создать пустой объект Satellite и сделать камеру дочерней по отношению к этому объекту в иерархии. Прикрепление сценария орбиты к объекту " Satellite и сценария от первого лица к камере позволит камере перемещаться по орбите спутника, но при этом будет иметь свое собственное независимое вращение.

РЕДАКТИРОВАТЬ:

Чтобы приспособить 3d-модель в этой ситуации, создайте пустой родительский объект с именем SatteliteWrapper (или что-то похожее) и присоедините сценарий орбиты к этому объекту. Затем сделайте камеру дочерним элементом SatteliteWrapper и сделайте 3d-модель дочерним элементом камеры. Это позволяет модели вращаться вместе с камерой.

  • 0
    Да, но мне все еще нужно, чтобы передние объекты были направлены прямо в камеру
  • 0
    Вы имеете в виду, что у вас есть 3d модель для спутника? В этом случае вы создадите пустой родительский объект с именем SatteliteWrapper или что-то похожее и присоедините скрипт Orbit к этому объекту. Затем вы сделаете камеру дочерним элементом SatteliteWrapper и сделаете 3d-модель дочерним элементом камеры. Описывает ли это вашу ситуацию? Если так, я обновлю свой ответ.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню