C# / Unity: Wie macht man ein Player Movement Script, bei dem der Charakter sich in die Richtung bewegt, in die er schaut?
Ich habe eine Kamerarotation gemacht (nur auf der x-Achse). Derweil ist das der Code mit dem ich den Charakter bewege:
public class PlayerMovement : MonoBehaviour
{
public Rigidbody rb;
public float forwardForce = 2000f;
public float sidewaysForce = 500f;
public int forceConst = 50;
public float forward = 500f;
public GameObject completeLevelUI;
public bool isGrounded;
public Vector3 RotateAmount;
void Start()
{
}
void OnCollisionStay()
{
isGrounded = true;
}
// Update is called once per frame
void FixedUpdate()
{
if (Input.GetKey("e"))
{
completeLevelUI.SetActive(false);
}
if (Input.GetKey("w"))
{
rb.AddForce(0, 0, forward * Time.deltaTime, ForceMode.VelocityChange);
}
if (Input.GetKey("s"))
{
rb.AddForce(0, 0, -forward * Time.deltaTime, ForceMode.VelocityChange);
}
if (Input.GetKey("d"))
{
rb.AddForce(sidewaysForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}
if (Input.GetKey("a"))
{
rb.AddForce(-sidewaysForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}
if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
{
rb.AddForce(new Vector3(0, forceConst, 0), ForceMode.Impulse);
isGrounded = false;
}
}
}
Jetzt möchte ich aber, dass, wenn ich z.B. nach hinten schaue, dass, wenn ich w drücke, er sich in die Richtung bewegt, in die ich schaue.
2 Antworten
Mit Transform.forward (Unity Scripting API) bekommst du die "Vorwärts"-Richtung eines Objekts, indem die Rotation des Objekts berücksichtigt wird. Wenn du diesen Vektor umdrehst, dann hast du die Richtung, in die sich dein Charakter bewegen soll.
Damit das so funktioniert, wie du dir das vorstellst, muss aber der Charakter mit der Kameradrehung synchronisiert werden. Wo die Kamera hinschaut, da muss auch der Charakter hinschauen.
Alternativ, wenn du deinen Charakter nicht permanent in die Richtung drehen möchtest, in die die Kamera zeigt, kannst du den Transform.forward deiner Kamera nehmen, um den Spieler zu bewegen. Da musst du gegebenenfalls den Vektor anpassen, weil die Kamera vermutlich eine Rotation hat, aber es sollte reichen, um die Richtung zu bekommen, in die sich der Spieler bewegen soll.
Verstehst du denn, was da steht? Es ist fast schon selbsterklärend. Wenn du dir die Dokumentation von Rigidbody.AddForce anschaust, dann siehst du dort, dass der Parameter force darüber entscheidet, in welche Richtung die Bewegung hinzugefügt wird. Du musst also das, was du für diesen Parameter übergibst, so gestalten, dass es in deine gewünschte Richtung geht. Ansätze dafür habe ich dir in meiner ersten Antwort gegeben.
geht auch mit „rb.AddRelstiveForce“
also gehen wir von diesem movement script aus:
if (Input.GetKey("w"))
{
rb.AddForce(0, 0, forward * Time.deltaTime, ForceMode.VelocityChange);
}
wo müsste ich das einsetzen?