2016-05-19 27 views
0

我已經寫了一個腳本來移動一個對象通過射線投射到地形上的位置,但是我不能爲我的生活似乎使這個運動平穩。我嘗試了所有的方法來試圖解決這個問題(你可以通過下面的註釋代碼的數量來判斷);禁用各種剛體變量,但無濟於事。平滑光線定位

(種類)工作的一種方法是禁用連接到物體的碰撞器,但是這會導致物體無意中下沉到地形下方。

任何人都可以請告訴我最好的方法去做這件事嗎?我覺得這應該很簡單,但我過分複雜。

  //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; 
    } 
} 

回答

1

你需要調用moveObject重新計算非常頻繁的位置 - 每一幀,如果可能的話。例如從更新或從協同程序:

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

對。還要注意,你經常這樣做:有一個新的獨立標記(即空GameObject)稱爲「Tracker」。但是爲了開發目的,它上面有一個小的白色立方體,所以你可以看到它。將Jorel的腳本放在Tracker上(不在您的實際飛機上)。讓用戶真正引導,等等,Tracker。接下來,讓你的飛機實際上*追蹤追蹤到處*。通過這種方式,您可以*使飛機上的Y *運動平滑;這樣做通常更簡單和合乎邏輯。 – Fattie

+0

@joreldraw對不起,在我的文章中應該已經更清楚了:''moveObject()'函數正在從'FixedUpdate()'的'Input.GetKey(KeyCode.E)'中調用;這是否符合你所說的? 我也改變了從使用對象的轉換到使用它的剛體的定位: 'var movRb = modObj.GetComponent。 ();' 'movRb.position = Vector3.Lerp(initPos,hit.point,speed);' 根據我收到的其他反饋。這無疑有助於解決問題。任何進一步的反饋將不勝感激。 –

+0

嘗試在一段時間內調用協程,我爲此編輯協程。 – joreldraw