Was ich machen möchte, ist eine Art 2,5D Runner Spiel in Unity zu machen, in dem die drei Rotationsachsen des Charakters eingefroren sind und die Position auf Die Z-Achse ist ebenfalls eingefroren. Ich weiß nicht, wie ich den Charakter auf der Wippe schön vorwärts bewegen kann. (Ich erstelle die Wippe mit HingeJoint.)Unity3D - Mach Charakter, der sich auf einer Wippe in einem 2.5D Runner Spiel vorwärts bewegt
Ich erstellen eine Struktur, um den CapsuleCollider-Status zu erkennen, mithilfe der Physics.Raycast() - Funktion, und das funktioniert einwandfrei.
private struct ColliderStatus
{
public bool headed; //colliding up
public bool footed; //colliding down
public bool onPlane; //colliding down && the obstacle colliding does not have slope angle
public bool lefted; //colliding left
public bool righted; //colliding right
public bool inAir; //not colliding anything
}
Ich habe diese Art und Weise versucht:
In Kraft auf Starrkörper, um vorwärts
//To move character rigidbody move forward automatically in runner game //when the speed is lower than the minimum speed and it's on plane or in air. if (rigidbody.velocity.x < minForwardSpeed && (colliderStatus.onPlane || colliderStatus.inAir)) { rigidbody.AddForce(20f * Vector3.right); } //Add gravity to player Vector3 gravityForce = new Vector3(0f, -gravityOnPlayer, 0f); rigidbody.AddForce(gravityForce);
Es funktioniert nicht gut zu bewegen, weil der Charakter steigen weiter wenn es auf der Wippe ist, beginnt die Wippe zu kippen. Und es wird einen Geschwindigkeitsverlust geben, wenn der Charakter von einer höheren Ebene oder nach dem Springen auf den Boden fällt und wie es aussieht, dass der Charakter für einen kleinen Moment auf dem Landepunkt betäubt wird und dann zu beschleunigen beginnt.
Verwendung transform.Translate(), um vorwärts & & Änderung der Art und Weise zu bewegen Schwerkraft Zugabe
//Use transform.Translate() to move forward //I recognize that by this way, there will be no velocity loss //when the character falling down to the ground at the landing point //If I don't use this condition, my character will stuck on the //right vertical wall if (!colliderStatus.righted) { transform.Translate(new Vector2(minForwardSpeed, 0f) * Time.deltaTime); }
Ich weiß nicht, warum ich kann‘ t so schreiben, da es die Geschwindigkeit verursacht reagiert nicht richtig:
//Use transform.Translate() to move forward
if (!colliderStatus.righted && rigidbody.velocity.x < minForwardSpeed)
{
transform.Translate(new Vector2(minForwardSpeed, 0f) * Time.deltaTime);
}
Um die Art und Weise zu ändern, die Schwerkraft des Hinzufügens, verwende ich ein functi auf SlopeAngleVector(), um den Steigungsvektor zu berechnen, auf dem das Zeichen läuft.
private Vector3 SlopeAngleVector()
{
Vector3 nextStepPositon = new Vector3(transform.position.x + 0.01f, transform.position.y, 0f);
Ray nextPosRay = new Ray(nextStepPositon, Vector3.down);
Ray nowPosRay = new Ray(transform.position, Vector3.down);
RaycastHit nextPosHit;
RaycastHit nowPosHit;
Vector3 slopeAngle = Vector3.zero;
Physics.Raycast(nowPosRay, out nowPosHit, 5f, obstaclesLayerMask);
if (Physics.Raycast(nextPosRay, out nextPosHit, 5f, obstaclesLayerMask))
{
slopeAngle = new Vector3(nextPosHit.point.x - nowPosHit.point.x, nextPosHit.point.y - nowPosHit.point.y, 0f).normalized;
}
return slopeAngle;
}
Dann füge ich die Schwerkraft durch berechnen auf der Steigung Vektor die Schwere Projektion:
private void AddGravity()
{
Vector3 gravityForce = new Vector3(0f, -gravityOnPlayer, 0f);
//my character could be collided by the long vertical wall(colliderStatus.righted)
//so I set the condition as "!colliderStatus.footed"
//otherwise, I would use "colliderStatus.inAir"
if (!colliderStatus.footed)
{
gravityForce = new Vector3(0f, -gravityOnPlayer, 0f);
}
else
{
gravityForce = Vector3.Project(Vector3.down * gravityOnPlayer, SlopeAngleVector());
}
rigidbody.AddForce(gravityForce);
}
Jetzt kann mein Charakter aus der Wippe nach unten rutschen, aber es wird halten rückwärts gehen. Und es kann nicht durchkommen, wenn es auf dem niedrigen Hangwinkel wippt.
Wie man ein gutes Verhaltenskript für den Läufer auf Wippe macht?
Haben Sie versucht, die Geschwindigkeit zu ändern, anstatt Kraft hinzuzufügen? –