Prędkość poruszania się gracza

Prędkość poruszania się gracza
M0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
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:

Kopiuj
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.

WhiteLightning
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3257
0

Przekaz mniejsze wartosci amount do funkcji rotate i thrust forward.

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

LukeJL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8488
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?

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6968
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.

YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 252
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.

M0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
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.

Boski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 142
0

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

YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 252
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:

Kopiuj
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:

Kopiuj
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.

M0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

Tutaj link do filmiku:

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.