Вращение персонажа в зависимости от камеры - PullRequest
0 голосов
/ 24 декабря 2018

Я провел весь день, пытаясь выяснить проблему, с которой я столкнулся в школьном проекте, поэтому я прибегаю к последнему средству: stackoverflow!

Моя проблема: Я пытаюсь повернуть символ относительно камеры, вокруг которой можно вращать символ.

ввод: контроллер xbox

соответствующая информация:

  • Камера вращается вокруг персонажа по горизонтали с помощью правого джойстика
  • Движение персонажа происходит с помощью левого джойстика
  • Персонаж уже перемещается относительноКамера работает как положено. Я пытаюсь повернуть символ , что происходит отдельным способом.
  • Когда левый джойстик перемещается вниз, персонаж всегда должен быть направлен (и двигаться в направлении) к камере.
  • Когда левый джойстик потянется вверх, персонаж всегда должен быть обращен к камере (и удаляться от нее).
  • Я оставляю много кода внеПросто чтобы это было читабельно для вас, ребятаЕсли вам что-то нужно, просто спросите, и я предоставлю.

    inspector: Что у меня есть: https://imgur.com/TERUXV6

Почему это не так: Идеальное вращение персонажа.Тем не менее, я обманываю здесь.Камера вращается в соответствии с мировыми координатами.Как только я поворачиваю камеру, это становится очевидным.

Следующий скрипт прикрепляется к игровому объекту персонажа.

public class CharacterBehaviour : MonoBehaviour
{
    public GameObject HumanoidModel;
    [SerializeField]private Transform _mainCameraTransform;

    private void Update()
    {
        ApplyMovement();
        RotateCharacter();
    }

    private void ApplyMovement()
    {
        //get input movement vector
        Vector3 inputMovement = new Vector3(_inputMoveCharacterXAxis, 0, _inputMoveCharacterZAxis);

        //make sure camera forward is player movement forward
        Vector3 mainCameraForwardXz = Vector3.Scale(_mainCameraTransform.forward, new Vector3(1, 0, 1)); //multiplied by (1, 0, 1) to remove Y component
        Vector3 mainCameraRightXz = Vector3.Scale(_mainCameraTransform.right, new Vector3(1, 0, 1)); //multiplied by (1, 0, 1) to remove Y component

        Vector3 movementInCameraForwardDirection = mainCameraForwardXz * inputMovement.z;
        Vector3 movementInCameraRightDirection = mainCameraRightXz * inputMovement.x;

        Vector3 movementForward = movementInCameraForwardDirection + movementInCameraRightDirection;

        _velocity = movementForward * MaximumSpeed;
    }

    private void RotateCharacter()
    {
        Vector3 inputDirection = new Vector3(_inputMoveCharacterXAxis, 0, _inputMoveCharacterZAxis);
        HumanoidModel.transform.LookAt(HumanoidModel.transform.position + 
        HumanoidModel.transform.forward + inputDirection);
    }

Следующий скрипт прикрепляется к основному игровому объекту GameObject

public class CameraBehaviour : MonoBehaviour
{
    [SerializeField] private Transform _characterTransform;
    [SerializeField] private Transform _mainCameraTransform;

    private void Update ()
    {
        RotateCamera();
    }

    // Rotate camera horizontally
    private void RotateCamera()
    {
        _mainCameraTransform.RotateAround(_characterTransform.position, Vector3.up, _inputRotateCameraHorizontal);
    }
}

Источник проблемы - функция RotateCharacter ().Я знаю, что мне нужно провести некоторые вычисления, чтобы сделать вращение персонажа относительно вращения камеры, я просто не могу понять, что это за вычисление и почему.

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

Триндил

1 Ответ

0 голосов
/ 24 декабря 2018

так вот, что вам нужно ...

camDefault, Vector3 для начальной позиции камеры за символом.camCur, Vector3 для текущей позиции камеры (чтобы отследить, где она находится в orbit вокруг символа)

, вам нужно установить camDefault в Awake () на его текущую позицию в то время, IE camDefault = cam.transform.position);

затем в фиксированном обновлении

camCur= cam.transform.position;

затем

 if(Input//your horizontal axis here//==0){
if(camCur!=camDefault){
//translate camera to cam default
cam.tranform.translate(camDefault);

cam.lookat(player.transform.forward);

}
}

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

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

в этом случае вы можете сохранитьначальное вращение и текущее вращение, как указано выше, и заставьте вашу палку смотреть влево и вправо, а затем вернитесь назад и вперед, когда вы отпустите палку.

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