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

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

СообщениеДобавлено: 15 мар 2020, 14:25
tema_petrosyan
Всем здравствуйте, возникла проблема: есть поезд, в нём кабина, а в ней игрок (кабина и игрок - дочерние к поезду). По идее, когда поезд едет, игрок может ходить по кабине, однако его очень сильно трясёт. В то же время, когда поезд не движется, ходить по кабине можно совершенно спокойно.
Вот скрипт движения поезда:
Синтаксис:
Используется 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;
    }

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

Буду благодарен за помощь!

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

СообщениеДобавлено: 15 мар 2020, 15:12
Jarico
Проблема в названии темы но её описание вообще не об этом...

У тебя вся игра фризит (либо запись такая) а чтобы реализовать движение игрока во время движения нужно просто добавлять игроку ускорение поезда

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

СообщениеДобавлено: 15 мар 2020, 17:13
tema_petrosyan
Попробую объяснить по другому. Едет поезд. Пока он едет, игроку необходимо перемещаться по кабине и нажимать на кнопочки, однако это очень сложно сделать, т.к. тебя постоянно вжимает в стену и выкидывает из кабины. А на видео всё очень сильно лагает(

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

СообщениеДобавлено: 15 мар 2020, 17:17
1max1
Сделай игрока дочерним к поезду.

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

СообщениеДобавлено: 15 мар 2020, 17:20
Xtir
Лучше покажи как ты двигаешь игрока, с движением поезда всё понятно - он едет боком вправо.

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

СообщениеДобавлено: 15 мар 2020, 17:25
tema_petrosyan
Синтаксис:
Используется 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 у англоязычного ютубера

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

СообщениеДобавлено: 15 мар 2020, 17:27
tema_petrosyan
1max1 писал(а):Сделай игрока дочерним к поезду.

он и так является дочерним к поезду