Box collider funktioniert nicht mit rb.MovePosition?
Ich habe mit Unity angefangen und habe ein kleines problem:
Und zwar habe ich eine kamera mit boxcollider und einen terrain mit terraincollider. Nur leider kann ich die kamera durch das terrain durchschieben! Ich habe schon den verdacht dass es an rb.MovePosition liegt aber weiß nicht wie ich das reparieren kann! Alles wie zumbeispiel rigidbody sind auf der kamera da bin ich mir sicher! Es kommt auch kein Fehler in der Konsole!
Mein Kompletter code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SmoothMove : MonoBehaviour
{
public float rotationSpeed = 2.0f;
public float smoothRotationFactor = 5.0f;
private float yaw = 0.0f;
private float pitch = 0.0f;
public float jumpForce = 10.0f;
public float moveSpeed = 20.0f;
private Rigidbody rb;
private bool isMovingForward = false;
private void Start()
{
rb = GetComponent<Rigidbody>();
}
private void Update()
{
HandleCameraRotation();
if (Input.GetKeyDown(KeyCode.Space))
{
Jump();
}
if (Input.GetKeyDown(KeyCode.UpArrow))
{
StartMovingForward();
}
if (Input.GetKeyUp(KeyCode.UpArrow))
{
StopMovingForward();
}
if (isMovingForward)
{
MoveForward();
}
}
private void HandleCameraRotation()
{
if (Input.GetMouseButton(0))
{
yaw += rotationSpeed * Input.GetAxis("Mouse X");
pitch -= rotationSpeed * Input.GetAxis("Mouse Y");
Quaternion targetRotation = Quaternion.Euler(pitch, yaw, 0.0f);
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, Time.deltaTime * smoothRotationFactor);
}
}
private void Jump()
{
rb.velocity = new Vector3(rb.velocity.x, rb.velocity.y + 5, rb.velocity.z);
}
private void StartMovingForward()
{
isMovingForward = true;
}
private void StopMovingForward()
{
moveSpeed = 20f;
isMovingForward = false;
}
private void MoveForward()
{
moveSpeed += 0.1f;
Vector3 forwardDirection = transform.forward;
forwardDirection.y = 0.0f; // Keep movement on the horizontal plane
rb.MovePosition(rb.position + forwardDirection * moveSpeed * Time.deltaTime);
}
}
Ich würde mich sehr freuen wenn ihr mir helft. Danke :)
1 Antwort
In Unity ist die `rb.MovePosition()` Methode dafür bekannt, dass sie manchmal Kollisionen nicht so gut behandelt wie die Standardphysik. Der Grund dafür ist, dass `rb.MovePosition()` die Position des Objekts "teleportiert", anstatt die Physik-Engine zur Bewegung zu verwenden.
Eine Möglichkeit, das Problem zu umgehen, wäre die Verwendung von `rb.AddForce()` anstelle von `rb.MovePosition()` für die Bewegung. Dadurch wird die Physik-Engine mehr in den Prozess einbezogen, und Kollisionen sollten korrekter behandelt werden.
Ein weiterer Ansatz könnte sein, sicherzustellen, dass die `Interpolation`-Einstellung für das `Rigidbody`-Objekt auf `Interpolate` oder `Extrapolate` gesetzt ist. Das könnte dazu beitragen, Kollisionen bei der Verwendung von `rb.MovePosition()` glatter zu machen.
Hoffentlich hilft dir einer dieser Tipps weiter!
Ja, `rb.AddForce()` verhält sich anders als `rb.MovePosition()`. Es fügt eine Kraft hinzu, die im Laufe der Zeit wirkt, anstatt die Position direkt zu ändern. Deshalb könnte die Bewegung unerwartet sein.
Du könntest dennoch versuchen, die Methode `rb.velocity` direkt zu setzen, was die Physik-Engine besser berücksichtigt als `rb.MovePosition()`.
Beispiel:
rb.velocity = forwardDirection * moveSpeed;
Denke daran, diese Zeile in der `FixedUpdate()` Methode zu platzieren, da `Rigidbody`-Operationen am besten in `FixedUpdate` behandelt werden.
Wenn du `rb.velocity` verwendest, musst du den Geschwindigkeitsvektor möglicherweise anpassen, um sicherzustellen, dass er in der richtigen Richtung und mit der richtigen Geschwindigkeit wirkt.
Interpolate und Extrapolate hat nicht funktioniert und bei "AddForce()" werde ich in eine Richtung geschleudert die erstens nicht stimmt und zweitens flieg ich aus dem terrain ins nichts. Vieleicht stimmt an den Berechnungen irgendwas nicht ganz.