Unity3D: камера не может двигаться со скриптом от первого лица - PullRequest
2 голосов
/ 08 апреля 2019

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

Проблема в том, что пользователь не может перемещать камеру по оси «Мышь 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);
}

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

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, но вид сверху не использует те же элементы управления, что и от первого лица, но я не могу понять, почему один работает, а другой - нет.

Управление режимом просмотра сверху (работает с орбитой)

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);
    }
}

1 Ответ

0 голосов
/ 08 апреля 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...