繁体   English   中英

Unity 2d 运动脚本问题

[英]Unity 2d Movement script issue

所以我在 Unity 中制作了一个 2d 平台游戏(对于 c# 和 Unity 来说仍然是新的),我正在尝试为一个简单的正方形制作一个移动脚本,正方形会随机停止移动,我会有跳起来再次开始移动,只是为了它再次发生。

public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed;
    public float jumpHeight;

    void Start()
    {
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, jumpHeight);
        }

        if (Input.GetKey(KeyCode.D))
        {
            GetComponent<Rigidbody2D>().velocity = new Vector2(moveSpeed, 0);
        }

        if (Input.GetKey(KeyCode.A))
        {
            GetComponent<Rigidbody2D>().velocity = new Vector2(-moveSpeed, 0);
        }
    }
}

如果您已向我们提供了正在使用的实际代码,则@Bejasc的注释中可能给出了正确的答案。 在清洁度,最佳实践和某些功能方面,您并不需要以下提示来改进代码:

  1. 每次要读取值时,不要使用GetComponent <>()。 创建GameObject时将其保存在变量中! (检查下面代码中的Start()方法)
  2. 如果玩家正在移动,则将Y速度设置为0,如果您要同时跳跃和移动,则将其无效;如果您跳跃(将Y速度设置为jumpHeight)然后移动(将Y速度设置为0),则此操作将无效。因为我们将每帧的Y速度设置为0,所以您的角色将漂浮在空中。 将其设置为当前的Y速度! (移动时检查new Vector2的y参数)

结果代码:

public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed;
    public float jumpHeight;
    Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.velocity = new Vector2(rb.velocity.x, jumpHeight);
        }

        if (Input.GetKey(KeyCode.D))
        {
            rb.velocity = new Vector2(moveSpeed, rb.velocity.y);
        }

        if (Input.GetKey(KeyCode.A))
        {
            rb.velocity = new Vector2(-moveSpeed, rb.velocity.y);
        }
    }
}

对于这个简单的运动脚本,您还可以通过执行以下操作来简化运动代码:

(前提是您在Unitys输入设置(编辑->项目设置->输入)中使用标准输入设置)

如果按下Aleft on a gamepad joystick left arrowleft on a gamepad joystick则Input.GetAxis(“ Horizo​​ntal”)将为-1如果按下Dright on a gamepad joystick right arrowright on a gamepad joystick则Input.GetAxis(“ Horizo​​ntal”)将为1 这是“水平”的默认设置,我想您可以猜到“垂直”的作用。

void Update() {
    float moveDir = Input.GetAxis("Horizontal") * moveSpeed;
    rb.velocity = new Vector2(moveDir, rb.velocity.y);

    // Your jump code:
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.velocity = new Vector2(rb.velocity.x, jumpHeight);
    }
}

让我知道您是否有疑问或是否有帮助。

我要使它起作用的唯一方法是在时间管理器中将固定的时间步更改为0.0166。 似乎物理引擎和更新与结果不同步,结结巴巴。

我为二维运动制作了一个基本脚本。 随意做笔记或复制和粘贴。

void Update()
{
    // check for the a key to be pressed
    if (Input.GetKey(KeyCode.A))
    {
        // add velocity to the player
        rb.velocity += (Vector2.left * (speed * Time.deltaTime));
    }

    // check for the d key to be pressed
    if (Input.GetKey(KeyCode.D))
    {
        // add velocity to the player
        rb.velocity += (Vector2.right * (speed * Time.deltaTime));
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM