Top.Mail.Ru
Ответы

Ошибка в Unity 3D, прыжок персонажа.

Пытаюсь сделать geometry dash в 3д, что бы посмотреть что получиться. всё шло хорошо до момента с прыжками. Сначала куб иногда отказывался прыгать при нажатии на пробел. решил заглянуть в интернет и кое что поменять, теперь куб и вовсе отказываться прыгать. Пытался переставлять кусок отвечающий за прыжок куда только возможно, ничего не помогает. Подскажите ошибка в коде или надо смотреть что то другое?
Последняя рабочая версия кода (раньше он работал):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PM : MonoBehaviour
{
public GM gm;
public Rigidbody rb;
public float runspeed = 100f;
public float jumpforce = 10f;

protected bool dojump = false;
private bool POG;

private void OnCollisionEnter(Collision collision)
{
if(collision.collider.tag == "ground")
{
POG = true;
}

if (collision.collider.tag == "death")
{
gm.EndGame();
}
}

private void OnCollisionExit(Collision collision)
{
if (collision.collider.tag == "ground")
{
POG = false;
}
}

void Update()
{
Jump();
}

private void FixedUpdate()
{
rb.MovePosition(transform.position + Vector3.forward * runspeed * Time.deltaTime);

}

public void Jump()
{
if(Input.GetKeyDown("space"))
{
if (POG == true)
{
rb.AddForce(Vector3.up * jumpforce * Time.deltaTime, ForceMode.Impulse);
}
}
}
}

По дате
По Рейтингу
Аватар пользователя
Мыслитель

Ты через rb.MovePosition в каждом псевдо-кадре ( FixedUpdate() ) устанавливаешь объект в определённую позицию и просто перетираешь импульс прыжка.
Я понимаю, что ты хотел добавлять движение, и прибавлять к текущей позиции (transform.position), но у тебя одно в Update() а другое в FixedUpdate(), а эти функции десинхронизированы, по этому либо перемести все вызовы, которые двигают объект в FixedUpdate(), либо сделай иерархию из двух объектов - один будет бегать, другой прыгать.

PS. На всякий случай - GetKeyDown должен остаться в Update(). В FixedUpdate() он может работать один раз из пяти (если повезёт).