2017-02-24 3 views
0

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:

  1. 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.

  1. 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?

+0

Haben Sie versucht, die Geschwindigkeit zu ändern, anstatt Kraft hinzuzufügen? –

Antwort

0

Ich würde vorschlagen, einige der Standard-Asset-Charakter-Controller von Unity zu betrachten, ich glaube, dass sie Neigungen für ihre Charakterbewegung berücksichtigen. Es kann Ihnen einige Ideen geben.

Ich würde auch empfehlen, die Art zu ändern, wie Ihr Code den Neigungswinkel berechnet. Der Raycast-Treffer gibt Ihnen eine Oberflächennormale zurück. Sie sollten dann in der Lage sein, den Vector3.Cross zu verwenden, um den Neigungswinkel herauszufinden.

Es wird etwas wie: Vector3.Cross (normal, (Vektor, der vom Bildschirm weg zeigt)).

Sie müssen es möglicherweise optimieren, damit es richtig funktioniert, aber dies kann Ihnen den Neigungswinkel in einem Raycast geben. Es kann auch potentielle Probleme Ihrer Bewegung zu Position unter der Wippe zu beseitigen.

Als einen allgemeinen Tipp, versuchen Sie nicht, Transform und Starrkörper zu mischen, wenn Sie den Starrkörper bewegen möchten, bewegen Sie den Starrkörper direkt, nicht indirekt durch die Transformation.

Verwandte Themen