2017-01-17 2 views
1

Ich habe einen Ball auf einer Plattform stehen und ich habe Code geschrieben, so dass jedes Mal, wenn ich nach oben wische, der Ball von einer Plattform zur anderen springt, abhängig von der Kraft des Wischens. Im Moment sind meine Plattformen nur von mir selbst positioniert und ich habe kein Skript für ihre zufällige Generation. Das einzige Skript, das ich habe, ist auf dem Player zum Wischen und Vorwärtsbewegen.unity So wischen Sie die Sprungbewegung mit Add Force.

Momentan mache ich diese Bewegung durch Hinzufügen von Kraft in zwei Richtungen, nach oben und nach vorne, um die Projektilbewegung zu erzeugen. Es funktioniert wie es auch angenommen wird, aber die Bewegung ist zu langsam. Ich möchte, dass es sich schneller bewegt. Ich habe versucht, mit den Kräften und der Masse des Balls zu spielen. Sie machen einen Unterschied, aber ich möchte immer noch, dass sich der Ball etwas schneller bewegt.

Ist das Hinzufügen von Kraft der beste Weg, dies zu tun? Oder würdest du einen anderen Weg empfehlen?

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class SwipeScript : MonoBehaviour { 
public float maxTime; 
public float minSwipeDist; 

float startTime; 
float endTime; 

Vector3 startPos; 
Vector3 endPos; 
float swipeDistance; 
float swipeTime; 

// Use this for initialization 
void Start() 
{ 

} 

// Update is called once per frame 
void Update() 
{ 

    if (Input.touchCount > 0) 
    { 
     Touch touch = Input.GetTouch(0); 

     if (touch.phase == TouchPhase.Began) 
     { 
      startTime = Time.time; 
      startPos = touch.position; 
     } 
     else if (touch.phase == TouchPhase.Ended) 
     { 
      endTime = Time.time; 
      endPos = touch.position; 

      swipeDistance = (endPos - startPos).magnitude; 
      swipeTime = endTime - startTime; 

      if (swipeTime < maxTime && swipeDistance > minSwipeDist) 
      { 
       swipe(); 
      } 
     } 
    } 
} 

public void swipe() 
{ 
    Vector2 distance = endPos - startPos; 

    if (Mathf.Abs(distance.y) > Mathf.Abs(distance.x)) 
    { 
     Debug.Log("Swipe up detected"); 
     jump(); 
    } 

} 
private void jump() 
{ 
    Vector2 distance = endPos - startPos; 
    GetComponent<Rigidbody>().AddForce(new Vector3(0, Mathf.Abs(distance.y/5), Mathf.Abs(distance.y/5))); 
} 

private void OnCollisionEnter(Collision collision) 
{ 
    if (collision.gameObject.name == "Cube (1)") { 
     Debug.Log("collision!"); 
     GetComponent<Rigidbody>().velocity = Vector3.zero; 
     GetComponent<Rigidbody>().angularVelocity = Vector3.zero; 
    } 
} 

}

why is the ball shadow so pixelated by the way?

+1

Nur ein kurzer Tipp zum Thema: Speichern Sie Ihren Rigidbody in 'Start()', damit Sie GetComponent nicht jedes Mal verwenden müssen, wenn Sie es verwenden möchten, was nicht sehr optimiert ist. Es wird auch Ihren Code sauberer machen. 'Starrkörper rb; Start() {rb = GetComponent (); } 'und dann rb anstelle von GetComponent im Rest des Skripts verwenden. Sie könnten theoretisch die Zeitskala ('Time.timeScale = 2') erhöhen, um die Geschwindigkeit zu verdoppeln. Aber ich empfehle es nicht. Wenn Sie möchten, dass sich der Ball schneller bewegt, fügen Sie mehr Kraft hinzu und erhöhen den Widerstand. https://docs.unity3d.com/ScriptReference/Rigidbody-drag.html – Maakep

+0

Wenn irgendeine Antwort Ihr Problem löste, denken Sie bitte darüber nach, es als das Richtige zu akzeptieren. _ (Annahme einer Antwort hilft zukünftigen Besuchern, auf diese Seite zu kommen) _ – Kardux

Antwort

1

ich meine Antwort schrieb, als ich @Fredrik Kommentar bemerkt: so ziemlich alles, sagte er war das, was ich geschrieben habe, so werde ich es einfach überspringen! (ich empfehle nicht auch Time.timeScale steigend)

Die andere Art und Weise Sie Ihren Ball ballistischen Gleichungen bewegen konnte und Einstellung Ihrer Starrkörper zu Kinematic würde werden. Auf diese Weise können Sie die Ballgeschwindigkeit über den Code RigidBody.MovePosition() steuern und trotzdem OnCollision[...] Ereignisse erhalten.

Auch als Randnotiz empfehle ich collision.gameObject.name nicht für die Kollisionsobjekt-Prüfung, sondern eher für das Markieren Ihrer Cubes oder sogar das Setzen ihrer Layer auf einen bestimmten (aber ich nehme an, das könnte temporärer Code von Ihnen sein;)).

hoffe, das hilft,

+0

Danke für die Antwort, das ist nur scrapy Code, um das Gefühl für das Projekt zu bekommen, bevor ich anfange richtig zu kodieren, idealerweise würde ich Oncollision nicht benutzen, aber wie Sie Tags mit sagten auftriggern. Nur aus Neugier, warum bevorzugst du lieber die zweite als die Oncollision. Zweitens, keiner von euch sagte etwas wie, die Swipe-Eingabe und dann einfach mit dem, um die Transformation Positionen zu einigen, wie Projektil Bewegung aussehen. Gibt es einen Grund, warum ihr so ​​etwas nicht gesagt habt? Ist es weil es hässlich ist? oder dass mit addforce/rigidbody.moveposition sind besser? und warum? –

+0

noch eine Frage, hast du eine Idee, warum mein Spieler Schatten so pixelig aussieht? Ich habe meine Build-Einstellungen für Android.hat es etwas mit Auflösung usw. zu tun oder gibt es eine Inspektor-Einstellung, die ich vermasselt habe? –

+0

Über deine erste Frage: Wenn du die 'transform.position' manuell änderst, sind die Chancen, mit Unity Physics zu arbeiten, sehr hoch (du kannst zum Beispiel ein' OnTriggerEnter'/'OnCollisionEnter' Ereignis leicht verpassen), deshalb ist es sehr hoch empfehlen (ich könnte sogar sagen, dass es verboten ist), dies zu tun;) Über Ihre zweite Frage: Ich erinnere mich, jemand fragte es kürzlich auf SO, ich denke, Sie müssen mit Schatten Einstellungen (weich/hart, Auflösung, Entfernung, etc ... spielen)) – Kardux

0

Entweder ForceMode.VelocityChange als zweiten Parameter zu AddForce passieren, oder stellen Sie sicher, Ihre Vektor durch Time.fixedDeltaTime teilen (die die Wirkung der Multiplikation hat, weil Time.fixedDeltaTime geringer sein wird als 1).

Verwandte Themen