Sterowanie ruchem za pomocą klawiatury w Unity 3D

0

Witam,
Posiadam pewien problem w Unity3D (dopiero się uczę).
Problem jest taki, że chcę, aby obiekt poruszał się w inną stronę, gdy np. trzymamy klawisz "W" (wtedy ten obiekt idzie w przód), i gdy jednocześnie naciśniemy klawisz "S" to chcę, aby ten obiekt poruszał się w dół i tak dla każdego przypadku, jednak coś nie chce działać po mojej myśli, spowodowane pewnie jest to brakiem mojej wiedzy. Prosiłbym o jakieś rozwiązanie, pozdrawiam serdecznie.
Kod:

	void Update ()
    {
        zmienPozycje();
	}

    void zmienPozycje()
    {
        if(Input.GetKey(KeyCode.W))
        {
            doPrzodu();
        }

        if(Input.GetKey(KeyCode.S))
        {
            doTylu();
        }
    }

    void doPrzodu()
    {
        Debug.Log("W przod");
        if(Input.GetKey(KeyCode.S))
        {
            Debug.Log("W dol");
        }

        else if (Input.GetKey(KeyCode.A))
        {
            Debug.Log("W lewo");
        }

        else if (Input.GetKey(KeyCode.D))
        {
            Debug.Log("W prawo");
        }
    }

    void doTylu()
    {
        Debug.Log("W dol");
        if (Input.GetKey(KeyCode.W))
        {
            Debug.Log("W przod");
        }
    }
0

Dla każdego przypadku, po naciśnięciu "S" ma poruszać się w dół, tak?
Czyli ruch w dół ma być priorytetem:
W pseudokodzie:

if(Key.S)
    rusz w dół
else if(Key.W)
    rusz w górę

(??? chyba nie o to chodzi, bo twój kod robi co innego)

Załóż, że gracz naciska "W" i "S".
Sprawdzasz najpierw pierwszy if - prawda. Przesuwasz do przodu.
Sprawdzasz kolejny warunek w tym pierwszym if'ie - prawda. Przesuwasz do tyłu.

Sprawdzasz kolejny(drugi) if - prawda. Przesuwasz do tyłu.
Sprawdzasz w drugim if'ie - prawda. Przesuwasz do przodu.
Chyba coś poszło nie tak?

Musiałbyś zaskryptować każdy( wciśnięty tylko W, wciśnięty WS, itd...) case w przeciwnym wypadku program będzie przechodził przez każdy.
Zainteresuj się Input.GetAxit( nazwa )

0

Spróbowałem zrobić to na switch case, jednak nadal nie działa, gdy zrobiłem wszystkie warunki do klawisza "S", to jak przyciskam klawisz "W" i "S" nie działa "S" jakby go nie było, analogicznie jest, gdy trzymam klawisz "S" i próbuję dać klawisz "W" to nie działa.
Kod:

public class TestScript : MonoBehaviour
{
    Rigidbody rigi;
    public int kierunek;
    Vector3 direction = Vector3.zero;

    void Start ()
    {
        rigi = transform.GetComponent<Rigidbody>();
	}
	

	void Update ()
    {
        zmienPozycje();
	}

    void zmienPozycje()
    {
        if(Input.GetKey(KeyCode.W))
        {
            zmianaKierunku();
            kierunek = 5;
        }
        if(Input.GetKey(KeyCode.S))
        {
            zmianaKierunku();
            kierunek = 4;
        }
    }

    void zmianaKierunku()
    {
        switch (kierunek)
        {
            case 5:
                direction = -Vector3.left;
                if(Input.GetKey(KeyCode.S))
                {
                    direction = Vector3.left;
                }
                if(Input.GetKey(KeyCode.A))
                {
                    direction = Vector3.forward;
                }
                if(Input.GetKey(KeyCode.D))
                {
                    direction = -Vector3.forward;
                }
                rigi.AddTorque(direction * 20f);
                break;
            case 4:
                direction = Vector3.left;
                if(Input.GetKey(KeyCode.W))
                {
                    direction = -Vector3.left;
                }
                if(Input.GetKey(KeyCode.A))
                {
                    direction = Vector3.forward;
                }
                if(Input.GetKey(KeyCode.D))
                {
                    direction = -Vector3.forward;
                }
                rigi.AddTorque(direction * 20f);
                break;
0
  1. W metodzie zmienPozycje() zamień GetKey() na GetKeyDown().

  2. W zmianaKierunku() wywal w obydwu case'ach rigi.AddTorque(direction * 20f); i dodaj to (rigi.AddTorque(direction * 20f);) na koniec metody (po switchu).

  3. Do switcha w zmianaKierunku() dodaj default, który ustawia direction na Vector3.zero.

  4. zmianaKierunku() wykonuj na końcu metody zmienPozycje(). Usuń wywołanie metody zmianaKierunku() z if'ów.

Powinno działać. Chociaż kod piękny nie będzie. Powyższe wskazówki podałem, żeby nie zmieniać za dużo ;)

0
void zmienPozycje()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            direction = Vector3.right;
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            direction = Vector3.left;
        }
        if (Input.GetKeyDown(KeyCode.A))
        {
            direction = Vector3.forward;
        }
        if (Input.GetKeyDown(KeyCode.D))
        {
            direction = Vector3.back;
        }

        if (Input.anyKey) {
                rigi.AddTorque(direction * 20f);
        }
    }

    void Update ()
    {
        zmienPozycje();
    }

Może być?

anyKey to taki skrót, żeby nie pisać Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D) || [...]
Będzie generowało błędy, jeśli Twoje sterowanie urozmaicisz o inne akcje niż poruszanie.

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