• 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?

Object Storage Arubacloud
0 głosów
163 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ź 337 wizyt
pytanie zadane 6 sierpnia 2019 w C# przez Bezy Bywalec (2,280 p.)
0 głosów
1 odpowiedź 236 wizyt
0 głosów
2 odpowiedzi 715 wizyt
pytanie zadane 19 czerwca 2019 w C# przez niezalogowany

92,555 zapytań

141,403 odpowiedzi

319,553 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...