Вертикальное движение в CharacterController.Move()

Программирование на Юнити.

Вертикальное движение в CharacterController.Move()

Сообщение DikSan 21 мар 2020, 22:02

Привет всем. Проблема с вертикальным движением в CharacterController'e. Персонаж прыгает и приземляется, все хорошо, но когда просто стоишь на земле в Update через раз выводится то true, то false. Т.е. персонаж как бы то на земле, то нет, кто знает почему так?
Думал, что, возможно, я слишком сильно опускаю персонажа вниз, коллайдер CharacterController'a пересекается с полом, а потом CharacterController пытается вытолкнуть перса обратно наверх, что в итоге приводит к микроотрыву от земли, но на сцене положение игрока по оси Y не меняется, всегда одно не длинное число.
При использовании метода SimpleMove такой проблемы нет и когда персонаж стоит на земле всегда isGrounded == true, но я не нашел как там реализовано движение по вертикали.
Синтаксис:
Используется csharp
 void MoveCharacter()
    {
        float vertAx = Input.GetAxis("Vertical");
        float vertDir = 0;
        if (vertAx != 0)
        {
            vertDir = movement.y;
            movement = tr.forward * speed * Mathf.Sign(vertAx);
            movement.y = vertDir;
        }
        else
        {
            movement.x = movement.z = 0;
        }
        if (characterController.isGrounded)
        {
            movement.y = 0;
            if (Input.GetButton("Jump"))
            {
                movement.y = jumpForce;
            }
        }
        else
        {
            movement.y -= gravity * Time.deltaTime;
        }
        characterController.Move(movement * Time.deltaTime);
    }

Синтаксис:
Используется csharp
    void Update()
    {
        MoveCharacter();
        RotateCharacter();
        Debug.Log(" " + characterController.isGrounded);
    }
DikSan
UNец
 
Сообщения: 48
Зарегистрирован: 23 июн 2017, 16:34

Re: Вертикальное движение в CharacterController.Move()

Сообщение 1max1 22 мар 2020, 07:44

Управление странное, зачем к примеру обнулять ось Y?
movement.y = 0;
Почему бы не дать действовать гравити всегда, не зависимо на земле персонаж или нет, у тебя он все равно не провалится из-за коллайдера.
t.me/realwar_fx
Аватара пользователя
1max1
Адепт
 
Сообщения: 3775
Зарегистрирован: 28 июн 2017, 10:51

Re: Вертикальное движение в CharacterController.Move()

Сообщение DikSan 22 мар 2020, 10:30

1max1 писал(а):Управление странное, зачем к примеру обнулять ось Y?
movement.y = 0;

В таком случае пока ходишь по поверхности скорость падения всегда растёт и при падении с каких-либо обрывов персонаж очень быстро улетает вниз.
DikSan
UNец
 
Сообщения: 48
Зарегистрирован: 23 июн 2017, 16:34

Re: Вертикальное движение в CharacterController.Move()

Сообщение 1max1 22 мар 2020, 11:16

Хм, а если так?

Синтаксис:
Используется csharp
    void MoveCharacter()
    {
        float oldY = movement.y;
        movement = tr.forward * speed * Input.GetAxisRaw("Vertical");
        movement.y = oldY;
             
        if (characterController.isGrounded)
        {
            movement.y = -0.1f;

            if (Input.GetButton("Jump"))
            {
                movement.y = jumpForce;
            }
        }
        else
            movement.y -= gravity * Time.deltaTime;

        characterController.Move(movement * Time.deltaTime);
    }
t.me/realwar_fx
Аватара пользователя
1max1
Адепт
 
Сообщения: 3775
Зарегистрирован: 28 июн 2017, 10:51

Re: Вертикальное движение в CharacterController.Move()

Сообщение DikSan 22 мар 2020, 12:49

Ранее пробовал уже писать там -0.1f, не помогло, после этого переписал некоторые моменты (убрал весь этот код из Update в отдельный метод) и вот сейчас уже это сработало. Спасибо за помощь. :-bd
DikSan
UNец
 
Сообщения: 48
Зарегистрирован: 23 июн 2017, 16:34


Вернуться в Скрипты

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4