Использование RigidBody2D в Unity

Мы с приятелем недавно объединились, чтобы создать космическую стрелялку с видом сверху, вроде астероидов. Мы просмотрели много руководств, и нам удалось поработать с translate.Transform() и заставить наш объект двигаться.

Теперь мы хотим применить силу к нашему кораблю, используя RigidBody2D:

Вот скриншот нашего окна Unity:

Скриншот окна Unity

Как видно на скриншоте выше, мы создали префаб корабля игрока со спрайтом космического корабля, коллайдером круга, твердым телом 2D и скриптом PlayerThrust.

In 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 при отпускании кнопки.


person E Harrison    schedule 13.09.2020    source источник


Ответы (2)


Вот тест, чтобы увидеть, что происходит. 2 скрипта. Один создаст корабль (куб), а другой будет использовать двигатели. Слегка удерживайте кнопку «вверх», чтобы задействовать подруливающие устройства, поскольку куб быстро падает.

Это должно работать как минимум на Unity 5.6 до 2020 года.

#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);
        }
    }
}
person Kale_Surfer_Dude    schedule 13.09.2020
comment
Мужик, спасибо. Я попытался увеличить тягу, но безуспешно. Стоит ли попробовать переустановить Unity? Я не знаю, что еще мне попробовать. - person E Harrison; 13.09.2020
comment
Rigidbody 2D Тип корпуса: Кинематический материал: Нет (физический материал) Имитация: true Использовать полную кинематику C ...: false Обнаружение столкновений: Дискретный режим сна: Начать пробуждение Интерполировать: Нет - person E Harrison; 13.09.2020
comment
Обновил свой ответ некоторыми скриптами, которые вы можете использовать для тестирования. - person Kale_Surfer_Dude; 13.09.2020
comment
Kale_Surfer_Dude СПАСИБО! Я понял свою проблему, было несколько вещей, в которых я ошибся, я отправлю это в ответ. - person E Harrison; 13.09.2020

Спасибо за помощь.

Основная ошибка заключалась в том, что мы использовали Rigidbody2D с трехмерными объектами, а не просто _2 _... нас смутил тот факт, что игра была двухмерной, хотя наши ресурсы были трехмерными.

Мы также никогда не думали об использовании rigidBody = GetComponent<Rigidbody2D>(); или параметре , ForceMode2D.Force. Это были действительно хорошие советы. Отличные тестовые скрипты @Kale_Surfer_Dude!

person E Harrison    schedule 13.09.2020