• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego nie działa Ground Check in Unity?

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
145 wizyt
pytanie zadane 22 sierpnia 2021 w C# przez NewbieProgrammer Początkujący (480 p.)
edycja 22 sierpnia 2021 przez NewbieProgrammer

Cześć, mam problem z ograniczeniem możliwości skakania w powietrzu. Dopóki postać jest w powietrzy postać nie powinna móc skoczyć drugi raz, dopiero po dotknięciu ziemi. Niestety postać może nadal skakać w powietrzu i nie mam pojęcia dlaczego nadal ma tę możliwość 

 


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Copy : MonoBehaviour
{

    [SerializeField] private LayerMask platformLayerMask;

    
    private Rigidbody2D rigidbody2d;
    private BoxCollider2D boxCollider2d;

    private void Awake()
    {

        rigidbody2d = transform.GetComponent<Rigidbody2D>();
        boxCollider2d = transform.GetComponent<BoxCollider2D>();
    }

    private void Update()
    {
        // Handle Jump
        if (IsGrounded() && Input.GetKeyDown(KeyCode.Space))
        {
            float jumpVelocity = 5f;
            rigidbody2d.velocity = Vector2.up * jumpVelocity;
        }


    }

    private void FixedUpdate()
    {
        // Handle Movement
        float moveSpeed = 10f;
        rigidbody2d.constraints = RigidbodyConstraints2D.FreezeRotation;
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            rigidbody2d.velocity = new Vector2(-moveSpeed, rigidbody2d.velocity.y);
        }
        else
        {
            if (Input.GetKey(KeyCode.RightArrow))
            {
                rigidbody2d.velocity = new Vector2(+moveSpeed, rigidbody2d.velocity.y);
            }
            else
            {
                // No keys pressed
                rigidbody2d.velocity = new Vector2(0, rigidbody2d.velocity.y);
                rigidbody2d.constraints = RigidbodyConstraints2D.FreezePositionX | RigidbodyConstraints2D.FreezeRotation;
            }
        }
    }

    private bool IsGrounded()
    {
        

        float extraHeightText = 1f;
        RaycastHit2D raycastHit = Physics2D.BoxCast(boxCollider2d.bounds.center, boxCollider2d.bounds.size, 0f, Vector2.down, extraHeightText, platformLayerMask);
       
        Debug.Log(raycastHit.collider);
        return raycastHit.collider != null;
    }



}

 

komentarz 22 sierpnia 2021 przez NewbieProgrammer Początkujący (480 p.)

Cześć, stworzyłem inny kod na ruszanie się i ograniczenie skoku trochę inną metodą z pomocą tego poradnika https://www.youtube.com/watch?v=L6Q6VHueWnU

Po tym jak postać spada ziemnie "Is Graunded" w unity pokazuje jako zaznaczone, a po podskoczeniu ciągle zostaje zaznaczone. W filmiku jest pokazane jak w momencie podskoku odznacza się "Is Graunded" i postać nie może skakać ponownie- niestety u mnie cały czas jest zaznaczone i można skakać. Tak, dodałem tagi do ziemi :/

Grounded dla dodatkowego collidera postaci który sprawdza czy dotyka ziemi

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Graunded : MonoBehaviour
{
    GameObject Postac;
    // Start is called before the first frame update
    void Start()
    {
        Postac = gameObject.transform.parent.gameObject;
    }

    // Update is called once per frame
    void Update()
    {
       
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.collider.tag == "Ground")
        {
            Postac.GetComponent<Ruszaszsie>().isGraunded= true;
        }
    }

    private void OnCollisionExit(Collision collision)
    {
        if (collision.collider.tag == "Ground")
        {
            Postac.GetComponent<Ruszaszsie>().isGraunded = false;
        }
    }
}

Ogólne ruszanie się postaci

public float moveSpeed = 5f;
    public bool isGraunded = false;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Jump();
        Vector3 movement = new Vector3(Input.GetAxis("Horizontal"), 0f, 0f);
        transform.position += movement * Time.deltaTime * moveSpeed;
            
    }

    void Jump()
    {
        if (Input.GetButtonDown("Jump") && isGraunded == true)
        {
            gameObject.GetComponent<Rigidbody2D>().AddForce(new Vector2(0f, 5f), ForceMode2D.Impulse);

            
        }
        
    }

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 228 wizyt
pytanie zadane 6 sierpnia 2019 w C# przez Bezy Bywalec (2,280 p.)
0 głosów
1 odpowiedź 185 wizyt
0 głosów
2 odpowiedzi 579 wizyt
pytanie zadane 19 czerwca 2019 w C# przez niezalogowany

91,832 zapytań

140,505 odpowiedzi

316,995 komentarzy

61,163 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...