Banenchen Geschrieben 23. Januar 2022 Melden Share Geschrieben 23. Januar 2022 Ich habe ein script bei dem sich mein characktär bewegt aber die groundet funktion funktioniert nicht bitte helft mir using System.Collections; using System.Collections.Generic; using UnityEngine; public class CharackterController2D : MonoBehaviour { // Move player in 2D space public float maxSpeed = 3.4f; public float jumpHeight = 6.5f; public float gravityScale = 1.5f; public Camera mainCamera; bool facingRight = true; float moveDirection = 0; public bool isGrounded = false; Vector3 cameraPos; Rigidbody2D r2d; CapsuleCollider2D mainCollider; Transform t; // Use this for initialization void Start() { t = transform; r2d = GetComponent<Rigidbody2D>(); mainCollider = GetComponent<CapsuleCollider2D>(); r2d.freezeRotation = true; r2d.collisionDetectionMode = CollisionDetectionMode2D.Continuous; r2d.gravityScale = gravityScale; facingRight = t.localScale.x > 0; if (mainCamera) { cameraPos = mainCamera.transform.position; } } // Update is called once per frame void Update() { // Movement controls if ((Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) && (isGrounded || Mathf.Abs(r2d.velocity.x) > 0.01f)) { moveDirection = Input.GetKey(KeyCode.A) ? -1 : 1; } else { if (isGrounded || r2d.velocity.magnitude < 0.01f) { moveDirection = 0; } } // Change facing direction if (moveDirection != 0) { if (moveDirection < 0 && !facingRight) { facingRight = true; t.localScale = new Vector3(Mathf.Abs(t.localScale.x), t.localScale.y, transform.localScale.z); } if (moveDirection > 0 && facingRight) { facingRight = false; t.localScale = new Vector3(-Mathf.Abs(t.localScale.x), t.localScale.y, t.localScale.z); } } // Jumping if (Input.GetKeyDown(KeyCode.Space) && isGrounded) { r2d.velocity = new Vector2(r2d.velocity.x, jumpHeight); } // Camera follow if (mainCamera) { mainCamera.transform.position = new Vector3(t.position.x, cameraPos.y, cameraPos.z); } } void FixedUpdate() { Bounds colliderBounds = mainCollider.bounds; float colliderRadius = mainCollider.size.x * 0.4f * Mathf.Abs(transform.localScale.x); Vector3 groundCheckPos = colliderBounds.min + new Vector3(colliderBounds.size.x * 0.5f, colliderRadius * 0.9f, 0); // Check if player is grounded Collider2D[] colliders = Physics2D.OverlapCircleAll(groundCheckPos, colliderRadius); //Check if any of the overlapping colliders are not player collider, if so, set isGrounded to true isGrounded = false; if (colliders.Length > 0) { for (int i = 0; i < colliders.Length; i++) { if (colliders[i] != mainCollider) { isGrounded = true; break; } } } // Apply movement velocity r2d.velocity = new Vector2((moveDirection) * maxSpeed, r2d.velocity.y); // Simple debug Debug.DrawLine(groundCheckPos, groundCheckPos - new Vector3(0, colliderRadius, 0), isGrounded ? Color.green : Color.red); Debug.DrawLine(groundCheckPos, groundCheckPos - new Vector3(colliderRadius, 0, 0), isGrounded ? Color.green : Color.red); } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 23. Januar 2022 Melden Share Geschrieben 23. Januar 2022 Hallo "funktioniert nicht" ist echt eine miese Fehlerbeschreibung. Was willst du? Was passiert? Was hast du bereits probiert? Ist das dein Code? Christoph Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Banenchen Geschrieben 23. Januar 2022 Autor Melden Share Geschrieben 23. Januar 2022 ich möchte dass ich nur einmal springen kann bis ich wieder auf dem boden bin ich kann mehrmals springen es ist zur helfte mein code ich hab den vor ein paar wochen bei einem tutorial gemacht(ich kenn leider den youtuber name nicht) Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Singular Geschrieben 28. Januar 2022 Melden Share Geschrieben 28. Januar 2022 Ich verstehe nicht ganz warum du die Collider aus der nähe abfragen musst um festzustellen ob dein Char Grounded ist. In dem Moment wo er Bodenkontakt hat setzt du is Grounded aus True und wenn er springt oder den Bodenkontakt verliert (onCollissionExit) auf false. Derzeit ist die Abfrage nur: ist ein anderer Collider in der nähe ist der Char grounded. Egal ob das ein Gegner oder was auch immer ist. Das einzige was du raus nimmst ist der Spieler selbst. Das ist ja okay. Was für ein Wert kommt denn bei dem ColliderRadius heraus? Vielleicht ist das viel zu groß wodurch jeder Boden direkt im Bereich liegt und dadurch der Spieler immer springen kann. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.