如何将移动物体准确地停在我想要的位置

时间:2016-11-13 11:40:39

标签: c# unity3d

我创建了一个代码,用于计算2个游戏对象的差异,然后通过缓慢移动它们来交换位置但我无法找到一种方法让它们在到达其他对象位置时完全停止。有帮助吗?我尝试了几种方法,但我没有设法让它们完全停在我想要的地方。注意:我希望第一个对象完全停在movingSeirstTilePos上,第二个对象停在movingFirstTilePos上。

https://www.youtube.com/watch?v=P42VB0BSBnI

代码在空中播放时保存位置,然后在那里交换位置。

编辑:我更新了代码,我对此代码非常接近,但仍然没有100%的相同位置。

    //Saves Moved Positions of Both Tiles
    Vector3 movedFirstTilePos = firstTileObj.transform.position;
    Vector3 movedSecondTilePos = secondTileObj.transform.position;

    // Calculate the Difference of each Tile from the other
    Vector3 firstTilePosDifference = firstTileObj.transform.position - secondTileObj.transform.position;
    Vector3 secondTilePosDifference = secondTileObj.transform.position - firstTileObj.transform.position;


    //Move First Tile to Second Tile Position and vise versa
    while (firstTileObj.transform.position != movedSecondTilePos) {
        firstTileObj.transform.position = Vector3.Lerp(firstTileObj.transform.position, movedSecondTilePos, tileMoveSpeed * Time.deltaTime);
        secondTileObj.transform.position = Vector3.Lerp(secondTileObj.transform.position, movedFirstTilePos, tileMoveSpeed * Time.deltaTime);
        yield return null;
    }
    Debug.Log ("Swaped Tiles!");

2 个答案:

答案 0 :(得分:1)

更好的选择是使用统一Vector3.MoveTowards,并根据物体的距离计算速度。

// Calculate the speed in which the tile should move
float distance= (firstTileObj.transform.position - secondTileObj.transform.position).magnitude;

//In time seconds, the time will reach it's destination
float time = 2;
tileMoveSpeed = distance/time;

firstTileObj.transform.position = Vector3.MoveTowards(firstTileObj.transform.position, movedSecondTilePos, tileMoveSpeed * Time.deltaTime);
secondTileObj.transform.position = Vector3.MoveTowards(secondTileObj.transform.position, movedFirstTilePos, tileMoveSpeed * Time.deltaTime);

答案 1 :(得分:0)

好像我找到了自己的解决方案:) 我使用这段代码尽可能接近地移动两个图块然后使用第二个代码完美地移动它们而不会让它看起来很奇怪。

第一个代码:

firstTileObj.transform.position = Vector3.Lerp(firstTileObj.transform.position, movedSecondTilePos, tileMoveSpeed * Time.deltaTime);
secondTileObj.transform.position = Vector3.Lerp(secondTileObj.transform.position, movedFirstTilePos, tileMoveSpeed * Time.deltaTime);

第二代码:

    //Moves Perfectly Both Tiles
    firstTileObj.transform.position = originalSecondTilePos;
    secondTileObj.transform.position = originalFirstTilePos;