带有翻译功能[Unity 2D]

时间:2018-10-23 20:59:51

标签: c# unity3d

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);
    }
}

2 个答案:

答案 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