Unity: Sprung verbessern?
https://www.youtube.com/watch?v=fSA0z6qmyR8
Ich hätte eine Frage: Wie mache ich es, dass ich in meinem Unity-Projekt (2D RPG) die Sprungfunktion flüssiger mache. Also, sodass ich bestimmen kann, dass sich der Charakter schneller nach oben und unten bewegt.
Ich habe außerdem das Problem, dass, wenn ich nach rechts oder links springe, aber an einem Collider komme, der Charakter an dem Collider hängen bleibt. Wie behebe ich das, dass eben der Charakter dann nur am Collider ankommt, aber dann direkt nach unten fällt und nicht solange hängen bleibt, bis ich aufhöre, gegen den Collider zu gehen?
Code des PlayerController:
public class PlayerController : MonoBehaviour
{
public float moveSpeed;
private Animator anim;
private Rigidbody2D playerRigidbody;
private bool playerMoving;
private bool playerJumping;
[SerializeField]
private float jumpVelocity;
[SerializeField]
private LayerMask platformsLayerMask;
private Rigidbody2D rigidbody2d;
private BoxCollider2D boxCollider2d;
// Start is called before the first frame update
void Start()
{
anim = GetComponent<Animator>();
playerRigidbody = GetComponent<Rigidbody2D>();
boxCollider2d = transform.GetComponent<BoxCollider2D>();
}
// Update is called once per frame
void Update()
{
playerMoving = false;
playerJumping = false;
if (Input.GetAxisRaw("Horizontal") > 0.5f || Input.GetAxisRaw("Horizontal") < -0.5f)
{
playerRigidbody.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * moveSpeed, playerRigidbody.velocity.y);
playerMoving = true;
}
if (Input.GetAxisRaw("Horizontal") < 0.5f && Input.GetAxisRaw("Horizontal") > -0.5f)
{
playerRigidbody.velocity = new Vector2(0f, playerRigidbody.velocity.y);
}
anim.SetFloat("MoveX", Input.GetAxisRaw("Horizontal"));
anim.SetBool("PlayerMoving", playerMoving);
anim.SetBool("PlayerJumping", playerJumping);
if (IsGrounded() && Input.GetKeyDown(KeyCode.Space))
{
// jumpVelocity = 8.8f;
playerRigidbody.velocity = Vector2.up * jumpVelocity;
}
}
private bool IsGrounded()
{
float extraheight = .5f;
RaycastHit2D raycastHit = Physics2D.BoxCast(boxCollider2d.bounds.center, boxCollider2d.bounds.size, 0f, Vector2.down, extraheight, platformsLayerMask);
Color rayColor;
if (raycastHit.collider != null)
{
rayColor = Color.green;
}
else
{
rayColor = Color.red;
}
//Debug.DrawRay(boxCollider2d.bounds.center, Vector2.down * (boxCollider2d.bounds.extents.y + extraheight), rayColor);
//Debug.Log(raycastHit.collider);
return raycastHit.collider != null;
}
}
2 Antworten
Hey!
Die Antwort kommt zwar ein bisschen spät, aber vielleicht kannst du ja trotzdem was damit anfangen ;)
Zum besseren Sprung: https://www.youtube.com/watch?v=7KiK0Aqtmzc
Das Problem, dass man an Seitenkanten hängen bleibt, ist ein Klassiker. Am einfachsten kannst du das beheben, wenn du dem Player oder der Plattform ein Material gibst, das keine Reibung hat. Das kann manchmal zur Folge haben, dass der Player anfängt zu rutschen, wenn er aus der Bewegung zum Stillstand kommt, aber bei deiner aktuellen Implementierung sollte das eigentlich nicht passieren.
Habe mit Unity selbst noch nicht programmiert. Folglich basieren meine Infos mehr auf schlauem raten anhand deine Codes und anhand von eigenen ideen:
Zum Collider:
Du wirst sicherlich irgendwo eine Funktion haben, dei die Kollision handelt. In der bewegst du den Charakter einfach minimal vom Kollider weg(, wenn es sich nicht um einen Bodenkollider handelt?). Dadurch bleibtd er Charakter nicht hängen.
Zur Sprunggeschwindigkeit:
Ich sehe in deinem Code jetzt nichts, mit dem du einen Sprung auslöst, lediglich auskommentierten Code.
Ich vermute aber, du wirst eine Sprunganimation starten wollen, die die Spielergeschwindigkeit in y-Richtung animiert.
Bzw.: Eigentlich läuft das so ab, dass du die Spielergeschwindigkeit in y-Richtung standardmäßi in jedem Updatschritt verringerst, bei Groundkollisionen aber entsprechend weider erhöst.
Für einen Sprung müsstest du dnan nur für eine bestimmte Zeit(x Update schritte) eine beschleunigung in positive y-Richtung einbauen.
Wie du das machst, kann ich dir nicht sagen, da ich keine Ahnung von Unity habe.
Das mit der Animation war mehr ein Zwischengedanke. relevanter ist die Ausführung hinter "Bzw.".
es ist der collider vom boden...wie mache ich es in dem Fall??...und was meinst du mit der Animation? was die animation angeht...diese hat ja eigentlich nix mit dem collider zu tun...weil ja nicht die animation sondern der Collider des Spielerst bewegt wird...