Инерция космоса без встроенной физики Unity

Общие вопросы о Unity3D

Инерция космоса без встроенной физики Unity

Сообщение Kuzub4eG 29 дек 2021, 22:41

Добрый день!
Прошу помощи в реализации движения двумерного объекта с инерцией (в космосе)
Реализация предполагает НЕ использовать встроенную физику Unity
Есть 2д объект, космический корабль:

[SerializeField] private float SpeedMove = 2f;
[SerializeField] private float SpeedRotate = 2f;
[SerializeField] private float Speedinertion = 1f;
[SerializeField] private float Retriatinertion = -0.2f;

Корабль может поворачиваться и двигаться только вперед (куда смотрит)
float rotation = this.transform.localEulerAngles.z;
rotation -= Input.GetAxis("Horizontal") * SpeedRotate;

Корабль может ускоряться до определенного ограничения, и если он не разгоняется, то накопленное ускорение постепенно падает (тормозится)
float tempMove = Mathf.Clamp(player.getMove() + (Input.GetAxis("Vertical") > 0 ? Input.GetAxis("Vertical") : Retriatinertion) * Speedinertion * Time.fixedDeltaTime, 0, 1);
player.setMove(tempMove);
player.setDirection(this.transform.up);

А вот как рассчитать накапливаемую инерцию никак не соображу. Я предполагаю, что результирующее перемещение должно складываться из двух векторов
вектора движения от ускорения :
Vector3 moveVector = player.getDirection() * SpeedMove * player.getMove() * Time.fixedDeltaTime;
и вектора движения от инерции ( который должен влиять на движение в случае смены направления или остановки ускорения) :
Vector3 inertionVector = player.getInertionDirection() * SpeedMove * player.getInertion() * Time.fixedDeltaTime;

т е результирующее перемещение должно выглядеть как то так:
this.transform.Translate(moveVector + inertionVector, Space.World);

Но как рассчитать корректные getInertionDirection (вектор направления инерции) и getInertion (величина инерции)?
Пока все что пробовал не приводит к желаемому результату.
Кажется, что это должно решаться не самыми сложными формулами векторной математики, но никак не найду нужные.

Спасибо за ответы!
Kuzub4eG
UNец
 
Сообщения: 9
Зарегистрирован: 29 дек 2021, 22:22

Re: Инерция космоса без встроенной физики Unity

Сообщение samana 30 дек 2021, 00:11

Kuzub4eG писал(а):Корабль может поворачиваться и двигаться только вперед (куда смотрит)

Тогда это не будет похоже на инерцию движения в космосе. Скорее это будет напоминать движения автомобиля.
Код ниже двигает спрайт только в направлении его "взгляда" (ось up).

Синтаксис:
Используется csharp
using UnityEngine;

public class Ship : MonoBehaviour
{
    public float GasForce = 1f; // сила газа
    public float SpeedLimit = 3; // ограничение скорости
    public float SpeedDamping = 0.96f; // сила трения, чем ближе к 1, тем дольше тормозит

    private float _currentSpeed;
   
    void Update()
    {
        _currentSpeed += GasForce * Input.GetAxis("Vertical");
        _currentSpeed = Mathf.Clamp(_currentSpeed, -SpeedLimit, SpeedLimit);
        _currentSpeed *= SpeedDamping;


        transform.Rotate(Vector3.forward, Input.GetAxis("Horizontal") * -1f);
        transform.Translate(transform.up * _currentSpeed, Space.World);
    }
}


------------------------------------------------------------------

Но в космосе (или в воде) должно быть другое поведение. Корабль должно заносить при поворотах. Грубо говоря он должен дрифтовать.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Инерция космоса без встроенной физики Unity

Сообщение Kuzub4eG 30 дек 2021, 08:03

samana писал(а):
Kuzub4eG писал(а):Корабль может поворачиваться и двигаться только вперед (куда смотрит)

Тогда это не будет похоже на инерцию движения в космосе. Скорее это будет напоминать движения автомобиля.
Но в космосе (или в воде) должно быть другое поведение. Корабль должно заносить при поворотах. Грубо говоря он должен дрифтовать.

------------------------------------------------------------------

Именно про дрейф и идет речь! Я имел в виду, что кораблю можно придать ускорение толлько в ту сторону, куда он смотрит сам
Т е если он смотрит строго вверх, при нажатии газа он начинает постепенно двигаться по оси Y. Если отпустить газ, он еще некоторое время замедляясь будет лететь по оси Y в верх. Если в этот момент повернуть корабль га 90 градусов в право например, он так же должен продолжать лететь по оси Y, но уже боком, и при нажатии газа начинать движение по оси Х, но при этом еще некоторое время его должно сносить по Y.
Я пробовал запоминать направление движения корабля при газе, и при сбросе газа переводить накопленное ускорение и текущее направление в инерцию - тогда по началу кажется что все работает как надо. Но тогда выходит, что если давать короткие "прогазовки", то вектор и скорость инерции постоянно сбрасывается и корабль ведет себя не так как хочется.
Как сделать постоянно динамически рассчитывающийся вектор инерции? что бы он влиял на корабль всегда, и при поворотах во время газа, и при отпускании газа вообще и т д
Kuzub4eG
UNец
 
Сообщения: 9
Зарегистрирован: 29 дек 2021, 22:22

Re: Инерция космоса без встроенной физики Unity

Сообщение samana 30 дек 2021, 09:32

Kuzub4eG писал(а):Именно про дрейф и идет речь!

Тогда это совсем не сложно. Достаточно добавлять инерцию только при газе по направлению взгляда корабля.

Синтаксис:
Используется csharp
using UnityEngine;

public class Ship : MonoBehaviour
{
    public float GasForce = 1f; // сила газа
    public float SpeedLimit = 3; // ограничение скорости

    private Vector3 _inertion;
    private float _inertionDamping = 0.96f;


    private void Update()
    {
        float gas = Input.GetAxis("Vertical");

        _inertion += transform.up * gas;
        _inertion = Vector3.ClampMagnitude(_inertion, SpeedLimit);


        _inertion *= _inertionDamping;

        transform.Rotate(Vector3.forward, Input.GetAxis("Horizontal") * -3f);
        transform.Translate(_inertion, Space.World);
    }
}
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Инерция космоса без встроенной физики Unity

Сообщение Kuzub4eG 30 дек 2021, 20:38

samana писал(а):
Kuzub4eG писал(а):Именно про дрейф и идет речь!

Тогда это совсем не сложно. Достаточно добавлять инерцию только при газе по направлению взгляда корабля.

В принципе эффект почти нужный, я добивался такого, но более сложными вычислениями))
Спасибо за более оптимальный вариант!

Добавил более плавный набор скорости:
using UnityEngine;

public class Move : MonoBehaviour
{
public float GasForce = 0.1f; // сила газа
public float StopForce = -2f; // сила торможения
public float SpeedLimit = 0.1f; // ограничение скорости

private Vector3 _inertion;
public float _inertionDamping = 0.9f;
float gas;

private void FixedUpdate()
{
gas = Mathf.Clamp( gas + (Input.GetAxis("Vertical") > 0 ? Input.GetAxis("Vertical") : StopForce) * GasForce* Time.fixedDeltaTime, 0 , 1);

_inertion += transform.up * gas * Time.fixedDeltaTime;
_inertion = Vector3.ClampMagnitude(_inertion, SpeedLimit);


_inertion *= _inertionDamping;

transform.Rotate(Vector3.forward, Input.GetAxis("Horizontal") * -1f);
transform.Translate(_inertion, Space.World);
}
}

Но в идеале хочется, что бы эффект инерции прилагался не в сторону куда смотрит корабль, а в сторону куда он ускорялся, т е после набора скорости , при повороте корабля, хочется что бы его не начинало сносить в ту сторону, куда он повернулся, а в ту, куда он ускорялся ранее
В любом случае, спасибо за ответ!
Kuzub4eG
UNец
 
Сообщения: 9
Зарегистрирован: 29 дек 2021, 22:22

Re: Инерция космоса без встроенной физики Unity

Сообщение samana 30 дек 2021, 21:31

Kuzub4eG писал(а):о в идеале хочется, что бы эффект инерции прилагался не в сторону куда смотрит корабль, а в сторону куда он ускорялся,

Так сейчас именно это и происходит, разве нет? Странно, у меня работает ожидаемо. Например корабль смотрит вправо, нажимаю газ, корабль летит вправо. Отпускаю газ, кручу корабль, но он по инерции продолжает "скользить" только вправо.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Инерция космоса без встроенной физики Unity

Сообщение Kuzub4eG 30 дек 2021, 22:38

samana писал(а):
Kuzub4eG писал(а):о в идеале хочется, что бы эффект инерции прилагался не в сторону куда смотрит корабль, а в сторону куда он ускорялся,

Так сейчас именно это и происходит, разве нет? Странно, у меня работает ожидаемо. Например корабль смотрит вправо, нажимаю газ, корабль летит вправо. Отпускаю газ, кручу корабль, но он по инерции продолжает "скользить" только вправо.


Все, нашел ошибку) Я же вынес отдельно расчет Gas, и input не влиял напрямую на инерцию, переделал:

using UnityEngine;

public class Move : MonoBehaviour
{
public float GasForce = 0.05f; // сила газа
public float StopForce = -2f; // сила торможения
public float SpeedLimit = 0.05f; // ограничение скорости

private Vector3 _inertion;
public float _inertionDamping = 0.99f;
float gas;

private void FixedUpdate()
{
gas = Mathf.Clamp( gas + (Input.GetAxis("Vertical") > 0 ? Input.GetAxis("Vertical") : StopForce) * GasForce* Time.fixedDeltaTime, 0 , 1);

_inertion += transform.up * Input.GetAxis("Vertical") * gas * Time.fixedDeltaTime;
_inertion = Vector3.ClampMagnitude(_inertion, SpeedLimit);


_inertion *= _inertionDamping;

transform.Rotate(Vector3.forward, Input.GetAxis("Horizontal") * -1f);
transform.Translate(_inertion, Space.World);
}
}

Сейчас работает как надо!
Спасибо!
Kuzub4eG
UNец
 
Сообщения: 9
Зарегистрирован: 29 дек 2021, 22:22


Вернуться в Общие вопросы

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9