简体   繁体   English

在 Unity 中使用 RigidBody2D

[英]Using RigidBody2D in Unity

My buddy and I recently teamed up to create a top-view space shooting game, like asteroids.我和我的小伙伴最近联手打造了一款俯视太空射击游戏,就像小行星一样。 We've watched a lot of tutorials, and we've managed to work with translate.Transform() and get our object to move.我们看过很多教程,我们已经设法使用translate.Transform()并让我们的对象移动。

Now we want to apply force to our ship using RigidBody2D :现在我们想使用RigidBody2D对我们的船施加力:

Here is a screenshot of our Unity window:这是我们 Unity 窗口的屏幕截图:

Unity 窗口的屏幕截图

As seen in the screenshot above, we made a Player Ship prefab with a spaceship sprite, a circle collider, a rigidbody 2D and a PlayerThrust script.如上面的屏幕截图所示,我们制作了一个带有飞船精灵、圆形碰撞器、刚体 2D 和 PlayerThrust 脚本的 Player Ship 预制件。

In Thrust.cs :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);
        }
    }
}

Why doesn't the ship move?为什么船不动?

Debug.Log(Vector2.up * thrustInput * thrustAmount); outputs a number which makes sense, it goes up to the thrust amount when the button is pressed, and goes back to 0.0 when the button is released.输出一个有意义的数字,当按下按钮时它会上升到推力量,并在释放按钮时返回到 0.0。

Here's a test to see what is going on.这是一个测试,看看发生了什么。 2 scripts. 2个脚本。 One will spawn a ship (A cube), and the other will use thrusters.一个将产生一艘船(一个立方体),另一个将使用推进器。 Hold down the up key a bit to engage the thrusters, as the cube falls quickly.按住向上键一点以接合推进器,因为立方体快速下落。

This should work on at least Unity 5.6 up to 2020.这应该至少适用于 Unity 5.6 到 2020 年。

#1 - #1 -

Create a new blank scene.创建一个新的空白场景。 Make sure you're in 2D view.确保您处于 2D 视图中。 Don't change anything.不要改变任何东西。 Add this script to the camera (All it does is spawn an object):将此脚本添加到相机(它所做的只是生成一个对象):

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 - #2 -

Add this script in your projects folder somewhere (then press play, and view the Game Window):将此脚本添加到您的项目文件夹中的某处(然后按播放,并查看游戏窗口):

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

Thanks for the help.谢谢您的帮助。

The main thing that was wrong was that we were using Rigidbody2D with 3-D objects, and not simply Rigidbody ...we got confused by the fact that the game was a "2-D" game, even though our assets were 3 dimensional.主要的错误是我们将Rigidbody2D与 3-D 对象一起使用,而不仅仅是Rigidbody ...我们对游戏是“2-D”游戏这一事实感到困惑,即使我们的资产是 3 维的.

We also never thought about using rigidBody = GetComponent<Rigidbody2D>();我们也从未想过使用rigidBody = GetComponent<Rigidbody2D>(); or using the parameter , ForceMode2D.Force .或使用参数, ForceMode2D.Force Those were really good tips.这些都是很好的提示。 Great test scripts @Kale_Surfer_Dude !很棒的测试脚本@Kale_Surfer_Dude!

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

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