2017-08-19 107 views
1

我目前正在使用Vector3.Lerp實例化一行中的一些對象。這是行得通的,但它也會在對象之間產生一些差距。如果開始和結束之間的距離不夠大而無法插入新對象,則會發生這種情況,但它足夠大以至於可以滑動一下。他們需要運行端到端,彼此直接對接。Unity lerp刪除間隙

代碼是:

Vector3 startPosition= blah.transform.position. 
Vector3 endPosition = getCurrentMousePosition(); 
Vector3 size = ObjectToSpawn.GetComponent<Renderer>().bounds.size; 
fillCount = Mathf.RoundToInt(Vector3.Distance(startPosition, endPosition)/size.z); 

float distance = 1.0f/fillCount; 
float lerpValue = 0; 

for (int i = 0; i < fillCount; i++) 
{ 
    lerpValue += distance; 
    nextPosition = Vector3.Lerp(startPosition, endPosition, lerpValue); 
    Instantiate(ObjectToSpawn, nextPosition, Quaternion.identify); 
} 

部分的我認爲,這可能僅僅是值得嘗試的只是根據它們的大小/距離實例在一排的對象,但我似乎無法得到相當多正確的。雖然這個系統被用於其他的東西,我寧願不重寫全新的代碼,如果這可以稍微修改一下工作。我猜猜四捨五入的價值將會成爲可能?

任何意見或建議將不勝感激。

回答

1

如果你想的對象恰好沒有間隙碰,開始和結束位置之間的距離必須它們的大小的整數倍。

嘗試添加以下行的循環之前:

endPosition = Vector3.Lerp(startPosition, endPosition, (fillCount * size.z)/Vector3.Distance(startPosition, endPosition)); 
+0

這樣做了它。只需稍微調整一下代碼,((i + 1)* size.z)將它們全部放在一行中,沒有重疊。謝謝!! – Tony

1

您可以使用閾值。當它的位置非常接近終端位置,可以夾住它直接終端位置是這樣的:

if(Vector3.Distance(nextPosition,endPosition)<threshold){ 
    nextPosition = endPosition; 
}else{ 
    nextPosition = Vector3.Lerp(startPosition, endPosition, lerpValue); 
}