2016-01-16 67 views
0

我有一個箱子的櫥櫃。當我在箱子上看,然後按下鼠標按鈕,我想打開/關閉它翻譯。我想移動框,直到它是X座標將是1.0(並且起始點是1.345)。但它移動的時間比這點長。如何在需要時停止翻譯?

enter image description here

我試圖用FixedUpdate,但它並沒有幫助..

public LayerMask mask; 

private bool shouldClose; 
private bool changeXCoordinate; 
private Transform objectToMove; 

void Update() 
{ 
    if (changeXCoordinate) 
     OpenCloseBox(); 
    else if(DoPlayerLookAtCupboardBox() && Input.GetMouseButtonDown(0)) 
     changeXCoordinate = true; 
} 

bool DoPlayerLookAtCupboardBox() 
{ 
    RaycastHit _hit; 
    Ray _ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width/2, Screen.height/2, 0)); 
    bool isHit = Physics.Raycast(_ray, out _hit, 1.5f, mask.value); 

    if (isHit && !changeXCoordinate) 
    { 
     objectToMove = _hit.transform; 
     return true; 
    } 
    else 
     return false; 
} 

void OpenCloseBox() 
{ 
    if (shouldClose) 
    {   
     if(objectToMove.position.x != 1.345f) // It must stop at this point, but it don't 
     { 
      changeXCoordinate = false; 
      shouldClose = !shouldClose; 
     } 
     else 
      objectToMove.Translate(Vector3.right * Time.deltaTime); 
    } 
    else 
    { 
     if (objectToMove.position.x >= 0.1f) // The same problem here.. 
     { 
      changeXCoordinate = false; 
      shouldClose = !shouldClose; 
     } 
     else 
      objectToMove.Translate(Vector3.left * Time.deltaTime);    
    } 
} 

回答

1

在這種情況下,你應該使用動畫,這樣就可以在任何方面完全控制運動。

如果你真的想使用的代碼,你可以使用它通過每幀一定級差量創建從位置A到位置B線性平移Vector3.MoveTowards:

transform.position = Vector3.MoveTowards(transform.position, targetPosition, step * Time.deltaTime); 

至於你的問題,你正在檢查頭寸是否是某個浮動。但是由於價值的不準確,在計算機上比較float是不準確的。

1.345很可能是1.345xxxxxx,與1.34500000不一樣。所以它永遠不會平等。

編輯:使用相等還會導致您正在檢查值是否大於或等於的事實。但想一想:

start : 10 movement : 3 

if(current >= 0){ move(movement);} 

frame1 : 10 
frame2 : 7 
frame3 : 4 
frame4 : 1 
frame5 : -2 we stop here 

這就是爲什麼希望移動到確切的點時,你應該使用動畫或MoveTowards。或者添加額外的:

if(current >= 0){ move(movement);} 
else { position = 0; } 
+0

1.345很可能是1.33599999,這是不一樣的。所以它永遠不會平等。也是迪馬說'if(objectToMove.position.x> = 0.1f)//同樣的問題在這裏' –

+0

是的,我編輯考慮這個問題。動畫對象時,我不會推薦使用這個原則。 – Everts

+0

我試圖使用動畫,但有一些問題。但現在它工作正常。無論如何感謝大家的幫助=) – dima

2

其更好地使用吐溫引擎,像http://dotween.demigiant.com/

如果安裝Dotween的,你可以簡單地使用

transform.DOMove(new vector3(1 ,0 , 1) , duration); 

您還可以設置緩解補間。或使用未完成的功能;

transform.DOMove(new vector3(1 ,0 , 1) , duration).SetEase(Ease.OutCubic).OnCompelete(() => { shouldClose = true; }); 

但對於你的問題的答案是,位置是不準確的數字,所以你不應該使用這樣的事情!=,則必須使用<或>。 解決你的問題,我會建議你做這樣的事情;

if(x > 1.345f) 
{ 
    x = 1.345f 
} 

這將解決您的問題。