Проблема с физикой в Unity(прыжки)
Когда я зажимаю клавишу "W" и нажимаю пробел мой объект останавливается в воздухе. Как это исправить? Вот код:
public float speed = 5f;
public Rigidbody rb;
public float jumpforse = 10f;
public bool isGround = true;
public BoxCollider bc;
float deltaX;
float deltaZ;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
Move();
}
private void Move()
{
if (isGround == true)
{
deltaX = Input.GetAxis("Horizontal") * speed;
deltaZ = Input.GetAxis("Vertical") * speed;
if (deltaX > 0)
{
transform.Translate(Vector3.forward * Time.deltaTime * speed);
}
else if (deltaX == 0)
{
}
else
{
transform.Translate(Vector3.back * Time.deltaTime * speed);
}
if (deltaZ > 0)
{
transform.Translate(Vector3.left * Time.deltaTime * speed);
}
else if (deltaZ == 0)
{
}
else
{
transform.Translate(Vector3.right * Time.deltaTime * speed);
}
}
if (Input.GetKeyDown(KeyCode.Space) && isGround == true)
{
rb.AddForce(0, jumpforse, 0);
isGround = false;
}
if (isGround == false && (deltaX != 0 || deltaZ != 0))
{
rb.AddForce(deltaX * Time.deltaTime * speed, 0, deltaZ * Time.deltaTime * speed);
}
}
private void OnTriggerEnter(Collider floor)
{
isGround = true;
}
}
Ответы (1 шт):
Автор решения: Yaroslav
→ Ссылка
Учитесь по учебникам/курсам поэтапно, а не смотрите в интернетах, чё как делать варварски склеивая своего франкенштейна. Жизнь не проза, не оживёт и hello mommy! не скажет.
Конкретно ваш косяк в одновременном transform.Translate и rb.AddForce, одно физическое движение, другое скриптованное и существовать вместе они не могут. Плюс манипуляции с transform проходят сквозь стены, поскольку не имеют отношения к физике.
[DisallowMultipleComponent]
// если компонент обязателен, указываем
[RequireComponent(typeof(Rigidbody))]
public class Character : MonoBehaviour
{
// публичных полей тут быть не должно, это внутренняя кухня
[SerializeField] private float _speed = 5f;
[SerializeField] private float _jumpForce = 10f;
[Space]
[SerializeField] private KeyCode _jumpKey = KeyCode.Space;
[SerializeField] private LayerMask _floorLayer;
private Rigidbody _body;
private bool _isGround = true;
// в полях deltaX и deltaY нет смысла
private void Awake ()
{
_body = GetComponent<Rigidbody>();
}
private void Update ()
{
MoveUpdate();
}
private void MoveUpdate ()
{
// eсли блок состоит из одной команды, то операционные скобки { } не обязательны!
if (Input.GetKeyDown(_jumpKey))
Jump();
// для чего все if не понятно Axis и есть все 4 направления
Vector2 Axis = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
Vector2 Velocity = Axis*_speed;
// присваиваем телу скорости по плоскасти xz, не трогая y
_body.velocity = new Vector3(Velocity.x, _body.velocity.y, Velocity.y);
}
private void Jump ()
{
if (_isGround)
{
_body.AddForce(0, _jumpForce, 0);
_isGround = false;
}
}
private void OnCollisionEnter (Collision collision)
{
// что бы не заниматься фигнёй расставляя триггеры просто задаём полу конкретный Layer и указываем его
// в испекторе прямо под именем GameObject
if (collision.gameObject.layer == _floorLayer)
_isGround = true;
}
}