Soo,我正在尝试将一个简单的Platformer编写为上课作品,并且我在跳跃方面遇到问题,角色实际上在跳跃,但由于它立即到达了跳跃的顶峰,因此它似乎是一个传送。然后逐渐下降,我想使其更平滑。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class playerMovement : MonoBehaviour {
public float speed;
public float jumpForce;
public bool grounded;
public Transform groundCheck;
private Rigidbody2D rb2d;
// Use this for initialization
void Start () {
rb2d = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update () {
}
private void FixedUpdate()
{
float moveVertical = 0;
float moveHorizontal = Input.GetAxis("Horizontal") * speed;
moveHorizontal *= Time.deltaTime;
grounded = Physics2D.Linecast(transform.position, groundCheck.position, 1 << LayerMask.NameToLayer("Ground"));
if (grounded && Input.GetKeyDown("space"))
{
moveVertical = Input.GetAxis("Jump") * jumpForce;
moveVertical *= Time.deltaTime;
}
Vector2 move = new Vector2(moveHorizontal, moveVertical);
transform.Translate(move);
}
}
答案 0 :(得分:1)
问题的答案如下,但是,有关未来与Unity有关的问题,请在Unity论坛上提问。随着越来越多的人专注于Unity本身,您将更快地得到更好的答案。
要解决跳跃问题,请将垂直和水平运动分为两部分,并使用在Start()函数中分配的刚体来处理跳跃。使用ForceMode.Impulse可获得速度/加速度的即时爆发。
private void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal") * speed;
moveHorizontal *= Time.deltaTime;
grounded = Physics2D.Linecast(transform.position, groundCheck.position, 1 << LayerMask.NameToLayer("Ground"));
if (grounded && Input.GetKeyDown("space"))
{
rb2d.AddForce(transform.up * jumpForce, ForceMode.Impulse);
}
Vector2 move = new Vector2(moveHorizontal, 0);
transform.Translate(move);
}
答案 1 :(得分:0)
代替设置跳跃时的位置,可以通过以下方式向角色的刚体添加垂直冲力:
if (grounded && Input.GetKeyDown("space"))
{
moveVertical = Input.GetAxis("Jump") * jumpForce;
moveVertical *= Time.fixedDeltaTime;
rb2d.AddForce(moveVertical, ForceMode.Impulse);
}
Vector2 move = new Vector2(moveHorizontal, 0f);
这将使Rigidbody2D
处理更改每帧垂直速度的工作。
此外,由于您是在FixedUpdate
中进行所有这些计算,而不是在Update
中进行,因此使用Time.deltaTime
没有任何意义。您应该改用Time.fixedDeltaTime
。