Top.Mail.Ru
Ответы
Аватар пользователя
Изменено
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+3

Здравствуйте, я новичок в юнити, а точнее в c# и взял скрипт с интернета, но есть одна проблема

объект прыгает если нажать пробел 2 раза, то прыгает 2 раза, причем в воздухе. надо сделать так, чтобы он не мог прыгать от воздуха, только от земли! вот и сам кодик

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
 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; 
        } 
    } 
} 
Дополнен

к сожалению не помогло, так же прыгает с воздуха, пишу тут, так как лимит на коментарии

Дополнен

Применяя твой код, то можно прыгать несколько раз, потом нельзя будет

Дополнен

есть вариант сделать потолок, но не красиво будет, можно в коде сделать, что если персонаж прыгнет выше обозначения, он проиграет

По дате
По рейтингу
Аватар пользователя
Новичок

Да, я могу тебе помочь. Вот измененный код, который позволяет персонажу прыгать только с земли:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
 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, когда игрок покидает землю.

123456789101112131415161718192021222324252627282930
 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. Вот пример:

12345678910
 void Update()  
{  
    ... 
    if (Input.GetKeyDown("space") && isGrounded) // разрешение прыжков только если игрок находится на земле 
    {  
        doJump = true;  
    }  
    ... 
} 
 

С этими изменениями игрок сможет прыгать только когда он касается земли.