Дергается персонаж при движении камеры

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Дергается персонаж при движении камеры

Сообщение Golgitab 12 янв 2018, 00:55

Добрый день!
Подскажите, пожалуйста, как решить проблему дергания камеры.
Ситуация такая: Есть Player, который двигается через MovePosition(). Есть поворот персонаж через мышку, при зажатой правой клавиши. Так вот, проблема в том, что когда идешь вперед и при этом начинаешь поворачивать мышь, то начинается непонятное дергание и замедление персонажа.

Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{

    // Настройки персонажа
    [Header("Настройки персонажа")]
    public float playerSpeed;
    private int runSpeed; //Множитель к скорости передвижения

    // Настройки мыши
    [Header("Настройки мыши")]
    public float mouseSpeed;        // Скорость вращения мыш
    public float mouseTopLimit;     // Верхний предел
    public float mouseBottomLimit;  // Нижний предел

    // Переменныйе для хранения состояний ввода
    private float horizontal;
    private float vertical;
    private float mouseX;
    private float mouseY;
    private Vector3 direction;

    // Объекты
    private Camera cam;
    private GameObject player;
    private Rigidbody rb;
    public GameObject avatar;

    // Use this for initialization
    void Start()
    {

        // Присвоение объектов переменным
        cam = FindObjectOfType<Camera>();
        player = transform.gameObject;
        rb = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {

        // Перед всеми действиями прочитаем ввод


        mouseX = Input.GetAxis("Mouse X");
        mouseY = Input.GetAxis("Mouse Y");
        // Наклон камеры
        if (Input.GetMouseButton(1))
        {

            cam.transform.RotateAround(player.transform.position, transform.right, -mouseY * mouseSpeed);
            player.transform.Rotate(Vector3.up, mouseX * mouseSpeed);
            rb.transform.Rotate(Vector3.up, mouseX * mouseSpeed);

            //direction = mouseX * mouseSpeed * move;            
        }
    }


    private void FixedUpdate()
    {

        // Двигаем персонажа
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");
        //Vector3 move = Vector3.forward;

        if (vertical != 0 || horizontal != 0)
        {
            runSpeed = 1;
            if (Input.GetKey(KeyCode.LeftShift))
            {
                if (vertical > 0 && horizontal == 0)
                {
                    runSpeed = 2;
                }
                else
                {
                    runSpeed = 1;
                }
            }

                rb.MovePosition(rb.transform.position + transform.forward * playerSpeed * Time.deltaTime * runSpeed * vertical + transform.right * playerSpeed * Time.deltaTime * horizontal);
           



        }
Golgitab
UNец
 
Сообщения: 12
Зарегистрирован: 12 янв 2018, 00:51

Re: Дергается персонаж при движении камеры

Сообщение Anonymyx 12 янв 2018, 01:21

1. Вращать RigidBody через MoveRotation() или AddTorque()
2. Двигать камеру в LateUpdate()
3. Ввод проверять в Update()
4. Включить интерполяцию в настройках RigidBody.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1751
Зарегистрирован: 05 апр 2015, 15:55

Re: Дергается персонаж при движении камеры

Сообщение Golgitab 12 янв 2018, 02:16

Anonymyx писал(а):1. Вращать RigidBody через MoveRotation() или AddTorque()
2. Двигать камеру в LateUpdate()
3. Ввод проверять в Update()
4. Включить интерполяцию в настройках RigidBody.


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

Обновленный код:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{

    // Настройки персонажа
    [Header("Настройки персонажа")]
    public float playerSpeed;
    private int runSpeed; //Множитель к скорости передвижения

    // Настройки мыши
    [Header("Настройки мыши")]
    public float mouseSpeed;        // Скорость вращения мыш
    public float mouseTopLimit;     // Верхний предел
    public float mouseBottomLimit;  // Нижний предел

    // Переменныйе для хранения состояний ввода
    private float horizontal;
    private float vertical;
    private float mouseX;
    private float mouseY;
    private Vector3 direction;

    // Объекты
    private Camera cam;
    private GameObject player;
    private Rigidbody rb;
    public GameObject avatar;

    // Use this for initialization
    void Start()
    {

        // Присвоение объектов переменным
        cam = FindObjectOfType<Camera>();
        player = transform.gameObject;
        rb = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        mouseX = Input.GetAxis("Mouse X");
        mouseY = Input.GetAxis("Mouse Y");
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");
        if (Input.GetMouseButton(1))
        {

            player.transform.Rotate(Vector3.up, mouseX * mouseSpeed);

        }
    }


    private void FixedUpdate()
    {
       
            if (Input.GetMouseButton(1))
            {

                Vector3 eulerAngleVelocity = new Vector3(0, 0, mouseX);

                player.transform.Rotate(Vector3.up, mouseX * mouseSpeed);
                Quaternion deltaRotation = Quaternion.Euler(eulerAngleVelocity * Time.deltaTime);
                rb.MoveRotation(rb.rotation * deltaRotation);

                //direction = mouseX * mouseSpeed * move;      
            }

        // Двигаем персонажа
       
       

        if (vertical != 0 || horizontal != 0)
        {
            runSpeed = 1;
            if (Input.GetKey(KeyCode.LeftShift))
            {
                if (vertical > 0 && horizontal == 0)
                {
                    runSpeed = 2;
                }
                else
                {
                    runSpeed = 1;
                }
            }

                rb.MovePosition(rb.transform.position + transform.forward * playerSpeed * Time.deltaTime * runSpeed * vertical + transform.right * playerSpeed * Time.deltaTime * horizontal);
           



        }
        /*
     

        */

    }

    private void LateUpdate()
    {
        // Перед всеми действиями прочитаем ввод


       
        // Наклон камеры
        if (Input.GetMouseButton(1))
        {
            cam.transform.RotateAround(player.transform.position, transform.right, -mouseY * mouseSpeed);
            //cam.transform.RotateAround(player.transform.position, transform.up, -mouseX * mouseSpeed);
        }
    }
}
 
Golgitab
UNец
 
Сообщения: 12
Зарегистрирован: 12 янв 2018, 00:51

Re: Дергается персонаж при движении камеры

Сообщение Golgitab 13 янв 2018, 03:52

К сожалению, все ещё актуально. Все что узнал на просторах интернета, что существует связь с частотой обновления FixedUpdate. Пробовал делать её больше, но при беге все равно пробегаю через стены(
Golgitab
UNец
 
Сообщения: 12
Зарегистрирован: 12 янв 2018, 00:51

Re: Дергается персонаж при движении камеры

Сообщение samana 13 янв 2018, 17:17

У rigidbody в инспекторе есть настройки Collision Detection, попробуйте установить им другое значение, например в Continuous.
Аватара пользователя
samana
Адепт
 
Сообщения: 4172
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск
  • Сайт

Re: Дергается персонаж при движении камеры

Сообщение Golgitab 14 янв 2018, 02:16

samana писал(а):У rigidbody в инспекторе есть настройки Collision Detection, попробуйте установить им другое значение, например в Continuous.


Попробовал, эффект сгладился, теперь почти через стену не проскакивает, но видно как пытается и дергается возле стены.

З.Ы. Я пытался решить этот вопрос другим подходом к передвижению, например, как AddForce, но там эффект импульса при отпускании клавиши вперед не дает мне покоя..
Golgitab
UNец
 
Сообщения: 12
Зарегистрирован: 12 янв 2018, 00:51

Re: Дергается персонаж при движении камеры

Сообщение Golgitab 14 янв 2018, 03:06

И да, есть такой вопрос, не будет ли костылем ненужным, если я сделаю проверку рейкастом на расстояние до стены? и буду всегда проверять, далеко ли она
Golgitab
UNец
 
Сообщения: 12
Зарегистрирован: 12 янв 2018, 00:51

Re: Дергается персонаж при движении камеры

Сообщение samana 15 янв 2018, 02:34

Golgitab писал(а):И да, есть такой вопрос, не будет ли костылем ненужным, если я сделаю проверку рейкастом на расстояние до стены? и буду всегда проверять, далеко ли она

Я только рейкастами и делал когда-то.
Аватара пользователя
samana
Адепт
 
Сообщения: 4172
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск
  • Сайт

Re: Дергается персонаж при движении камеры

Сообщение Msey 15 янв 2018, 10:50

Лучше сделайте фейковый MovePosition: вектор (точку) смещаете на новую позицию и в ее координате проверяете на пересечение с объектами. Если пересечение происходит, то видимый объект оставляем на месте до тех пор, пока точка не будет в свободном пространстве.
Аватара пользователя
Msey
UNIт
 
Сообщения: 103
Зарегистрирован: 31 мар 2015, 20:09
Откуда: Moscow
  • Сайт

Re: Дергается персонаж при движении камеры

Сообщение Golgitab 16 янв 2018, 06:10

Msey писал(а):Лучше сделайте фейковый MovePosition: вектор (точку) смещаете на новую позицию и в ее координате проверяете на пересечение с объектами. Если пересечение происходит, то видимый объект оставляем на месте до тех пор, пока точка не будет в свободном пространстве.

Спасибо за совет, попробую и отпишусь потом
Golgitab
UNец
 
Сообщения: 12
Зарегистрирован: 12 янв 2018, 00:51

Re: Дергается персонаж при движении камеры

Сообщение Cr0c 16 янв 2018, 07:49

Msey писал(а):Лучше сделайте фейковый MovePosition: вектор (точку) смещаете на новую позицию и в ее координате проверяете на пересечение с объектами. Если пересечение происходит, то видимый объект оставляем на месте до тех пор, пока точка не будет в свободном пространстве.

Для такого velocity есть.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 2751
Зарегистрирован: 19 июн 2015, 13:50

Re: Дергается персонаж при движении камеры

Сообщение Golgitab 16 янв 2018, 11:39

Cr0c писал(а):
Msey писал(а):Лучше сделайте фейковый MovePosition: вектор (точку) смещаете на новую позицию и в ее координате проверяете на пересечение с объектами. Если пересечение происходит, то видимый объект оставляем на месте до тех пор, пока точка не будет в свободном пространстве.

Для такого velocity есть.

Как оно здесь может помочь? Немного не понимаю..
Golgitab
UNец
 
Сообщения: 12
Зарегистрирован: 12 янв 2018, 00:51

Re: Дергается персонаж при движении камеры

Сообщение Golgitab 22 янв 2018, 15:28

Тему можно закрывать, проблема с дерганьем персонажа решилась установкой extrapolate в capsule collider.
Это опция предугадывает следующий кадр, на основе текущего, если быть в кратце.
Всем спасибо большое!
Golgitab
UNец
 
Сообщения: 12
Зарегистрирован: 12 янв 2018, 00:51

Re: Дергается персонаж при движении камеры

Сообщение SSlava 23 янв 2018, 23:34

Ну да, тоже думал, почему персонаж не сильно плавно двигается. Правда эта опция в Ригбоди, а не в коллайдерах.
:D

Намного плавнее стало. Интересно, эта опция много ресурсов кушает? Ну для противников и для персонажа надо думаю поставить, а вот для пуль никакой разницы особо не заметил.
SSlava
UNIт
 
Сообщения: 130
Зарегистрирован: 15 янв 2018, 13:43


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 10