Прыжок и движения в пространстве - Unity3d
Когда я прыгаю без нажатия клавиш: вперед назад, влево, вправо, то куб плавно и самое главное быстро падает обратно на землю, все в порядке, гравитация работает, но когда я начинаю двигать кубик в воздухе, то есть в прыжке нажимая клавиши вперед, назад, вправо, влево, то он начинает падать намного медленнее, примерно у -= 0,02 секунды, хотя без нажатия где-то у -= 1 в секунду.
Как исправить чтобы он падал так же быстро как без нажатий клавиш, и без костылей?
Код:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class InputCar : MonoBehaviour
{
public KeyCode right;
public KeyCode left;
public KeyCode forward;
public KeyCode down;
public bool is_way = false;
public Rigidbody player;
public bool moveRight =true;
public bool moveLeft = true;
public float speed = 25f;
float speedFor = 5f;
public float jumpSpeed = 25.0f;
public float gravity = 20.0f;
public bool isPlayer = true;
public Vector3 posPlayer;
public Vector3 positionPlayer;
void Start()
{
player = GetComponent<Rigidbody>();
}
void Update()
{
Debug.Log(player.transform.position.y);
if (isPlayer == false)
{
StartCoroutine(Fade());
}
}
void FixedUpdate()
{
if (isPlayer == true)//Move Player
{
if (Input.GetKey(right) && Input.GetKey(forward))
{
player.velocity = ((Vector3.right) * (speedFor));
}
if (Input.GetKey(left) && Input.GetKey(forward))
{
player.velocity = ((Vector3.left) * (speedFor));
}
if (Input.GetKey(left) && Input.GetKey(down))
{
player.velocity = (Vector3.left * (speedFor));
}
if (Input.GetKey(right) && Input.GetKey(down))
{
player.velocity = (Vector3.right * (speedFor));
}
if (Input.GetKey(forward))
{
player.velocity = (-Vector3.right * (speed));
}
if (Input.GetKey(down))
{
player.velocity = (Vector3.right * (speed));
}
if (moveRight == true)
{
if (Input.GetKey(right))
{
player.velocity = (Vector3.forward) * (speed / 5);
//transform.Translate((Vector3.forward) * Time.deltaTime * (speedFor));
}
}
if (moveLeft == true)
{
if (Input.GetKey(left))
{
player.velocity = (-(Vector3.forward) * (speed / 5));
//transform.Translate(-(Vector3.forward) * Time.deltaTime * (speedFor));
}
}
if (Input.GetKey(KeyCode.Space) && is_way)
{
Debug.Log("JUMP");
player.AddForce((Vector3.up) * jumpSpeed, ForceMode.Impulse);
is_way = false;
}
}
}
IEnumerator Fade()
{
yield return new WaitForSeconds(2f);
SceneManager.LoadScene("_Scene_0");
}
Ответы (1 шт):
Автор решения: Yaroslav
→ Ссылка
[DisallowMultipleComponent]
[RequireComponent(typeof(Rigidbody))] // обязательные компоненты указываются
public class Car : MonoBehaviour {
public event System.Action<bool> ControlChanged;
// isPlayer не отображает значение переменной
// это не просто переменная, которая тупо перепроверяется каждый update, а свойство с событием
public bool ControlEnable {
get => _control;
set {
if (_control != value) {
_control = value;
ControlChanged?.Invoke(_control);
}
}
}
// это переменные для внутренней кухни класса, не должны быть public
[SerializeField] private Vector2 _speed = new Vector2(25f, 5); // _speed и _speedFor ужасные названия и почему это 2 переменные
[SerializeField] private float _jumpPower = 25.0f;
private Rigidbody _body;
private bool _control = true;
// is_way... DO YOU KNOW THE WAY?
// не отображает значение переменной
private bool _onGround = false;
// не меняется, в чем отличие от Input.GetKey(right) ?
// почему используется одновременно раздельно и затем вместе, что перекрывает предыдущий код... бред
//public bool moveRight = true;
//public bool moveLeft = true; // тоже самое
//public float gravity = 20.0f; // не используется
//public Vector3 posPlayer; // не используется
//public Vector3 positionPlayer; // в чем разница с posPlayer?
public void SetMovementVector (Vector2 vector) {
if (_control) {
vector *= _speed;
// меняем только x и z, оставляя y как есть
_body.velocity = new Vector3(vector.x, _body.velocity.y, vector.y);
}
}
public void Jump () {
if (_control && _onGround) {
_body.AddForce(Vector3.up*_jumpPower, ForceMode.Impulse);
_onGround = false;
}
}
private void Awake () {
_body = GetComponent<Rigidbody>();
}
}
[DisallowMultipleComponent]
[RequireComponent(typeof(Car))]
public class CarPlaerControler : MonoBehaviour {
// вообще можно изспользовать Input.GetAxis и настраивать клавиши в меню Inputs, переменные... странно
[SerializeField] private KeyCode _forward;
[SerializeField] private KeyCode _down;
[SerializeField] private KeyCode _right;
[SerializeField] private KeyCode _left;
private Car _car;
private void Awake () {
_car = GetComponent<Car>();
_car.ControlChanged += ControlChanged;
}
private void FixedUpdate () {
float AxisX = 0;
if (Input.GetKey(_right))
AxisX += 1;
if (Input.GetKey(_left))
AxisX += -1;
float AxisY = 0;
if (Input.GetKey(_forward))
AxisY += 1;
if (Input.GetKey(_down))
AxisY += -1;
_car.SetMovementVector(new Vector2(AxisX, AxisY));
if (Input.GetKey(KeyCode.Space))
_car.Jump();
}
// реакция на событие потери котроля
private void ControlChanged (bool enable) {
if (enable == false)
StartCoroutine(Fade());
}
private IEnumerator Fade () {
yield return new WaitForSeconds(2f);
SceneManager.LoadScene("_Scene_0");
}
}
Для врагов пишется свой CarControler.