c# - 跳跃增加移动速度
问题描述
我正在使用球物理和 FPS 相机制作游戏。我有这个错误,当我跳跃时玩家的移动会增加。
例子:
在平面上沿 Z 轴运行:
突然跳起来:
我的代码:
void Update()
{
// Input
moveFwrd = Input.GetAxis("Horizontal");
moveSide = Input.GetAxis("Vertical");
// Player Jump
if (Input.GetKeyDown(jumpKey) && Physics.Raycast(
transform.position,
Vector3.down,
DistanceToTheGround + 0.1f))
{
rb.AddForce(Vector3.up * jumpSpeed, ForceMode.Impulse);
}
// Braking
if (Input.GetKey(brakeKey))
{
rb.angularDrag = brakeForce;
}
else
{
rb.angularDrag = 0.01f;
}
}
void FixedUpdate()
{
// Player Movement
Vector3 movement = cam.transform.right * moveFwrd +
cam.transform.forward * moveSide;
movement = movement.normalized;
rb.AddForce(movement * speed);
}
}
解决方案
最有可能的答案是摩擦。根据玩家刚体碰撞器使用的物理材质和地板使用的物理材质,刚体的行为会有所不同:
静摩擦描述了两个物体都没有移动时(即玩家开始移动之前)的摩擦,动态/动能/滑动摩擦描述了玩家沿着/在地板上移动时的摩擦。它还将确定刚体是否在地板上滑动或滚动,您可以尝试使用不同的物理材料来查看效果。
按下跳跃按钮后您会看到在半空中向前移动更快的原因是刚体在空中时不再受到固体材料之间的“接触摩擦”的影响,因此在施加相同的向前力的情况下它会移动得更快。- 但是,仍然存在摩擦:空气阻力;可以由Rigidbody.drag
和控制Rigidbody.angularDrag
。
如果你想摆脱这种模拟行为,你可以做各种事情:使用不同的物理材料Rigidbody.drag
,Rigidbody.mass
值,或者尝试使用不同的ForceModeForceMode.VelocityChange
,如Rigidbody.AddForce()
. 或者根本不使用物理引擎和刚体进行运动(仍然可以使用碰撞器和射线投射)。
旁注:
FixedUpdate()
定期调用,是推荐使用与物理相关的脚本的地方。实际上,它的调用频率与更新内部物理引擎的频率相同,如此处所述。每次通话之间的持续时间是恒定的:Time.fixedDeltaTime
.
Update()
另一方面,以可变速率调用,并且具有可变的持续时间Time.deltaTime
,这导致不同的帧速率(FPS)。此方法可用于游戏的视觉渲染或状态处理,如果可能,不应用于更新与物理相关的内容。
在上面的脚本中,您Rigidbody.AddForce()
在方法Update()
和FixedUpdate()
. 在后一种情况下使用默认参数ForceMode.Force
,在另一种情况下使用ForceMode.Impulse
. 在这两种情况下,您都没有考虑帧时间,这在脉冲的情况下很好,应用一次(在按下一个键之后)。在另一种情况下,方向向量被归一化,所以这也不是问题,因为该方法以固定速率调用......但它可以写得更清楚一点。
推荐阅读
- spring - 如何访问位于@Service 类中的 SseEmitters 集合
- r - 栅格预测函数将因子更改为数值并给出错误
- arrays - 从 Firestore 中的数组更新特定索引
- makefile - 制作 gdal 时未找到 json_object_private.h
- java - 如何使用 Jetty 客户端获取基于请求的连接时间
- php - 如何将参数从控制器索引函数传递给模型的函数?拉拉维尔
- nativescript - Nativescript 没有检测到我自己包含的库 jar
- java - 如何在类似于 Tabs App 的 android 中根据时间自动滚动内容
- python - 如何随机抽取分类列
- android - android jetpack 导航仪器测试在返回导航上失败