Создание инерции

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Создание инерции

Сообщение ShadowWarrior 01 июл 2018, 13:36

Здравствуйте. Возник вопрос - как сделать инерцию? Игра 2D, когда персонаж двигался например вверх, то при отпускании кнопки W персонаж еще немного двигался в этом направлении, подскажите как это реализовать?
Аватара пользователя
ShadowWarrior
UNец
 
Сообщения: 22
Зарегистрирован: 22 апр 2018, 17:37

Re: Создание инерции

Сообщение 1max1 01 июл 2018, 13:37

можно ведь ригидбоди2д использовать, там уже всё продумано вместо тебя
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Создание инерции

Сообщение ShadowWarrior 01 июл 2018, 13:43

1max1 писал(а):можно ведь ригидбоди2д использовать, там уже всё продумано вместо тебя

Этот компонент уже есть, но для моего проекта гравитация стоит на 0, возможно я использую не тот скрипт управления
Управление записано в void Update
transform.Translate( new Vector3(
Input.GetAxis("Horizontal") * speed,
Input.GetAxis("Vertical") * speedv,
0) * Time.deltaTime );
Аватара пользователя
ShadowWarrior
UNец
 
Сообщения: 22
Зарегистрирован: 22 апр 2018, 17:37

Re: Создание инерции

Сообщение 1max1 01 июл 2018, 13:50

что-то я не увидел здесь управление через ригидбади...
вообще гравитация и не нужна, достаточно поставить сопротивление воздуху, чтобы объект тормозил
https://docs.unity3d.com/ScriptReferenc ... ocity.html
https://docs.unity3d.com/ScriptReferenc ... -drag.html
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Создание инерции

Сообщение ShadowWarrior 01 июл 2018, 14:03

1max1 писал(а):что-то я не увидел здесь управление через ригидбади...
вообще гравитация и не нужна, достаточно поставить сопротивление воздуху, чтобы объект тормозил

Это действительно помогло, но теперь это немного не корректно работает, у меня объект поворачивается при нажатии A и D
if (Input.GetKey(KeyCode.A))
transform.Rotate(Vector3.forward, turns * Time.deltaTime);
if (Input.GetKey(KeyCode.D))
transform.Rotate(Vector3.forward, -turns * Time.deltaTime);
Сс новым управлением объект летит просто прямо по оси Y вверх и вниз, а нужно чтобы он летел в направлении поворота. Или систему поворота тоже нужно менять?
Аватара пользователя
ShadowWarrior
UNец
 
Сообщения: 22
Зарегистрирован: 22 апр 2018, 17:37

Re: Создание инерции

Сообщение 1max1 01 июл 2018, 14:14

для поворота есть это
https://docs.unity3d.com/ScriptReferenc ... orque.html
https://docs.unity3d.com/ScriptReferenc ... ocity.html
но мне кажется ты что-то намудрил с управлением и поворот тут не причем, покажи как теперь ты управляешь
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Создание инерции

Сообщение ShadowWarrior 01 июл 2018, 14:54

void Update() {
if (Input.GetKey(KeyCode.W))
{

m_Rigidbody2D.velocity = Vector2.up * m_Speed;
}


if (Input.GetKey(KeyCode.S))
{

m_Rigidbody2D.velocity = Vector2.down * m_Speed;
}
Или нужно поменять Vector2.up и Vector2.down на что-то другое.
И при использовании public void AddTorque(float torque, ForceMode2D mode = ForceMode2D.Force);
AddTorque Выделяется волнистой линией и скрипт не функционирует вообще.
Аватара пользователя
ShadowWarrior
UNец
 
Сообщения: 22
Зарегистрирован: 22 апр 2018, 17:37

Re: Создание инерции

Сообщение 1max1 01 июл 2018, 15:15

Или нужно поменять Vector2.up и Vector2.down на что-то другое.

Синтаксис:
Используется csharp
var velocity = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"), 0.0f);
m_Rigidbody2D.velocity = velocity * m_Speed;

AddTorque Выделяется волнистой линией и скрипт не функционирует вообще.

В смысле волнистой линией? Что в консоле пишет? У меня всё отлично:
Синтаксис:
Используется csharp
var rb2d = GetComponent<Rigidbody2D>();
rb2d.AddTorque(30.0f, ForceMode2D.Impulse);
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Создание инерции

Сообщение ShadowWarrior 01 июл 2018, 21:59

Я какой-то глупый что ли?) Теперь повороты работают, но у меня был смысл управления в другом. Нужно чтобы мой объект летел в том направлении куда "смотрит" , а тут получается что он летит строго по оси Y .
Может я опять что-то в скрипте намудрил?
void Update() {
var velocity = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"), 0.0f);
if (Input.GetKey(KeyCode.W))
{

m_Rigidbody2D.velocity = velocity * m_Speed;
}


if (Input.GetKey(KeyCode.S))
{

m_Rigidbody2D.velocity = velocity * m_Speed;
}
var rb2d = GetComponent<Rigidbody2D>();


m_Rigidbody2D.velocity = velocity * m_Speed;

if (Input.GetKey(KeyCode.A))
rb2d.AddTorque(-0.3f, ForceMode2D.Impulse);
if (Input.GetKey(KeyCode.D))
rb2d.AddTorque(0.3f, ForceMode2D.Impulse);
}
Аватара пользователя
ShadowWarrior
UNец
 
Сообщения: 22
Зарегистрирован: 22 апр 2018, 17:37

Re: Создание инерции

Сообщение 1max1 01 июл 2018, 22:14

Кажется, я понял что ты хочешь сделать, тебе нужно знать вектор, который будет направляющим, к примеру transform.up
Синтаксис:
Используется csharp
void Update()
{
    if (Input.GetKey(KeyCode.W))
    {
        m_Rigidbody2D.velocity = (Vector2)transform.up * m_Speed;
    }

    if (Input.GetKey(KeyCode.S))
    {
        m_Rigidbody2D.velocity = (Vector2)transform.up * -m_Speed;
    }

    if (Input.GetKey(KeyCode.A))
        m_Rigidbody2D.AddTorque(-0.3f, ForceMode2D.Impulse);
    if (Input.GetKey(KeyCode.D))
        m_Rigidbody2D.AddTorque(0.3f, ForceMode2D.Impulse);
}
 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Создание инерции

Сообщение ShadowWarrior 01 июл 2018, 22:34

Да это действительно очень хорошо управляется и выглядит, спасибо! А можно сделать как-то ограничение на поворот, чтобы объект крутился не на все 360, а на пол оборота, например 80 градусов?
Аватара пользователя
ShadowWarrior
UNец
 
Сообщения: 22
Зарегистрирован: 22 апр 2018, 17:37

Re: Создание инерции

Сообщение 1max1 01 июл 2018, 22:55

Как-то так, писал от руки, так что могут быть ошибки:
Синтаксис:
Используется csharp
float startEulerZ;

void Start()
{
    startEulerZ = transform.eulerAngles.z;
}

void LateUpdate()
{
    var eulerAngles = transform.eulerAngles;
    eulerAngles.z = Mathf.Clamp(eulerAngles.z, startEulerZ - 40.0f, startEulerZ + 40.0f);
    transform.eulerAngles = eulerAngles;
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Создание инерции

Сообщение ShadowWarrior 01 июл 2018, 23:08

Отлично, то что нужно, только убрал transform.eulerAngles = eulerAngles; за ненадобностью . Большое спасибо, за то что помогаешь новичкам в изучении юнити, доходчиво объясняешь, как я считаю =)
Аватара пользователя
ShadowWarrior
UNец
 
Сообщения: 22
Зарегистрирован: 22 апр 2018, 17:37

Re: Создание инерции

Сообщение ShadowWarrior 01 июл 2018, 23:11

А хотя transform.eulerAngles = eulerAngles; нужен, но при нажатии D происходит баг и градусы как бы сбрасываются, а с кнопкой A все в порядке
Аватара пользователя
ShadowWarrior
UNец
 
Сообщения: 22
Зарегистрирован: 22 апр 2018, 17:37

Re: Создание инерции

Сообщение 1max1 02 июл 2018, 10:30

Ну можно и по другому попробовать:
Синтаксис:
Используется csharp
public class test : MonoBehaviour {

    const float clampAngle = 40.0f;

    Vector3 startDirection;
    Quaternion startRotation;

    void Start()
    {
        startDirection = transform.up;
        startRotation = transform.rotation;
    }

    void LateUpdate()
    {
        float angle = Vector2.SignedAngle(startDirection, transform.up);

        if (Mathf.Abs(angle) > clampAngle)
            transform.rotation = startRotation * Quaternion.AngleAxis(Mathf.Sign(angle) * clampAngle, Vector3.forward);
    }
}
 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 23