2016-05-19 8 views
0

Ich habe ein Skript geschrieben, um ein Objekt über Raycast in Positionen auf einem Gelände zu bewegen, aber ich kann nicht für das Leben von mir scheinen, diese Bewegung glatt zu machen. Ich habe alle möglichen Dinge ausprobiert, um das herauszufinden (wie Sie wahrscheinlich an der Menge des auskommentierten Codes unten sehen können); Deaktivieren verschiedener Starrkörpervariablen, jedoch ohne Erfolg.Glatte Raycast Positionierung

Ein Ansatz, der (irgendwie) funktionierte, war das Deaktivieren des Colliders, der an dem Objekt angebracht war, was jedoch dazu führte, dass das Objekt versehentlich unter das Terrain sank.

Kann mir bitte jemand empfehlen, wie der beste Weg zu gehen wäre? Ich denke, das sollte sehr einfach sein, aber ich bin damit fertig, es zu verkomplizieren.

  //Move 
     if (Input.GetKey(KeyCode.E)) { 
      //   if (Input.GetKeyDown(KeyCode.E)) 
      //   { 
      //    modObj.GetComponent(BoxCollider).enabled = false;    
      initPos = modObj.transform.position; 
      var initRotation = modObj.transform.rotation; 
      //   } 
      //    
      //   modObj.GetComponent(Rigidbody).isKinematic = true; 
      //   modObj.GetComponent(Rigidbody).useGravity = false; 

      moveObject(modObj, initPos, initRotation); 
     } else { 
      //   modObj.GetComponent(BoxCollider).enabled = true; 
      //   modObj.GetComponent(Rigidbody).isKinematic = false; 
      //   modObj.GetComponent(Rigidbody).useGravity = true; 
     } 
function moveObject(modObj: GameObject, initPos: Vector3, initRotation: Quaternion) { 
    //Debug.Log("Moving Object"); 

    var hit: RaycastHit; 
    var foundHit: boolean = false; 

    foundHit = Physics.Raycast(transform.position, transform.forward, hit); 
    //Debug.DrawRay(transform.position, transform.forward, Color.blue); 

    if (foundHit && hit.transform.tag == "Terrain") { 
    modifyObjGUIscript.activateMoveDisplay(initPos, hit.point); 

    //  var meshHalfHeight = modObj.GetComponent.<MeshRenderer>().bounds.size.y /2; //helps account for large and small objects 

    modObj.transform.position = hit.point; //***method 01*** 
    //  modObj.transform.position = Vector3.Lerp(initPos, hit.point, speed); //***method 02*** 
    //  modObj.transform.position = Vector3.SmoothDamp(initPos, hit.point, velocity, smoothTime); //***method 02*** 

    //  modObj.transform.position.y = modObj.transform.position.y + meshHalfHeight + hoverHeight; 

    modObj.transform.rotation = initRotation; 
    } 
} 

Antwort

1

Sie müssen die moveobject aufrufen, die Position sehr häufig neu zu berechnen - für jeden Rahmen, wenn möglich. Zum Beispiel von Update oder von Coroutine:

void Update() 
{ 
    modObj.transform.position = Vector3.Lerp(initPos, hit.point, speed); 
} 


IEnumerator MoveObject(Vector3 initPos, Vector3 endPos, float speed) 
{ 
    while (initPos != endPos) 
    { 
    modObj.transform.position = Vector3.Lerp(initPos, endPos, speed); 
    yield return null; 
    } 
} 
+0

Rechts auf. Beachten Sie auch, dass Sie dies oft tun: Sie haben einen neuen unabhängigen Marker (dh ein leeres GameObject) namens say "Tracker". Aber ein kleiner weißer Würfel für Entwicklungszwecke, damit du es sehen kannst. Setze Jorels Skript auf Tracker (NICHT AUF DEINEM AKTUELLEN FLUGZEUG). Lassen Sie den Benutzer steuern, usw., Tracker. Als nächstes müssen Sie Ihr Flugzeug tatsächlich verfolgen Tracker überall *. Auf diese Weise können Sie * die Bewegung auf Y * für das Flugzeug glätten; Es ist oft einfacher und logischer, dies zu tun. – Fattie

+0

@joreldraw Sorry sollte in meinem Post klarer gewesen sein: Die 'moveObject()' Funktion wird von der 'Input.GetKey (KeyCode.E)' innerhalb einer 'FixedUpdate()' aufgerufen; Passt das zu dem, was du sagst? Ich habe auch die Positionierung von der Verwendung der Transformation des Objekts zur Verwendung seiner starren Körper geändert: 'var movRb = modObj.GetComponent. (); ' ' movRb.position = Vector3.Lerp (initPos, hit.point, Geschwindigkeit); ' wie einige andere Rückmeldungen, die ich erhalten habe. Dies hat sicherlich geholfen, aber das Problem nicht gelöst. Jede weitere Rückmeldung wird sehr geschätzt. –

+0

versuchen, die coroutine mit einer while-bedingung aufzurufen, ich bearbeite die coroutine dafür. – joreldraw