


Здравствуйте, я новичок в юнити, а точнее в c# и взял скрипт с интернета, но есть одна проблема
объект прыгает если нажать пробел 2 раза, то прыгает 2 раза, причем в воздухе. надо сделать так, чтобы он не мог прыгать от воздуха, только от земли! вот и сам кодик
using UnityEngine;
using DG.Tweening;
public class PlayerMove : MonoBehaviour
{
public GameManager gm;
public Rigidbody rb;
public float runSpeed = 500f;
public float strafeSpeed = 500f;
public float jumpForce = 15f;
protected bool straleLeft = false;
protected bool straleRight = false;
protected bool doJump = false;
void OnCollisionEnter(Collision collision)
{
if (collision.collider.tag == "Obstacle")
{
gm.EndGame();
Debug.Log("Конец Игры");
}
}
void Update()
{
if (Input.GetKey("a"))
{
straleLeft = true;
}
else
{
straleLeft = false;
}
if (Input.GetKey("d"))
{
straleRight = true;
}
else
{
straleRight = false;
}
if (Input.GetKeyDown("space"))
{
doJump = true;
}
if(transform.position.y < -5f)
{
gm.EndGame();
Debug.Log("Конец игры");
}
}
void FixedUpdate()
{
transform.Translate(0, 0, runSpeed * Time.deltaTime);
if (straleLeft)
{
rb.AddForce(-strafeSpeed * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}
if (straleRight)
{
rb.AddForce(strafeSpeed * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}
if(doJump)
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
transform.DORewind();
transform.DOShakeScale(.5f, .5f, 3, 30);
doJump = false;
}
}
}
к сожалению не помогло, так же прыгает с воздуха, пишу тут, так как лимит на коментарии
Применяя твой код, то можно прыгать несколько раз, потом нельзя будет
есть вариант сделать потолок, но не красиво будет, можно в коде сделать, что если персонаж прыгнет выше обозначения, он проиграет
Да, я могу тебе помочь. Вот измененный код, который позволяет персонажу прыгать только с земли:
using UnityEngine;
using DG.Tweening;
public class PlayerMove : MonoBehaviour {
public GameManager gm;
public Rigidbody rb;
public float runSpeed = 500f;
public float strafeSpeed = 500f;
public float jumpForce = 15f;
protected bool straleLeft = false;
protected bool straleRight = false;
protected bool doJump = false;
void OnCollisionEnter(Collision collision) {
if (collision.collider.tag == "Obstacle") {
gm.EndGame();
Debug.Log("Конец игры");
}
}
void Update() {
if (Input.GetKey("a")) {
straleLeft = true;
} else {
straleLeft = false;
}
if (Input.GetKey("d")) {
straleRight = true;
} else {
straleRight = false;
}
if (Input.GetKeyDown("space") && rb.velocity.y <= 0f) {
doJump = true;
}
if(transform.position.y < -5f) {
gm.EndGame();
Debug.Log("Конец игры");
}
}
void FixedUpdate() {
transform.Translate(0, 0, runSpeed * Time.deltaTime);
if (straleLeft) {
rb.AddForce(-strafeSpeed * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}
if (straleRight) {
rb.AddForce(strafeSpeed * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}
if(doJump) {
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
transform.DORewind();
transform.DOShakeScale(.5f, .5f, 3, 30);
doJump = false;
}
}
}
Изменения были внесены в функцию Update(). В первоначальном коде проверка состояния doJump выполнялась только в начале функции. Это означало, что персонаж мог прыгать несколько раз подряд, даже если он находился в воздухе. В измененном коде проверка состояния doJump выполняется перед каждым прыжком. Это предотвращает прыжки в воздухе.
Я надеюсь, это поможет!
Чтобы предотвратить прыжки игрока в воздухе, вы можете добавить проверку, чтобы убедиться, что игрок находится на земле, прежде чем разрешить ему прыгать. Вот пример того, как это можно сделать:
Во-первых, добавьте новую логическую переменную isGrounded, чтобы отслеживать, касается ли игрок земли или нет. Вы можете установить эту переменную в значение true в методе OnCollisionEnter, когда игрок сталкивается с землей, и установить ее в значение false в методе OnCollisionExit, когда игрок покидает землю.
public class PlayerMove : MonoBehaviour
{
...
protected bool isGrounded = false; // новая переменная для отслеживания, находится ли игрок на земле
...
void OnCollisionEnter(Collision collision)
{
if (collision.collider.tag == "Obstacle")
{
gm.EndGame();
Debug.Log("Конец Игры");
}
else if (collision.collider.tag == "Ground") // проверка столкновения игрока с землей
{
isGrounded = true; // установка isGrounded в true
}
}
void OnCollisionExit(Collision collision)
{
if (collision.collider.tag == "Ground") // проверка, покидает ли игрок землю
{
isGrounded = false; // установка isGrounded в false
}
}
...
}
Затем обновите метод Update, чтобы разрешить прыжки только если isGrounded равно true. Вот пример:
void Update()
{
...
if (Input.GetKeyDown("space") && isGrounded) // разрешение прыжков только если игрок находится на земле
{
doJump = true;
}
...
}
С этими изменениями игрок сможет прыгать только когда он касается земли.