在Unity中使用RigidBody2D

问题描述

我的好友和我最近合作创建了一个顶视太空射击游戏,例如小行星。我们已经看了很多教程,并且已经设法与translate.Transform()一起使用,并可以移动对象。

现在我们要使用RigidBody2D向我们的船施加力量:

这是Unity窗口的屏幕截图:

Screenshot of Unity window

如上面的屏幕快照所示,我们制作了一个Player Ship预制件,其中带有一个太空飞船精灵,一个圆形对撞机,一个刚体2D和一个PlayerThrust脚本。

Thrust.cs中:

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

public class Thrust : MonoBehavIoUr
{
    // Thrust script components
    public  Rigidbody2D rigidBody;     // GameObject's Rigidbody2D component
    public  float       thrustAmount;  // amount of thrust applied to be defined in unity
    private float       thrustInput;   // float variable to keep track of user input of the 'up' arrow key/'up' axis tilt on joystick

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

    // Update is called once per frame
    void Update() 
    {
        // handle input
        thrustInput = Input.GetAxis("Vertical");  // float ranging from -1.0 to +1.0

        // Debug
        Debug.Log(Vector2.up * thrustInput * thrustAmount);
    }

    // Fixed Update is called every fixed framerate frame
    // use for physics
    void FixedUpdate() {
        // only accelerate forward
        if (thrustInput > 0) 
        {
            // Apply thrust in direction ship is facing
            rigidBody.AddRelativeForce(transform.up * thrustInput * thrustAmount);
        }
    }
}

为什么船不移动?

Debug.Log(Vector2.up * thrustInput * thrustAmount);输出一个有意义的数字,当按下按钮时,它会升到推力量,而在释放按钮时,它会返回到0.0。

解决方法

这里是一项测试,以了解发生了什么情况。 2个脚本。一个将产生一艘船(一个立方体),另一个将使用推进器。立方体快速下降时,请按住向上键一点以接合推进器。

这应该至少在2020年之前适用于Unity 5.6。

#1-

创建一个新的空白场景。确保您处于2D视图。 不做任何更改。将此脚本添加到相机(它所做的只是生成一个对象):

using System.Collections;
using UnityEngine;

public class SpawnShipTest : MonoBehaviour
{
    private void Start()
    {
        //Create a new scene,put this script on your camera.
        StartCoroutine(SpawnTestObject());
    }

    IEnumerator SpawnTestObject()
    {
        //Spawn object
        var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
        var col = go.GetComponent<BoxCollider>();
        Component.Destroy(col);

        yield return new WaitForSeconds(.2f);

        go.transform.position = new Vector3(0f,0f,-2f);
        go.AddComponent<ShipThrustTest>();

        go.AddComponent<Rigidbody2D>();

    }
}

#2-

将此脚本添加到项目文件夹中的某个位置(然后按播放,然后查看“游戏窗口”):

using UnityEngine;

public class ShipThrustTest: MonoBehaviour
{
    // Thrust script components
    public Rigidbody2D rigidBody;      
    public float thrustAmount;   // amount of thrust applied to be defined in unity
    private float thrustInput;    // float variable to keep track of user input of the 'up' arrow key/'up' axis tilt on joystick

    void Start()
    {
        rigidBody = GetComponent<Rigidbody2D>();
        thrustAmount = 10f;
    }

    void Update()
    {
        thrustInput = Input.GetAxis("Vertical"); 
    }

    void FixedUpdate()
    {
        if (thrustInput > 0)
        {
            rigidBody.AddRelativeForce(transform.up * thrustInput * thrustAmount * 2f,ForceMode2D.Force);
        }
    }
}
,

感谢您的帮助。

最主要的错误是我们将Rigidbody2D与3-D对象一起使用,而不仅仅是Rigidbody……我们被游戏为“ 2- D”游戏,即使我们的资产是3维的。

我们也从未考虑过使用rigidBody = GetComponent<Rigidbody2D>();或使用参数,ForceMode2D.Force。这些都是非常好的技巧。很棒的测试脚本@Kale_Surfer_Dude!