Unity 2D kolizja


#1

Witam, od niedawna bawię się w tym programie, i mama mały problem, gdy podczas skoku, postać wleci w blok z box collider 2D przyczepia się do niego i spadnie dopiero gdy przestanie kierować się w jego stronę. Co mam zrobić aby podczas kolizji z takim blokiem zamiast przyczepić się, zacznie spadać w dół?


#2

Pokaż Screena jak to wygląda. Sprubuj powiększyć troche Box’a.


#3

spadnie dopiero gdy puszczę “D”


#4

Na moje oko trzeba mu jakoś zablokować akcelerację jeśli coś stoi na jego drodze.
W tym momencie gdy trzymasz “D” jak na screenie, postać cały czas stara się przyśpieszyć w kierunku klocka, ale się na nim blokuje. Zupełnie tak jakby niewidzialna duża ręka dociskała go od lewej do tego klocka. :smiley:


#5

Brzmi sensownie, ale nwm jak to zrobić. :smiley:


#6

Nie znam kompletnie Unity, więc dokładnie Ci nie powiem, ale w sumie lepiej kogoś nakierować niż podać mu gotowe rozwiązanie na tacy :smiley:

Ja bym sprawdził co się w ogóle dzieje kiedy naciskam “D” jaka jest zasada poruszania się postaci do przodu.
Następnie postarałbym się powiedzieć programowi, żeby ignorował moje wciskanie “D” jeżeli dotykam czegoś stojącego mi na drodze.


#7

Dzieki za pomoc, ale myślę, że nie mam takiego doświadczenia, do poradzenia sobie samemu.


#8

a jak wygląda skrypt odpowiedzialny za skakanie?


#9

tak, tak, pokaż skrypt :slight_smile:


#10

Spróbuj ustawić tarcie w coliderach na 0 i przy postaci i przy platformie


#11

public class Player : MonoBehaviour {

public float moveSpeed;
public float jumpHeight;

public Transform groundCheck;
public float groundCheckRadius;
public LayerMask WhatIsGround;
private bool grouned;
private bool doubleJump;

private Animator anim;

void Start () {
    anim = GetComponent<Animator> ();
}

void OnCollisionExit2D(Collision2D col)
{
    Debug.Log(col.collider.name);
}
void FixedUpdate()
{

    grouned = Physics2D.OverlapCircle (groundCheck.position, groundCheckRadius, WhatIsGround);
}


void Update() {

    if (grouned)
        doubleJump = false;
    anim.SetBool("Grounded", grouned);



    if (Input.GetKeyDown(KeyCode.W) && grouned)
    {
        Jump();
    }

    if (Input.GetKeyDown(KeyCode.W) && !grouned && !doubleJump)
    {
        Jump();
        doubleJump = true;
    }

    if (Input.GetKey(KeyCode.D))
    {
        GetComponent<Rigidbody2D>().velocity = new Vector2(moveSpeed, GetComponent<Rigidbody2D>().velocity.y);
    }

    if (Input.GetKey(KeyCode.A))
    {
        GetComponent<Rigidbody2D>().velocity = new Vector2(-moveSpeed, GetComponent<Rigidbody2D>().velocity.y);
    }
    anim.SetFloat("Speed", Mathf.Abs(GetComponent<Rigidbody2D>().velocity.x));
    if (GetComponent<Rigidbody2D>().velocity.x > 0)
        transform.localScale = new Vector3(1f, 1f, 1f);
    else if (GetComponent<Rigidbody2D>().velocity.x < 0)
        transform.localScale = new Vector3(-1f, 1f, 1f);
    
}

void Jump(){
    GetComponent<Rigidbody2D>().velocity = new Vector2(0, jumpHeight);
}

}

Daje wszystko w razie czego (nie mogłem szybciej odpisać)


#12

Obejrzyj jeszcze raz tutorial, na podstawie którego robisz tą scenę: Jak postać jest w powietrzu (!grouned) to wyłącz obsługę klawiszy ruchu lewo / prawo (D/A).


#13

Problem powinno rozwiązać dodanie obiektom materiału z ustawionym tarciem na 0.


#14

@tanku Nie zgodziłbym się. Wyobrażasz sobie Super Mario z takim rozwiązaniem? :stuck_out_tongue: