我正在尝试重新创建马里奥聚会棋盘游戏。为此,我需要我的兵能够移动到瓷砖,无论他们是"开/关"发送光线投射到他们。现在我正在尝试移动我的兵一定的距离使用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变量
2条答案
按热度按时间0h4hbjxa1#
字符始终相对于其初始位置
startPos
(始终为(0,0,0))向左/向右移动。例如,以下行始终使角色从(0,0,0)向右移动5个单位。
你想要的是这样的:
h43kikqp2#
DOLocalMove在本地空间中移动,但它仍然移动到目标。它不考虑当前位置。当您尝试通过设置
newPos
添加id时,您在序列仍在进行时这样做。因此创建了不稳定的行为。如果您想这样做,您需要在序列完成后调用它。gameObject.transform.DOLocalMove(startPos + newPos + new Vector3Int(-5, 0, 0), 1).OnComplete( ()=> { newPos = gameObject.transform.localPosition; });
但这会导致下一个问题,即在序列仍在播放时必须阻止输入。
最好不要将玩家移动到游戏棋盘的固定位置,而是获取目标瓦片的位置,并将其位置设置为Dotween序列的目标。