繁体   English   中英

Unity 2D Platformer 脚本

[英]Unity 2D Platformer script

我是 Unity 和 C# 的新手。 我试图编写一个 2D 平台游戏运动脚本,但由于某些原因,我创建的代码不起作用。

该脚本被称为一个圆圈。 我添加了“Rigidbody2D”和“Circle Collider 2D”。

我试过使用这个脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Movement : MonoBehaviour

{
    public Rigidbody2D rb;

    public void FixedUpdate()
    {
        if (Input.GetKey(KeyCode.RightArrow))
        {
            rb.AddForce(10, 0, 0);
        }
    }
}

代码应该点击圆圈以使其向右移动,但 Visual Studio 表示“rb.AddForce”是一个错误。 你能帮我吗?

你确定你真的引用了刚体? 您是否在编辑器中拖动了刚体? 如果没有,您还可以说以下内容(如果脚本附加到包含您要移动的刚体的对象):

private Rigidbody2D rb;

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

1) 确保您的刚体组件未设置为 Kinematic。

2)根据刚体的质量和线性阻力,您需要相应地更改施加到它的力。 代码可能正在运行,但如果您没有施加足够的力,您将看不到身体移动。

3) Addforce()需要一个Vector作为参数。 这是你的问题

public float thrust; //set in editor, this is how strong you will be pushing the object 

private Rigidbody2D rb;


private void Start()
{
  rb = GetComponent<Rigidbody2D>();
}
private void FixedUpdate()
{
    if (Input.GetKey(KeyCode.RightArrow))
    {
        rb.AddForce(transform.right * thrust); //this will move your RB to the right while you hold the right arrow
    }
}

4) 设置刚体的线性阻力,使其在施加力后实际上可以停止。 为了使它工作,例如将质量和线性阻力都设置为 1,然后只试验推力变量,它最终会开始移动。 之后,您可以减少/增加线性阻力和推力,直到达到所需的效果。

奖励如果您希望按照您在代码中尝试过的方式使用 Vector3D,您可以执行以下操作,它也可以工作:

private void FixedUpdate()
{
    if (Input.GetKey(KeyCode.RightArrow))
    {
        rb.AddForce(new Vector3(10, 0, 0)); //this will move your RB to the right while you hold the right arrow
    }
}

由于 Rigidbody2D 实现,它将构造函数中的 Vector2 作为参数,而不是简单的 Rigidbody,后者可以将 Vector3 和 Vector2 作为 Vector3。 考虑Vector3 v3 = new Vector2(10, 0); Vector2 v2 = new Vector3(10, 0, 0);

尝试这个

rb.AddForce(new Vector2(10, 0));

或者

rb.AddForce(new Vector3(10, 0, 0));

您需要添加 ForceMode2D.Impulse 才能使其工作:

using UnityEngine;

public class TestControl : MonoBehaviour
{
    public Rigidbody2D rb2d;

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            rb2d.AddForce(new Vector2(5, 0 ), ForceMode2D.Impulse);
            Debug.Log("RightArrow was Pressed");
        }

    }
}

您可以在这里找到更多信息: https : //www.studytonight.com/game-development-in-2D/right-way-to-move

暂无
暂无

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

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