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

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

СообщениеДобавлено: 21 мар 2020, 22:02
DikSan
Привет всем. Проблема с вертикальным движением в 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);
    }

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

СообщениеДобавлено: 22 мар 2020, 07:44
1max1
Управление странное, зачем к примеру обнулять ось Y?
movement.y = 0;
Почему бы не дать действовать гравити всегда, не зависимо на земле персонаж или нет, у тебя он все равно не провалится из-за коллайдера.

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

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

В таком случае пока ходишь по поверхности скорость падения всегда растёт и при падении с каких-либо обрывов персонаж очень быстро улетает вниз.

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

СообщениеДобавлено: 22 мар 2020, 11:16
1max1
Хм, а если так?

Синтаксис:
Используется 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);
    }

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

СообщениеДобавлено: 22 мар 2020, 12:49
DikSan
Ранее пробовал уже писать там -0.1f, не помогло, после этого переписал некоторые моменты (убрал весь этот код из Update в отдельный метод) и вот сейчас уже это сработало. Спасибо за помощь. :-bd