Страница 1 из 1

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

СообщениеДобавлено: 12 янв 2018, 00:55
Golgitab
Добрый день!
Подскажите, пожалуйста, как решить проблему дергания камеры.
Ситуация такая: Есть 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);
           



        }

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

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

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

СообщениеДобавлено: 12 янв 2018, 02:16
Golgitab
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);
        }
    }
}
 

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

СообщениеДобавлено: 13 янв 2018, 03:52
Golgitab
К сожалению, все ещё актуально. Все что узнал на просторах интернета, что существует связь с частотой обновления FixedUpdate. Пробовал делать её больше, но при беге все равно пробегаю через стены(

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

СообщениеДобавлено: 13 янв 2018, 17:17
samana
У rigidbody в инспекторе есть настройки Collision Detection, попробуйте установить им другое значение, например в Continuous.

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

СообщениеДобавлено: 14 янв 2018, 02:16
Golgitab
samana писал(а):У rigidbody в инспекторе есть настройки Collision Detection, попробуйте установить им другое значение, например в Continuous.


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

З.Ы. Я пытался решить этот вопрос другим подходом к передвижению, например, как AddForce, но там эффект импульса при отпускании клавиши вперед не дает мне покоя..

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

СообщениеДобавлено: 14 янв 2018, 03:06
Golgitab
И да, есть такой вопрос, не будет ли костылем ненужным, если я сделаю проверку рейкастом на расстояние до стены? и буду всегда проверять, далеко ли она

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

СообщениеДобавлено: 15 янв 2018, 02:34
samana
Golgitab писал(а):И да, есть такой вопрос, не будет ли костылем ненужным, если я сделаю проверку рейкастом на расстояние до стены? и буду всегда проверять, далеко ли она

Я только рейкастами и делал когда-то.

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

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

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

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

Спасибо за совет, попробую и отпишусь потом

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

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

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

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

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

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

Как оно здесь может помочь? Немного не понимаю..

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

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

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

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

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