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ół?
Unity 2D kolizja
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.
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
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.
Dzieki za pomoc, ale myślę, że nie mam takiego doświadczenia, do poradzenia sobie samemu.
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ć)
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).