如何停止一个移动的对象,正是我想要的地方

本文关键字:对象 我想要 移动 何停止 一个 | 更新日期: 2023-09-27 18:17:52

我创建了一个代码来计算2个游戏对象的差异,然后通过缓慢移动它们来交换位置,但我找不到一种方法来让它们在到达另一个对象位置时完全停止。任何帮助吗?我尝试了几种方法,但我没能让它们停在我想要的地方。注意:我想要第一个对象正好停在movedSecondTilePos,第二个对象停在movedFirstTilePos。

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!");

如何停止一个移动的对象,正是我想要的地方

一个更好的选择是使用unity 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);

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

第一个代码:

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;