unity3d 如何通过存储偏移量将兵移动到牌(跟踪当前位置)

wgmfuz8q  于 2023-01-17  发布在  其他
关注(0)|答案(2)|浏览(118)

我正在尝试重新创建马里奥聚会棋盘游戏。为此,我需要我的兵能够移动到瓷砖,无论他们是"开/关"发送光线投射到他们。现在我正在尝试移动我的兵一定的距离使用DOTWEN。现在我可以移动我的兵到左边或右边从开始瓷砖,但是当我试图将它移回第一个磁贴时,它会一直移到最外面的磁贴。这是我现在的设置屏幕,但我打算添加更多磁贴,所以它不会总是这样的布局:[1]:https://i.stack.imgur.com/HEwBf.png
我试着简单地添加一个偏移量"newPos",并首先使其成为一个向量3 0,0,0,这样它就不会影响第一次移动。然后在每一次移动之后,将新的位置添加到该变量中。但这并不像预期的那样工作。我如何使用这样的偏移量来跟踪我的兵的位置?
谢谢!
代码:

public class PlayerMovement : MonoBehaviour
{
    Vector3 startPos;
    Vector3 newPos;
    private void Start()
    {
        print(transform.position);
        startPos = gameObject.transform.localPosition;
        newPos = new Vector3(0, 0, 0);

    }

    void Update()
    {

        if (Input.GetKey(KeyCode.LeftArrow))
        {
            gameObject.transform.DOLocalMove(startPos + newPos + new Vector3Int(-5, 0 , 0), 1);
            
            print(gameObject.transform.localPosition);
            newPos = gameObject.transform.localPosition;
        }

        if (Input.GetKey(KeyCode.RightArrow))
        {
            gameObject.transform.DOLocalMove(startPos + newPos + new Vector3Int(5, 0, 0), 1);
           
            print(gameObject.transform.localPosition);

            newPos = gameObject.transform.localPosition;
        }
    }
}

编辑:通过添加偏移量"newPos",它根本不起作用。它移动到了一个与预期完全不同的位置。但这是我解决问题的尝试。要使它在没有偏移量的情况下工作,只需完全删除newPos变量

0h4hbjxa

0h4hbjxa1#

字符始终相对于其初始位置startPos(始终为(0,0,0))向左/向右移动。
例如,以下行始终使角色从(0,0,0)向右移动5个单位。

gameObject.transform.DOLocalMove(startPos + new Vector3Int(5, 0, 0), 1);

你想要的是这样的:

public class PlayerMovement : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            gameObject.transform.DOLocalMove(gameObject.transform.localPosition + new Vector3Int(-5, 0 , 0), 1);
        }

        if (Input.GetKey(KeyCode.RightArrow))
        {
            gameObject.transform.DOLocalMove(gameObject.transform.localPosition + new Vector3Int(5, 0, 0), 1);
        }
    }
}
h43kikqp

h43kikqp2#

DOLocalMove在本地空间中移动,但它仍然移动到目标。它不考虑当前位置。当您尝试通过设置newPos添加id时,您在序列仍在进行时这样做。因此创建了不稳定的行为。如果您想这样做,您需要在序列完成后调用它。
gameObject.transform.DOLocalMove(startPos + newPos + new Vector3Int(-5, 0, 0), 1).OnComplete( ()=> { newPos = gameObject.transform.localPosition; });
但这会导致下一个问题,即在序列仍在播放时必须阻止输入。
最好不要将玩家移动到游戏棋盘的固定位置,而是获取目标瓦片的位置,并将其位置设置为Dotween序列的目标。

相关问题