Движение рывками

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

Движение рывками

Сообщение tema_petrosyan 15 мар 2020, 14:25

Всем здравствуйте, возникла проблема: есть поезд, в нём кабина, а в ней игрок (кабина и игрок - дочерние к поезду). По идее, когда поезд едет, игрок может ходить по кабине, однако его очень сильно трясёт. В то же время, когда поезд не движется, ходить по кабине можно совершенно спокойно.
Вот скрипт движения поезда:
Синтаксис:
Используется csharp
public GameObject poezd;
    public float shag;
    public float speed;

    public GameObject waypoint;
        public void Run()
    {
        speed += shag;
    }

    public void Stop()
    {
        speed -= shag * 2;
    }


    public void Update()
    {
        poezd.transform.position += poezd.transform.right * speed * Time.deltaTime;
    }

А вот видео с проблемой:

Буду благодарен за помощь!
Изображение
tema_petrosyan
UNец
 
Сообщения: 28
Зарегистрирован: 27 ноя 2019, 20:37

Re: Движение рывками

Сообщение Jarico 15 мар 2020, 15:12

Проблема в названии темы но её описание вообще не об этом...

У тебя вся игра фризит (либо запись такая) а чтобы реализовать движение игрока во время движения нужно просто добавлять игроку ускорение поезда
VK: _ttp://vk.com/salavan73
Discord: Майор Доигралес#9382
RakNet Unity: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Аватара пользователя
Jarico
Старожил
 
Сообщения: 624
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Движение рывками

Сообщение tema_petrosyan 15 мар 2020, 17:13

Попробую объяснить по другому. Едет поезд. Пока он едет, игроку необходимо перемещаться по кабине и нажимать на кнопочки, однако это очень сложно сделать, т.к. тебя постоянно вжимает в стену и выкидывает из кабины. А на видео всё очень сильно лагает(
Изображение
tema_petrosyan
UNец
 
Сообщения: 28
Зарегистрирован: 27 ноя 2019, 20:37

Re: Движение рывками

Сообщение 1max1 15 мар 2020, 17:17

Сделай игрока дочерним к поезду.
t.me/realwar_fx
Аватара пользователя
1max1
Адепт
 
Сообщения: 3775
Зарегистрирован: 28 июн 2017, 10:51

Re: Движение рывками

Сообщение Xtir 15 мар 2020, 17:20

Лучше покажи как ты двигаешь игрока, с движением поезда всё понятно - он едет боком вправо.
Xtir
UNITрон
 
Сообщения: 339
Зарегистрирован: 21 окт 2016, 00:37

Re: Движение рывками

Сообщение tema_petrosyan 15 мар 2020, 17:25

Синтаксис:
Используется csharp
[SerializeField] private string horizontalInputName;
    [SerializeField] private string verticalInputName;

    [SerializeField] private float walkSpeed, runSpeed;
    [SerializeField] private float runBuildUpSpeed;
    [SerializeField] private KeyCode runKey;

    private float movementSpeed;

    [SerializeField] private float slopeForce;
    [SerializeField] private float slopeForceRayLength;

    private CharacterController charController;

    [SerializeField] private AnimationCurve jumpFallOff;
    [SerializeField] private float jumpMultiplier;
    [SerializeField] private KeyCode jumpKey;


    private bool isJumping;

    private void Awake()
    {
        charController = GetComponent<CharacterController>();
    }

    private void Update()
    {
        PlayerMovement();
    }

    private void PlayerMovement()
    {
        float horizInput = Input.GetAxis(horizontalInputName);
        float vertInput = Input.GetAxis(verticalInputName);

        Vector3 forwardMovement = transform.forward * vertInput;
        Vector3 rightMovement = transform.right * horizInput;


        charController.SimpleMove(Vector3.ClampMagnitude(forwardMovement + rightMovement, 1.0f) * movementSpeed);

        if ((vertInput != 0 || horizInput != 0) && OnSlope())
            charController.Move(Vector3.down * charController.height / 2 * slopeForce * Time.deltaTime);


        SetMovementSpeed();
        JumpInput();
    }

    private void SetMovementSpeed()
    {
        if (Input.GetKey(runKey))
            movementSpeed = Mathf.Lerp(movementSpeed, runSpeed, Time.deltaTime * runBuildUpSpeed);
        else
            movementSpeed = Mathf.Lerp(movementSpeed, walkSpeed, Time.deltaTime * runBuildUpSpeed);
    }


    private bool OnSlope()
    {
        if (isJumping)
            return false;

        RaycastHit hit;

        if (Physics.Raycast(transform.position, Vector3.down, out hit, charController.height / 2 * slopeForceRayLength))
            if (hit.normal != Vector3.up)
            {
                print("OnSlope");
                return true;
            }

        return false;
    }

    private void JumpInput()
    {
        if (Input.GetKeyDown(jumpKey) && !isJumping)
        {
            isJumping = true;
            StartCoroutine(JumpEvent());
        }
    }


    private IEnumerator JumpEvent()
    {
        charController.slopeLimit = 90.0f;
        float timeInAir = 0.0f;
        do
        {
            float jumpForce = jumpFallOff.Evaluate(timeInAir);
            charController.Move(Vector3.up * jumpForce * jumpMultiplier * Time.deltaTime);
            timeInAir += Time.deltaTime;
            yield return null;
        } while (!charController.isGrounded && charController.collisionFlags != CollisionFlags.Above);

        charController.slopeLimit = 45.0f;
        isJumping = false;
    }


P.S.: писал этот код не я, а скачал его с GitHub у англоязычного ютубера
Изображение
tema_petrosyan
UNец
 
Сообщения: 28
Зарегистрирован: 27 ноя 2019, 20:37

Re: Движение рывками

Сообщение tema_petrosyan 15 мар 2020, 17:27

1max1 писал(а):Сделай игрока дочерним к поезду.

он и так является дочерним к поезду
Изображение
tema_petrosyan
UNец
 
Сообщения: 28
Зарегистрирован: 27 ноя 2019, 20:37


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

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

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