UNITY 2D:玩家在按住 space/mousebutton 时飞行

UNITY 2D: Player flying when space/mousebutton is holded

所以基本上我需要我的角色在按下 spacemousebutton 时上升。我在 gameobject(播放器)中添加了 rigbody 2d 和 box colider 2d。问题是当我点击 spacemousebutton 它只是跳跃而不是不断地 向上移动。

这是我的代码:

using UnityEngine;
using System.Collections;

public class PixelMovement : MonoBehaviour {

    Vector3 velocity = Vector3.zero;
    public Vector3 PressVelocity;
    public float maxSpeed = 5f;
    public float fowardSpeed = 1f;
    public float jumpForce;

    bool didPress = false;

    // Use this for initialization
    void Start () {

    }

    //Do Graphic & Input updates
    void Update()
    {
        if (Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))
        {
            didPress = true;
        }
    }

    //Do physics engine updates here
    void FixedUpdate()
    {
        velocity.x = fowardSpeed;
        if (didPress == true)
        {
            didPress = false;
            velocity += PressVelocity * Time.deltaTime *jumpForce;

        }

        velocity = Vector3.ClampMagnitude(velocity, maxSpeed);
        transform.position += velocity * Time.deltaTime;
    }
}
    if (Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))
    {
        didPress = true;
    }
    else
    {
        didPress = false;
    }

并从 FixedUpdate() 函数中删除 didPress = false;

编辑: 好的,等等,我刚刚注意到您在 FixedUpdate() 中更新了 transform.position,这并不是一个好主意。当你这样做时,你基本上将你的对象从一个位置传送到另一个位置,而忽略了各种物理(这可能是你使用 FixedUpdate() 的原因)。当您的脚本与其他对象发生碰撞时,会给您带来奇怪的结果。查找有关使用 RigidBodies 进行适当的物理感知运动的教程,或者将所有代码移动到 Update() 因为现在您可能有一些帧不移动对象而其他帧移动两倍距离.之所以会发生这种情况,是因为 FixedUpdate() 可能会在一帧中执行任意次数(包括 0 次),具体取决于设置。 FixedUpdate 默认每秒稳定运行 50 次,而 Update 默认每秒大约运行 60 次(在移动设备 30 上)。最后,在 FixedUpdate 中永远不要使用 Time.deltaTime,使用 Time.fixedDeltaTime:

Time.deltaTime 大约等于 1 / 60 秒(1 帧持续时间)

Time.fixedDeltaTime 大约是 1 / 50 秒(1 物理更新持续时间)

如果您使用重力和 RigitBody2D 的质量。我建议你使用 RigitBody2D.Addforce() 方法来跳跃你的角色,因为如果你只是改变角色的位置,重力会立即将他降到地面

这段代码创建了 "rocketman" 的效果,当用户按住空格键时它会起飞:

using UnityEngine;
using System.Collections;

public class jumpAntigravity : MonoBehaviour {

    Vector2 upForce;

    void Start () {
        //Up force set to double of gravity
        upForce = new Vector2(0, 9.8f*2);
    }

    void Update () {
        if (Input.GetKey(KeyCode.Space))
        {
            print("Spacebar is down");
            GetComponent<Rigidbody2D>().AddForce(upForce);
        }
    }
}

好的,这对我有用。感谢大家的帮助:)

using UnityEngine;
using System.Collections;

public class PixelMovement : MonoBehaviour {

    public float playerSpeed;
    public Vector3 gravity;
    public float maxSpeed = 5f;
    Vector3 velocity = Vector3.zero;
    public float fowardSpeed = 1f;

    bool didPress = false;

    void Update()
    {
        if (Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))
        {
            didPress = true;
        }
        else
        {
            didPress = false;
        }
    }

    void FixedUpdate()
    {
        velocity.x = fowardSpeed;
        transform.position += velocity * Time.deltaTime;
        if (didPress == true)
        {

            float amntToMove1 = playerSpeed * Time.deltaTime;
            transform.Translate(Vector3.up * amntToMove1);
        }
        velocity = Vector3.ClampMagnitude(velocity, maxSpeed);
        transform.position += velocity * Time.deltaTime;
    }
}

FixedUpdate可以连续每帧调用多次。这基于您项目的物理设置。您可以对其进行编辑以增加或减少物理学的准确性。

Update 每帧只调用 1 次。

所以你想避免在 FixedUpdate 中做逻辑。如果要移动刚体,请使用 MovePosition。

来自 Unity 文档:如果在 Rigidbody 上启用了 Rigidbody 插值,则调用 Rigidbody.MovePosition 会导致渲染的任何中间帧中两个位置之间的平滑过渡。如果你想在每个 FixedUpdate 中连续移动一个刚体,应该使用这个。