【发布时间】:2017-05-02 22:33:29
【问题描述】:
我的游戏场景中有一个 Cube(Player)。我编写了一个 C# 脚本来约束 Cube 的移动(使用 Mathf.Clamp()),使其不会离开屏幕。
下面是我在脚本中的FixedUpdate() 方法
private void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rb.velocity = movement * speed;
rb.position = new Vector3(
Mathf.Clamp (rb.position.x, x_min, x_max),
0.5f,
Mathf.Clamp(rb.position.z, z_min, z_max)
);
}
x_min、x_max、z_min、z_max的值分别是通过unity inspector输入的-3、3、-2、8。
问题
脚本运行良好,但我的播放器(立方体)可以在负数X-AXIS(如果我一直按向左箭头按钮)最多移动 -3.1 个单位,在负数X-AXIS(这种行为是其他轴也是如此)。当我停止按下按钮时,它显然会夹住 -3.1 到 -3。
- 为什么会这样?为什么它 (
Mathf.Clamp()) 首先不将 Cube 限制为 -3 个单位? - 为什么我会得到额外的 0.1 个单位?
- 为什么这个值只有 0.1 个单位?为什么不增加或减少?
【问题讨论】:
-
我可能是错的,但我认为这是因为您正在设置速度然后设置位置,但是在下一帧之前,我再次猜测,统一使用对象的速度计算下一个位置.最终将其绘制在这样的位置。我认为如果它的位置超出你的边界,你需要将速度重置为零。
-
@Alox 你应该把它作为答案。我认为这也可能是问题所在。除了完全删除刚体组件或使用
Rigidbody.MovePosition函数之外,我什至认为这是不可能解决的。 -
那为什么总是只有0.1个单位呢?
-
就像 Alox 说的......因为物理学仍在运行,施加于它的旧力仍然存在。当达到极限时,尝试将速度设置为
Vector.Zero。那应该消除这种力量。我建议你为此使用 if 语句。