【发布时间】: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);会发生什么?如果问题与正在旋转的变换有关,它可能会解决它。
标签: c# unity3d game-development