2016-12-29 3 views
3

Ich arbeite gerade an einem Spiel, in dem ich Click verwende, um mich in Unity zu bewegen. Wenn ich auf eine Stelle auf der Karte klicke, setze ich den Mausklick auf das Ziel und verwende dann rigidBody auf dem Spielobjekt, um es mit RigidBody.MovePosition() zu bewegen. Wenn ich das mache, bekomme ich viel Flickern, wenn das Spielobjekt sein Ziel erreicht. Jede Hilfe wird geschätzt. Vielen Dank.Unity3D RigidBody MovePosition Flicker

// COMPONENTS 
Rigidbody rigidBody; 

// MOVEMENT 
Vector3 destination; 
Vector3 direction; 

// Use this for initialization 
void Start() 
{ 
    rigidBody = GetComponent<Rigidbody>(); 
    destination = transform.position; 
} 

// Update is called once per frame 
void Update() 
{ 
    DetectInput(); 
} 

void FixedUpdate() 
{ 
    MoveControlledPlayer(); 
} 

void MoveControlledPlayer() 
{ 

    transform.LookAt(destination); 
    Vector3 direction = (destination - transform.position).normalized; 
    rigidBody.MovePosition(transform.position + direction * 5 * Time.deltaTime); 
} 

void DetectInput() 
{ 
    if (Input.GetMouseButton(0)) 
    { 
     SetDestination(); 
    } 
} 

void SetDestination() 
{ 
    if (!EventSystem.current.IsPointerOverGameObject()) 
    { 
    Plane field = new Plane(Vector3.up, transform.position); 
    Ray ray; 
    float point = 0; 

    ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

    if (field.Raycast(ray, out point)) 
     destination = ray.GetPoint(point); 

    } 
} 
+0

Ihr Ziel ist ein Punkt. Es ist also schwer, die exakt gleiche Position zu erreichen. Sie sollten einen Code hinzufügen, der den Fall verwaltet, wenn Ihr Ziel wirklich, sehr nahe an Ihrem Objekt liegt. – Greg

+1

Danke. Das hat für mich funktioniert. Einfache und einfache Lösung. Sehr geschätzt. – user3623692

Antwort

0

einen Punkt erreicht, wenn eine Geschwindigkeit basiertes Verhalten verwendet, ist wirklich hart, und führt oft zu Flimmern: das ist, weil das Objekt immer über sein Ziel vorbei ist.

Eine Möglichkeit, das Problem zu beheben, besteht darin, die Bewegung zu stoppen, wenn das Objekt nahe genug am Ziel ist.

1

Ich mache diese Art von Bewegungen mit temporäre Gelenke. Sie sind extrem genau/konfigurierbar/integrierbar.

In 2D verwende ich einen DistanceJoint2D Abstand zwischen Starrkörperstellen zu kontrollieren, oder zwischen einem Körper und einem Weltpunkt. In 3D können Sie SpringJoint oder ConfigurableJoint verwenden.

Dann tweenen nur die Strecke im Grunde auf die gleiche Weise pro Frame jetzt tun zu bewegen (auf FixedUpdate).