更改播放器在Update()或FixedUpdate()方法中的位置?

时间:2019-07-23 14:04:16

标签: c# unity3d

在我的游戏中,有一种情况是,当玩家触摸特定 GameObject 的对撞机并且玩家按下X键时,我想将其位置更改为另一个的位置> GameObject

为此,我使用以下代码

void FixedUpdate()
{
    if (Input.GetKeyDown(KeyCode.X))
    {
        // Check Colliders collition
        // End of Check Colliders collition

        var playerRigidBody = GetComponent<Rigidbody2D>();
        playerRigidBody.position = AnotherObject.transform.position;
    }
}

我已经意识到,当我按下X键时,玩家通常不会将其位置更改为另一个 GameObject 的位置。但是,如果我将代码移到 Update()方法,它将按预期工作(没有延迟)。

但是我已经在官方文档和许多博客中读到,与物理和刚体相关的代码必须放在 FixedUpdate 中,而不是Update

所以问题如下:

对于这种情况,不建议将代码放入 Update()方法中? (请注意,我没有使用力或扭矩)

如果不建议这样做,那么我如何确保每次按下X键时,他将位置更改为 FixedUpdate()中的另一个 GameObject 位置?

1 个答案:

答案 0 :(得分:1)

通常,如果您想要平稳的运动,则应该在FixedUpdate中使用MovePosition,否则应始终在FixedUpdate中使用有关物理的所有知识(以及RigidBody)(如还有API)。

但是,您应该在Update中捕获GetKeyDown并拆分这两件事:

bool wasClicked;
RigidBody playerRigidBody;

void Start()
{
    // do this only once!
    playerRigidBody = GetComponent<Rigidbody2D>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.X))
    {
        wasClicked = true;
    }
}

void FixedUpdate()
{
    if(!wasClicked) return;

    playerRigidBody.position = AnotherObject.transform.position;

    wasClicked = false;
}