2016-05-12 15 views
1

Ich habe ein Skript geschrieben, in dem ein Spielobjekt zu einem von der Player-Kamera geworfenen raycast.point verschoben werden soll. Zum größten Teil funktioniert das gut, jedoch gibt es Zeiten (ungefähr wenn die Kamera 45 Grad von dem Objekt entfernt ist), wenn sich das Objekt schnell in Richtung der Kamera bewegt (d. H. Eine Raycast-Quelle).Bewegliches Objekt mit Raycast-Problemen

Ich habe versucht eine Reihe von Ansätzen versuchen, dies zu lösen, aber ich kann nicht scheinen, die Wurzel dieses Problems zu graben. Wird verwaltet, um dies zu verhindern, indem der Collider deaktiviert wird, der an das verschobene Objekt angehängt ist. Allerdings brauche ich den Collider aus verschiedenen Gründen, daher ist dieser Ansatz nicht geeignet.

Wenn jemand irgendwelche Hinweise geben kann, wo ich falsch liege, wäre ich unglaublich dankbar.

NB: Codierung in UJS

Vielen Dank im Voraus, Ryan

function FixedUpdate() { 
 

 
    if (modObj != null && !guiMode) { 
 

 
    //Panel Control 
 
    if (!selectObjPanel.activeSelf && !modifySelectObjPanel.activeSelf) //if the selectpanel not open and modSelect not already activated 
 
    { 
 
     activateModSelectObjPanel(true); //activate it 
 
    } else if (selectObjPanel.activeSelf) { 
 
     activateModSelectObjPanel(false); 
 
    } 
 

 

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

 
     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 != "Player") { 
 
    //Debug.Log("Move to Hit Point: " + hit.point); 
 
    modifyObjGUIscript.activateMoveDisplay(initPos, hit.point); 
 

 
    var meshHalfHeight = modObj.GetComponent. <MeshRenderer>().bounds.size.y/2; //helps account for large and small objects 
 
    //  Debug.Log("CurObj Mesh Min: " + meshHalfHeight); 
 

 
    //  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*** 
 

 
    var rb = modObj.GetComponent. <Rigidbody>(); 
 
    rb.MovePosition(hit.point); //***method 03*** 
 

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

 
    modObj.transform.rotation = initRotation; 
 
    } 
 
}

+0

Ist die Kamera an etwas angeschlossen? Stellen Sie sicher, dass der Raycast nicht auf etwas trifft, das sich in der Nähe der Kamera befindet. –

+0

Ja, die Kamera ist an den Player-Controller angeschlossen, nicht sicher, dass dies das Problem war –

Antwort

1

Stellt sich heraus, das Problem durch die Raycast verursacht wurde Schlagen das Objekt bewegt wird. Dies wurde dadurch gelöst, dass nur Treffer aus dem Gelände als Punkte verwendet werden können, zu denen man sich bewegen möchte.

if(foundHit && hit.transform.tag == "Terrain") 
Verwandte Themen