Проблема с позиционированием камеры, управляемой мышью, чтобы игрок оставался на виду (для просмотра от третьего лица) - PullRequest
0 голосов
/ 14 февраля 2020

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

Вот код сценария:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseLook : MonoBehaviour
{
    public float mouseSensitivity = 100f;
    public float minAngle = -45f;
    public float maxAngle = 45f;
    public float minPosition = 0f;
    public float maxPosition = 6f;
    public float camDefaultY = 3.198001f;
    public GameObject headObject;

    private float yaw = 0f;
    private float pitch = 0f;

    private Transform headAngle;
    // Start is called before the first frame update
    void Start()
    {
        headAngle = headObject.transform;
    }

    // Update is called once per frame
    void Update()
    {
        yaw += Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
        pitch -= Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;
        pitch = Mathf.Clamp(pitch, minAngle, maxAngle);

        transform.eulerAngles = new Vector3(0f, yaw, 0f);
        headObject.transform.eulerAngles = new Vector3(-pitch, headAngle.eulerAngles.y, headAngle.eulerAngles.z);
        Camera.main.transform.eulerAngles = new Vector3(pitch, yaw, 0f);
    }
}

Предпочтительный результат:

  • заставить объект игрока вращаться с камера по горизонтали (по оси x) при движении мыши ( решено )
  • заставляет голову игрока (дочерний объект) и камеру вращаться вертикально при движении мыши ( решено )
  • ограничить вертикальное вращение камеры, скажем, до 45 ° ( решено )
  • позиционировать камеру вертикально, чтобы объект игрока всегда находился в одном и том же месте ( возникла проблема с this )

Проблема, с которой я сталкиваюсь, заключается в том, что, хотя у меня работают первые 3 вещи, я не могу найти правильный способ расположить камеру вертикально таким образом, чтобы объект игрока всегда будет оставаться +/- в том же месте / вид. Как мне этого добиться?

Вот что я получил:

result

И вот чего я хочу достичь (обратите внимание, как игрок остается в то же место в камере): result Также я хотел бы знать, есть ли, возможно, более простой способ добиться всего этого управления мышью от третьего лица?

Заранее спасибо!

1 Ответ

0 голосов
/ 14 февраля 2020

Так что я наконец-то понял это с некоторой помощью. Чтобы сохранить анимацию для головы, вращайте ее движением мыши и следите, чтобы камера следовала не только за головой игрока, но и мышью с вертикальным ограничением. Я просто создал дополнительный пустой объект под объектом Player, чтобы использовать его в качестве цели камеры, и поместил камеру внутри него.

preview

С этого момента я добавил его в свой скрипт. Вот обновленный код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseLook : MonoBehaviour
{
    public float mouseSensitivity = 100f;
    public float minAngle = -45f;
    public float maxAngle = 45f;
    public float minPosition = 0f;
    public float maxPosition = 6f;
    public float camDefaultY = 3.198001f;
    public GameObject cameraTarget;
    public GameObject headTarget;

    private float yaw = 0f;
    private float pitch = 0f;

    private Transform targetAngle;
    // Start is called before the first frame update
    void Start()
    {
        targetAngle = cameraTarget.transform;
    }

    // Update is called once per frame
    void Update()
    {
        yaw += Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
        pitch -= Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;
        pitch = Mathf.Clamp(pitch, minAngle, maxAngle);

        transform.eulerAngles = new Vector3(0f, yaw, 0f);
        cameraTarget.transform.eulerAngles = new Vector3(-pitch, targetAngle.eulerAngles.y, targetAngle.eulerAngles.z);
    }

    void LateUpdate()
    {
        headTarget.transform.eulerAngles = new Vector3(-pitch, targetAngle.eulerAngles.y, targetAngle.eulerAngles.z);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...