Unity 2d Movement脚本问题

时间:2017-09-26 22:46:16

标签: c# unity3d animation 2d sprite

所以我在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);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

@Bejasc可能会在评论中给出正确答案,前提是您已向我们提供了所使用的实际代码。这里有一些提示,您没有要求在清洁度,最佳做法和某些功能方面改进您的代码:

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

    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输入设置中使用标准输入设置(编辑 - &gt;项目设置 - &gt;输入))

    如果-1Aleft arrow被按下,则输入.GetAxis(&#34;水平&#34;)将为left on a gamepad joystick,如果1 Dright arrowright on a gamepad joystick已被按下。这是&#34;水平&#34;的默认设置。我想你可以猜到&#34;垂直&#34;确实。

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

    如果您有任何疑问或是否有帮助,请告诉我。

答案 1 :(得分:0)

我实现此功能的唯一方法是在时间管理器中将固定时间步长更改为0.0166。似乎物理引擎和更新与结果不同步。