在我的游戏中,有一种情况是,当玩家触摸特定 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 位置?
答案 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;
}