如何做 rb.AddForce 但对于 2D?统一 C#
How to do rb.AddForce but for 2D? Unity C#
我正在制作一款 2D 游戏,您可以在其中控制盾牌,并且必须阻止掉落的障碍物到达基地。我知道要移动您使用的东西 rb.addforce
。但是,当我对 2D 执行相同操作时,它不起作用。我想象,而不是使用 Vector3,而是使用 Vector2,但它给了我这两个错误:Assets\Movement.cs(16,25): error CS1503: Argument 1: cannot convert from 'float' to 'UnityEngine.Vector2'
和这个:Assets\Movement.cs(16,25): error CS1503: Argument 1: cannot convert from 'float' to 'UnityEngine.Vector2'
每次我写这行。这是我的完整代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour
{
public Rigidbody2D rb;
public Collider2D collider;
public float moveSpeed = 0.1f;
private void Update()
{
if (Input.GetKey("w"))
{
rb.AddForce(0f, moveSpeed);
Debug.Log("w");
}
if (Input.GetKey("s"))
{
rb.AddForce(0f, moveSpeed);
Debug.Log("s");
}
}
}
Rigidbody2D.AddForce
不采用两个 float
参数,而是像往常一样使用 Vector2
和 ForceMode2D
,后者的默认值为 ForceMode2D.Force
如果你不传进去。
所以你的代码应该是
// = new Vector2 (0,1) * moveSpeed
// = new Vector2 (0, moveSpeed)
rb.AddForce(Vector2.up * moveSpeed);
...
// I assume in the second case you rather want to go down so
// = new Vector2 (0, -1) * moveSpeed
// = new Vector2 (0, -moveSpeed)
rb.AddForce(Vector2.down * moveSpeed);
顺便说一句,我宁愿不 Debug.Log
Update
中的每一帧,它非常昂贵。
您可以在 rb.AddForce (new Vector2(0,moveSpeed));
中添加新的 Vector2
这是更新后的代码:
public class Movement : MonoBehaviour
{
public Rigidbody2D rb;
public Collider2D collider;
public float moveSpeed = 0.1f;
private void Update()
{
if (Input.GetKey("w"))
{
rb.AddForce(new Vector2(0f, moveSpeed));
Debug.Log("w");
}
if (Input.GetKey("s"))
{
rb.AddForce(new Vector2 (0f, moveSpeed));
Debug.Log("s");
}
}
}
我正在制作一款 2D 游戏,您可以在其中控制盾牌,并且必须阻止掉落的障碍物到达基地。我知道要移动您使用的东西 rb.addforce
。但是,当我对 2D 执行相同操作时,它不起作用。我想象,而不是使用 Vector3,而是使用 Vector2,但它给了我这两个错误:Assets\Movement.cs(16,25): error CS1503: Argument 1: cannot convert from 'float' to 'UnityEngine.Vector2'
和这个:Assets\Movement.cs(16,25): error CS1503: Argument 1: cannot convert from 'float' to 'UnityEngine.Vector2'
每次我写这行。这是我的完整代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour
{
public Rigidbody2D rb;
public Collider2D collider;
public float moveSpeed = 0.1f;
private void Update()
{
if (Input.GetKey("w"))
{
rb.AddForce(0f, moveSpeed);
Debug.Log("w");
}
if (Input.GetKey("s"))
{
rb.AddForce(0f, moveSpeed);
Debug.Log("s");
}
}
}
Rigidbody2D.AddForce
不采用两个 float
参数,而是像往常一样使用 Vector2
和 ForceMode2D
,后者的默认值为 ForceMode2D.Force
如果你不传进去。
所以你的代码应该是
// = new Vector2 (0,1) * moveSpeed
// = new Vector2 (0, moveSpeed)
rb.AddForce(Vector2.up * moveSpeed);
...
// I assume in the second case you rather want to go down so
// = new Vector2 (0, -1) * moveSpeed
// = new Vector2 (0, -moveSpeed)
rb.AddForce(Vector2.down * moveSpeed);
顺便说一句,我宁愿不 Debug.Log
Update
中的每一帧,它非常昂贵。
您可以在 rb.AddForce (new Vector2(0,moveSpeed));
Vector2
这是更新后的代码:
public class Movement : MonoBehaviour
{
public Rigidbody2D rb;
public Collider2D collider;
public float moveSpeed = 0.1f;
private void Update()
{
if (Input.GetKey("w"))
{
rb.AddForce(new Vector2(0f, moveSpeed));
Debug.Log("w");
}
if (Input.GetKey("s"))
{
rb.AddForce(new Vector2 (0f, moveSpeed));
Debug.Log("s");
}
}
}