Unity - problem ze skakaniem, platformowka mobilna


#1

Witajcie. Chcialbym zapytac dlaczego nie dziala mi skok. Udalo mi sie ustalic, ze koliduja ze soba dwie funkcje:

        private void FixedUpdate()
        {
            directionX = CrossPlatformInputManager.GetAxis("Horizontal");

            rb.velocity = new Vector2(directionX * speed, 0);

            Flip(directionX);

            Animator.SetFloat("Speed", Mathf.Abs(directionX));
        }

oraz:

    void Update ()
    {
        if (CrossPlatformInputManager.GetButtonDown("jump"))
        {
            rb.AddForce(new Vector2(0, jumpForce));
        }
    }

Jezeli jedna z nich zakomentuje nagle problem znika. Mianowicie, jezeli zakomentuje FixedUpdate to player skacze normalnie(czas wyskoku jest naturalny), lecz jezeli obie funkcje na siebie ‘nachodza’ to player wyskakuje natychmiastowo w docelowe miejsce, tj. jakby sie teleportowal. Tutaj moje pytanie, cos ze soba koliduje czy to kod, czy moze FixedUpdate z Updatem powinny byc inaczej uzywane? Kiedys czytalem o roznicy miedzy funkcjami, lecz nie wiem czy to tu jest problem. Licze na pomoc i zycze udanego dnia! :slight_smile:


#2

Z tego co wiem FixedUpdate and Update pracują na jednym wątku więc nie mogą być używane w tym samym czasie.


#3

Zmien FixedUpdate na LateUpdate


#4

Dlaczego nie moga byc razem? Moga byc, moga byc nawet update, late i fixed w tym samym skrypcie.
Fixed jest bardziej do fizyki itp, ruchu rigidbody itp. jest wywolywany duzo czesciej, przy kazdym update fizyki i do tego czas pomiedzy wywolaniami jest taki sam.
update jest wywolywany co klatke, i uzywany bardziej do standardowych rzeczy.
A late jest na koncu i np do ruchu kamery itp gdzie nie ptrzeba takiej dokladnosci itp itd… wiec nigdy w zyciu nei uzywaj lateupdate do zmieniania rigidbody bo poprostu nie :smiley:

ustawiasz velocit w jednym skrypcie a dodajesz force w drugim… co z tego jak dodasz force jak pozneij ustawiasz velocity. tak samo jak masz gravity i to gravity daje ci force np w Y-Axis… to i tak ty ustawiasz co chwile na 0 w fixedUpdate. wiec nawet jak bedziesz mial GravityScale 1 (default) to ten obiekt nei bedzie spadal w dol tak jak powienine bo co chwile bedzie ustawiony Y-velocity na 0.

W skrocie - dodajesz force a za chwile i tak ustawiasz velocity na co innego.

dodaj poporstu ten ruch co masz w fixed do aktualnego wektora velocity i powinno raczej dzialac normlanie.
cos w stylu rb.velocity = rb.velocity + new Vector2(directionX * speed, 0);
nie sprwadzalem ale raczej zadziala tak jak powinno, ale pewnie musisz dodwac tylko Y w towim przypadku ale popsrwdzaj

Sorki za chatoyczne pisanie ale mam zly dzien.


#5

@RoboCat Dzieki wielkie! Swoja wypowiedzia natchnales mnie na jedna wazna rzecz… w nawiasie
(directionX * speed, 0);

powinno byc

(directionX * speed, rb.velocity.y)

Dzieki za inspiracje! :slight_smile:


#6

prosze bardzo :]
w sumie tak powinno byc, na szybko pisalem bez myslenia, bardziej ogolnei gdzie jest blad.