玩家跳跃高度不一致 - Unity
Posted
技术标签:
【中文标题】玩家跳跃高度不一致 - Unity【英文标题】:Player Jumping Height is not consistent - Unity 【发布时间】:2019-10-21 08:41:57 【问题描述】:我正在开发一款 2D 平台游戏,例如,我意识到玩家的跳跃功能并非每次都以相同的方式工作。如果玩家在移动/奔跑时跳跃或玩家在不移动的情况下跳跃,跳跃高度是不同的。
我有 2 个独立的函数 Move() 和 Jump(),Move() 使用 transform.Translate 让玩家移动,Jump() 使用rigidBody.AddForce() 让玩家跳跃。我已经尝试将播放器 Move() 函数更改为使用rigidBodies 来使播放器移动,而不是使用transform.Translate()。它没有奏效。
我也尝试过使用 transform.Translate 让玩家跳跃,这解决了跳跃高度不一致的问题,但玩家只是传送而不是跳跃
这是我的代码结构的表示,不是实际代码,因为实际代码就像 600 行
public class Player
float JumpSpeed;
bool isGrounded;
void Update()
if (Input.GetKey(KeyCode.A))
Move(Directions.Left);
if (Input.GetKey(KeyCode.D))
Move(Directions.Right);
if (Input.GetKeyDown(KeyCode.Space))
Jump(JumpSpeed);
public void Move(Directions dir)
Vector2 speed;
//figure out speed and etc...
//makes the player move in the right direction and speed
transform.Translate(speed * Time.deltaTime);
public void Jump(float speed)
if(isGrounded)
rigidBody.AddForce(new Vector2(0, speed * Time.deltaTime), ForceMode2D.Impulse);
【问题讨论】:
我在这里看不到任何会产生您所描述的结果的东西。如果你用这里写的代码替换你的 Player 代码,它是否仍然显示相同的跳跃高度差异? 我不确定在使用Rigidbody.AddForce
时是否需要将力乘以 Time.deltaTime。脉冲模式是动量而不是加速度,所以单位已经是m/s
而不是m/s^2
。 I got the info from this Unity Answers answer
@Eliasar 哦,好点子。这可能是原因,因为运行可能与变化的帧速率同时发生。
即使将实际代码替换为此处编写的代码并停止将力乘以 Time.deltaTime,它仍然显示跳跃高度的差异
@Nicolas 其实我很好奇,如果你使用transform.Translate(speed*Time.deltaTime, Space.World);
会发生什么?如果问题与正在旋转的变换有关,它可能会解决它。
【参考方案1】:
不确定这是否是您的具体问题,但是使用 translate 来移动播放器并然后增加跳跃的力量并不是解决问题的最佳方法。
我会考虑将刚体的速度部分用于跳跃和运动。这将防止翻译对象可能导致的任何奇怪现象。
【讨论】:
我也这么认为。这可能是物理和渲染引擎之间的同步问题。 Update 和 FixedUpdate 可能会以不同的方式计算您的对象位置,例如竞态条件 翻译不会影响速度,所以我不认为是这个,但我确实认为其他东西正在设置或改变速度。 显然...由于某种原因,翻译影响了速度 @Nicolas 取决于speed
的计算方式以及transform
的旋转方式,Translate
可能使您的播放器向上或向下移动更多,但它绝对没有改变rigidBody.velocity
就其本身而言,我的观点是:p 很高兴它已修复!以上是关于玩家跳跃高度不一致 - Unity的主要内容,如果未能解决你的问题,请参考以下文章
黑魂复刻游戏的玩家控制器(后跳奔跑翻滚跳跃的再重新设计)——Unity随手记