Страница 1 из 1

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

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

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

СообщениеДобавлено: 01 июл 2018, 13:37
1max1
можно ведь ригидбоди2д использовать, там уже всё продумано вместо тебя

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

СообщениеДобавлено: 01 июл 2018, 13:43
ShadowWarrior
1max1 писал(а):можно ведь ригидбоди2д использовать, там уже всё продумано вместо тебя

Этот компонент уже есть, но для моего проекта гравитация стоит на 0, возможно я использую не тот скрипт управления
Управление записано в void Update
transform.Translate( new Vector3(
Input.GetAxis("Horizontal") * speed,
Input.GetAxis("Vertical") * speedv,
0) * Time.deltaTime );

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

СообщениеДобавлено: 01 июл 2018, 13:50
1max1
что-то я не увидел здесь управление через ригидбади...
вообще гравитация и не нужна, достаточно поставить сопротивление воздуху, чтобы объект тормозил
https://docs.unity3d.com/ScriptReferenc ... ocity.html
https://docs.unity3d.com/ScriptReferenc ... -drag.html

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

СообщениеДобавлено: 01 июл 2018, 14:03
ShadowWarrior
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 вверх и вниз, а нужно чтобы он летел в направлении поворота. Или систему поворота тоже нужно менять?

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

СообщениеДобавлено: 01 июл 2018, 14:14
1max1
для поворота есть это
https://docs.unity3d.com/ScriptReferenc ... orque.html
https://docs.unity3d.com/ScriptReferenc ... ocity.html
но мне кажется ты что-то намудрил с управлением и поворот тут не причем, покажи как теперь ты управляешь

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

СообщениеДобавлено: 01 июл 2018, 14:54
ShadowWarrior
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 Выделяется волнистой линией и скрипт не функционирует вообще.

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

СообщениеДобавлено: 01 июл 2018, 15:15
1max1
Или нужно поменять 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);

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

СообщениеДобавлено: 01 июл 2018, 21:59
ShadowWarrior
Я какой-то глупый что ли?) Теперь повороты работают, но у меня был смысл управления в другом. Нужно чтобы мой объект летел в том направлении куда "смотрит" , а тут получается что он летит строго по оси 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);
}

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

СообщениеДобавлено: 01 июл 2018, 22:14
1max1
Кажется, я понял что ты хочешь сделать, тебе нужно знать вектор, который будет направляющим, к примеру 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);
}
 

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

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

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

СообщениеДобавлено: 01 июл 2018, 22:55
1max1
Как-то так, писал от руки, так что могут быть ошибки:
Синтаксис:
Используется 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;
}

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

СообщениеДобавлено: 01 июл 2018, 23:08
ShadowWarrior
Отлично, то что нужно, только убрал transform.eulerAngles = eulerAngles; за ненадобностью . Большое спасибо, за то что помогаешь новичкам в изучении юнити, доходчиво объясняешь, как я считаю =)

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

СообщениеДобавлено: 01 июл 2018, 23:11
ShadowWarrior
А хотя transform.eulerAngles = eulerAngles; нужен, но при нажатии D происходит баг и градусы как бы сбрасываются, а с кнопкой A все в порядке

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

СообщениеДобавлено: 02 июл 2018, 10:30
1max1
Ну можно и по другому попробовать:
Синтаксис:
Используется 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);
    }
}