Prędkość poruszania się gracza

0

Witam. Przerabiam tutorial z ytb na temat tworzenia gier. Ale po wpisaniu kody mój statek porusza się strasznie szybko, a ten z tutoriala spokojnie. Tutaj podaję kod jaki jest w filmiku:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ShipController : MonoBehaviour
{

    private Rigidbody2D rb;

    public float maxVelocity = 0;

    public float rotationSpeed = 0;
    
    private void Start()

    {
        rb = GetComponent<Rigidbody2D>();
  
    }
    private void Update()
    {
        float yAxis = Input.GetAxis("Vertical");
        float xAxis = Input.GetAxis("Horizontal");

        ThrustForward(yAxis);
        Rotate(transform, xAxis * rotationSpeed);

    }

    #region Maneuvering API
    private void ClampVelocity()
    {
        float x = Mathf.Clamp(rb.velocity.x, -maxVelocity, maxVelocity);
        float y = Mathf.Clamp(rb.velocity.y, -maxVelocity, maxVelocity);

        rb.velocity = new Vector2(x, y);

    }

    private void ThrustForward(float amount)
    {
        Vector2 force = transform.up * amount;

        rb.AddForce(force);
    }
    #endregion
    private void Rotate(Transform t, float amount)
    {
        t.Rotate(0, 0, amount);

    }

      
}


Proszę o pomoc, co zrobić by ten statek poruszał się wolniej i obracał wolniej bo obrót to jakaś masakra.

0

Przekaz mniejsze wartosci amount do funkcji rotate i thrust forward.

Albo szybki brzydki hack przemnoz je sobie w funkcji np przez 0.1.

0

float yAxis = Input.GetAxis("Vertical");
float xAxis = Input.GetAxis("Horizontal");

Strzelam, bo nie znam Unity, ale może to kwestia czułości inputa?

public float rotationSpeed = 0;

Czemu masz to na zero?

2
LukeJL napisał(a):

float yAxis = Input.GetAxis("Vertical");
float xAxis = Input.GetAxis("Horizontal");

Strzelam, bo nie znam Unity, ale może to kwestia czułości inputa?

Wartości zwracane przez GetAxis są tylko od -1.0 do 1.0, chyba, że czytamy dane z innego urządzenia, niż klawiatura/gamepad.
https://docs.unity3d.com/ScriptReference/Input.GetAxis.html
(@marcin0218: też to przeczytaj, bo jest tam przykładowy kod, z którym powinieneś się zapoznać)

LukeJL napisał(a):

public float rotationSpeed = 0;

Czemu masz to na zero?

W edytorze można nadawać wartości publicznym polom.
Obiekt z tym skryptem będzie miał wartość rotationSpeed ustawioną w edytorze.

1

Niezależnie od sedna problemu:

float x = Mathf.Clamp(rb.velocity.x, -maxVelocity, maxVelocity);
float y = Mathf.Clamp(rb.velocity.y, -maxVelocity, maxVelocity);

Czy to jest zalecane podejście? O ile pamiętam zalecenie jest, by albo oddziaływać na rigidbody siłami, albo ustawiać jego velocity, ale nie łączyć raczej obu tych metod, bo rezultaty mogą być dziwne. EDIT: To samo z ręcznym obracaniem gameObjectu za pomocą transform.Rotate, też chyba nie zaleca się łączyć tego z oddziaływaniem siłami na rigidbody CHYBA, że rigidbody ma zablokowaną rotację i jeszcze nie jestem pewien czy nie trzeba ręcznie wołać ResetInertiaTensor w każdym Update.

0
LukeJL napisał(a):

float yAxis = Input.GetAxis("Vertical");
float xAxis = Input.GetAxis("Horizontal");

Strzelam, bo nie znam Unity, ale może to kwestia czułości inputa?

public float rotationSpeed = 0;

Czemu masz to na zero?

Sorki, normalnie w tutorialu było 1, a zero wpisałem chwilę przed skopiowaniem kodu.

0

nie jestem teraz pewny, Input.GetAxis nie trzeba przemnożyć przez timeDelta jeszcze?

1
marcin0218 napisał(a):
LukeJL napisał(a):

float yAxis = Input.GetAxis("Vertical");
float xAxis = Input.GetAxis("Horizontal");

Strzelam, bo nie znam Unity, ale może to kwestia czułości inputa?

public float rotationSpeed = 0;

Czemu masz to na zero?

Sorki, normalnie w tutorialu było 1, a zero wpisałem chwilę przed skopiowaniem kodu.

To, co wpiszesz tu w kodzie nie ma znaczenia. Znaczenie ma tylko to, co ustawisz w edytorze.

Boski napisał(a):

nie jestem teraz pewny, Input.GetAxis nie trzeba przemnożyć przez timeDelta jeszcze?

Rzeczywiście, nie zauważyłem tego.

Usuwając kod nie mający związku z obracaniem:

marcin0218 napisał(a):

Witam. Przerabiam tutorial z ytb na temat tworzenia gier. Ale po wpisaniu kody mój statek porusza się strasznie szybko, a ten z tutoriala spokojnie. Tutaj podaję kod jaki jest w filmiku:

public class ShipController : MonoBehaviour
{
    public float rotationSpeed = 0;
    
    private void Update()
    {
        float xAxis = Input.GetAxis("Horizontal");

        Rotate(transform, xAxis * rotationSpeed);

    }

    private void Rotate(Transform t, float amount)
    {
        t.Rotate(0, 0, amount);
    }
}


Jeżeli obracasz statek ręcznie na podstawie inputa za pomocą Transform.Rotate to musisz przemnożnyć obrót przez Time.deltaTime.

Moim zdaniem metoda Rotate(Transform t, float amount) jest kompletnie zbędna i tylko zaciemnia kod w takim stopniu, że nawet nie zauważyłem tego błędu. Metoda, która woła jedną metodę to jakieś nieporozumienie. IMO problem objawiłby się dużo szybciej, gdyby Update wyglądała tak:

private void Update()
{
    // poprzednie linijki kodu
    transform.Rotate(0, 0, xAxis * rotationSpeed);
}

Puryści mnie zaraz pewnie zjadą, bo ostatenicze private void Rotate abstrachuje jakoś te dwa zera, ale trudno.


Przy okazji zauważyłem jeszcze jeden błąd.

Robisz RigidBody.AddForce w Update, a nie FixedUpdate. Jest to kolejna przyczyna, dla której tutaj mogą się cuda dziać.

Nie jestem 100% pewien, ale wydaje mi się, że Rigidbody.velocity też trzeba wołać w FixedUpdate, a nie w Update.

Co to za tutorial na YT? Bo wybacz, ale albo tutorial jest do bani i proponowałbym Ci przestać z niego korzystać, albo Ty robisz jakieś dziwne rzeczy niezgodnie z tutorialem.

Jeśli znasz angielski, a winny jest tu tutorial, to proponowałbym Ci korzystać z learn.unity.com - ten kurs nie jest idealny, ale mówi przynajmniej o takich rzeczach, jak różnica między FixedUpdate i Update itp. I uczy też czytania dokumentacji.

0

Tutaj link do filmiku:

1 użytkowników online, w tym zalogowanych: 0, gości: 1