如何在Unity中获得平滑的2D跳跃?
How to get smooth 2D jumping in Unity?
我想让我的角色跳跃,但我的动作变得非常迟钝。这就像角色正在传送而不是缓慢上升。你有什么想法吗?我正在使用 tilemap 和 Unity 2019.1.0f2
.
我已经试过了:
rb.AddForce(Vector2.up * jumpForce)
,
rb.velocity = Vector2.up * jumpForce
,
rb.MovePosition(new Vector2(transform.position.x
, transform.position.y+jumpForce)
.
这是我的其余移动脚本,没有前面提到的代码:
public float speed;
public float jumpVelocity;
float timeBtwJumps = 0f;
float startTimeBtwJumps = 0.3f;
Rigidbody2D rb;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
private void Update()
{
float horizontal = Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
Vector2 position = new Vector2(transform.position.x, transform.position.y);
rb.MovePosition(new Vector2(position.x + horizontal, position.y));
}
private void FixedUpdate()
{
if (Input.GetAxisRaw("Vertical") > 0f && timeBtwJumps <= 0f)
{
Jump();
timeBtwJumps = startTimeBtwJumps;
}
else
timeBtwJumps -= Time.deltaTime;
}
void Jump()
{
}
一切都在 class 中,源自 MonoBehaviour。
这是我的刚体和播放器设置:
Body Type: Dynamic
Material: None
Simulated: true
Use Auto Mass: false
Mass:1
Linear Drag: 0
Angular Drag: 0.05
Gravity Scale:1
Collision Detection: Discrete
Sleeping Mode: Start Awake
Interpolate: None
Freeze Rotation: z-true
播放器具有默认设置的 Box Collider 2D。
请帮忙。提前致谢。
首先,您需要从 FixedUpdate
调用 Rigidbody
的方法,因为这是计算物理的地方。其次将向量值乘以 Time.fixedDeltaTime
.
示例:
void FixedUpdate()
{
rb.MovePosition(rb.position + position * Time.fixedDeltaTime);
}
如果您想要基于物理的跳跃,请不要使用 MovePosition。 MovePosition 只会根据您的插值设置将刚体移动到某个位置。由于您的插值是 none,因此您得到 "very laggy movement"。
相反,您应该使用脉冲力。在您只尝试加速力之前。此外,您的水平运动也必须相应地改变以增加力量。像这样尝试:
void Jump()
{
rb.AddForce(Vector2.up*jumpVelocity, ForceMode2D.Impulse);
}
要对此进行测试,您应该暂时禁用水平移动。或者你可以这样做:
private void Update()
{
float horizontal = Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
rb.AddForce(horizontal * Vector2.right);
}
还有几件事:
-永远不要在 FixedUpdate 循环中检查输入!您的游戏可能 运行 具有 100 fps 并且取决于固定更新(它称为 fix 因为 unity 试图保持物理更新帧速率固定)您可能会错过按钮按下。
-如果你使用MovePosition,只在FixedUpdate中使用它。
-您可能想更改检查跳跃输入的方式,也可能想检查玩家是否接地。
-您还应注意,也应避免在 Update 中使用 AddForce 作为加速力。
我遇到了这个问题。就好像这个角色是在传送而不是慢慢上升。
我通过更改代码解决了它。
我使用了这段代码:
MainBodyRigidBody.velocity = new Vector3 (Delta_X, 0, Delta_Y) * MovementSpeed * Time.deltaTime;
但我应该使用 MainBodyRigidBody.velocity +=
我将我的代码更改为:
MainBodyRigidBody.velocity += new Vector3 (Delta_X, 0, Delta_Y) * MovementSpeed * Time.deltaTime;
我对我的角色移动使用了上面的代码,但它导致了我的问题。
我想让我的角色跳跃,但我的动作变得非常迟钝。这就像角色正在传送而不是缓慢上升。你有什么想法吗?我正在使用 tilemap 和 Unity 2019.1.0f2
.
我已经试过了:
rb.AddForce(Vector2.up * jumpForce)
,
rb.velocity = Vector2.up * jumpForce
,
rb.MovePosition(new Vector2(transform.position.x
, transform.position.y+jumpForce)
.
这是我的其余移动脚本,没有前面提到的代码:
public float speed;
public float jumpVelocity;
float timeBtwJumps = 0f;
float startTimeBtwJumps = 0.3f;
Rigidbody2D rb;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
private void Update()
{
float horizontal = Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
Vector2 position = new Vector2(transform.position.x, transform.position.y);
rb.MovePosition(new Vector2(position.x + horizontal, position.y));
}
private void FixedUpdate()
{
if (Input.GetAxisRaw("Vertical") > 0f && timeBtwJumps <= 0f)
{
Jump();
timeBtwJumps = startTimeBtwJumps;
}
else
timeBtwJumps -= Time.deltaTime;
}
void Jump()
{
}
一切都在 class 中,源自 MonoBehaviour。 这是我的刚体和播放器设置:
Body Type: Dynamic
Material: None
Simulated: true
Use Auto Mass: false
Mass:1
Linear Drag: 0
Angular Drag: 0.05
Gravity Scale:1
Collision Detection: Discrete
Sleeping Mode: Start Awake
Interpolate: None
Freeze Rotation: z-true
播放器具有默认设置的 Box Collider 2D。
请帮忙。提前致谢。
首先,您需要从 FixedUpdate
调用 Rigidbody
的方法,因为这是计算物理的地方。其次将向量值乘以 Time.fixedDeltaTime
.
示例:
void FixedUpdate()
{
rb.MovePosition(rb.position + position * Time.fixedDeltaTime);
}
如果您想要基于物理的跳跃,请不要使用 MovePosition。 MovePosition 只会根据您的插值设置将刚体移动到某个位置。由于您的插值是 none,因此您得到 "very laggy movement"。
相反,您应该使用脉冲力。在您只尝试加速力之前。此外,您的水平运动也必须相应地改变以增加力量。像这样尝试:
void Jump()
{
rb.AddForce(Vector2.up*jumpVelocity, ForceMode2D.Impulse);
}
要对此进行测试,您应该暂时禁用水平移动。或者你可以这样做:
private void Update()
{
float horizontal = Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
rb.AddForce(horizontal * Vector2.right);
}
还有几件事:
-永远不要在 FixedUpdate 循环中检查输入!您的游戏可能 运行 具有 100 fps 并且取决于固定更新(它称为 fix 因为 unity 试图保持物理更新帧速率固定)您可能会错过按钮按下。
-如果你使用MovePosition,只在FixedUpdate中使用它。
-您可能想更改检查跳跃输入的方式,也可能想检查玩家是否接地。
-您还应注意,也应避免在 Update 中使用 AddForce 作为加速力。
我遇到了这个问题。就好像这个角色是在传送而不是慢慢上升。
我通过更改代码解决了它。
我使用了这段代码:
MainBodyRigidBody.velocity = new Vector3 (Delta_X, 0, Delta_Y) * MovementSpeed * Time.deltaTime;
但我应该使用 MainBodyRigidBody.velocity +=
我将我的代码更改为:
MainBodyRigidBody.velocity += new Vector3 (Delta_X, 0, Delta_Y) * MovementSpeed * Time.deltaTime;
我对我的角色移动使用了上面的代码,但它导致了我的问题。