• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Dziwne zachowanie kursora (C#/UNITY 3D)

Object Storage Arubacloud
0 głosów
1,245 wizyt
pytanie zadane 26 kwietnia 2018 w C# przez wanttobeanengineer Obywatel (1,120 p.)
zamknięte 27 kwietnia 2018 przez wanttobeanengineer

Dobry wieczór, 

Robię na zaliczenie do szkoły grę komputerową w unity 3D, skrypty piszę w C#. 
Zrobiłem inwentarz, który pojawia się po naciśnięciu klawisza 'I' oraz znika po ponownym jego naciśnięciu lub naciśnięciu 'ESC'. Dopisałem dwie linijki, które powinny w takim sam sposób sterować widocznością kursora na ekranie, tzn. jeśli inventarz jest widoczny to kursor też, jeśli inventarz nie widoczny to i kursor również.

Napisałem do tego dwa warunki w funkcji Update() (klasa InventoryUI):

 


    void Update()
    {

        if (Input.GetKeyDown(KeyCode.I))
        {
            Cursor.visible = !Cursor.visible;
            inventoryUI.SetActive(!inventoryUI.activeSelf);
        }
        if (inventoryUI.activeSelf && Input.GetKeyDown(KeyCode.Escape))
        {
            Cursor.visible = !Cursor.visible;
            inventoryUI.SetActive(!inventoryUI.activeSelf);
        }
    }

Pierwszy warunek działa na takiej zasadzie, że jeśli klaiwsz 'I' został naciśnięty, to zmienia stan logiczny widoczności kursora i inwentarza na przeciwny.
Drugi warunek natomiast zadziała tylko wtedy, gdy inwentarz jest włączony a gracz nacisnął klawisz 'ESC'. 
On równiez neguje stany logiczne tych dwóch elementów.

Problem polega na tym, że jeśli uruchomie inwentarz za pierwszym razem, ten się pokazuje, ale kursor tylko pokaże się na ułamek sekundy i znika, jeśli go zamknę poprzez naciśnięcie 'I' oraz otworze ponownie - ta sama sytuacja.

Jeśli natomiast otworzę inwentarz a następnie zamknę go klawiszem 'ESC' i wtedy otworzę ponownie, to kursor działa normalnie zarówno po naciśnięciu klawisza 'I' jak i 'ESC' aby otworzyć/zamknąć inwentarz. (ESC służy tylko do zamykania). 

Próbowałem również w drugim warunku napisać Cursor.visible = false; ale sytuacja taka sama.
W metodzie Start() próbowałem zainicjalizować zmienną Cursor.visible poprzez przypisanie jej false, ale to również nic nie dało. Co więcej w skrypcie uruchamianym razem z grą również inicjalizowałem tą zmienną fałszem, ale sytuacja ta sama.

Co mogłem zrobić nie tak?

Pozdrawiam.

 

 

EDIT::
Zmieniłem troszkę kod:
 

bool isCursorVisible = false;

void Start()
    {
        inventory = Inventory.instance;
        inventory.onItemChangedCallback += UpdateUI;
        
        slots = itemsParent.GetComponentsInChildren<InventorySlot>();
        isCursorVisible = false;

    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.I))
        {
            isCursorVisible = !isCursorVisible;
            inventoryUI.SetActive(!inventoryUI.activeSelf);
        }
        if (inventoryUI.activeSelf && Input.GetKeyDown(KeyCode.Escape))
        {
            isCursorVisible = false;
            inventoryUI.SetActive(!inventoryUI.activeSelf);
        }
        Cursor.visible = isCursorVisible;
    }

I zauważyłem, że problem nie leży tylko po stronie widoczności kursora.
Teraz sytuacja jest podobna, z tym że po pierwszym naciśnięciu I kursor jest widoczny ale jest zablokowany (nie mogę nim ruszyć). Jeśli inwentarz wyłącze klawiszem I i włącze ponownie to sytuacja taka sama, aby działało, muszę wyłączyć go klawiszem ESC.

 

EDIT 2::

Problem rozwiązany:
 

  void Update()
    {
        if(Input.GetKeyDown(KeyCode.I))
        {
            inventoryUI.SetActive(!inventoryUI.activeSelf);
            if(inventoryUI.activeSelf) { Cursor.lockState = CursorLockMode.None; }
            else { Cursor.lockState = CursorLockMode.Locked; }
        }else if (Input.GetKeyDown(KeyCode.Escape) && inventoryUI.activeSelf)
        {
            inventoryUI.SetActive(!inventoryUI.activeSelf);
            Cursor.lockState = CursorLockMode.Locked;
        }
        Cursor.visible = inventoryUI.activeSelf;
    }

 

komentarz zamknięcia: Problem został rozwiązany samodzielnie.

Podobne pytania

0 głosów
1 odpowiedź 953 wizyt
0 głosów
1 odpowiedź 1,262 wizyt
pytanie zadane 27 kwietnia 2019 w C# przez Pytam_PL Użytkownik (520 p.)
0 głosów
1 odpowiedź 1,592 wizyt
pytanie zadane 3 sierpnia 2017 w OpenGL, Unity przez Stami Gaduła (3,790 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...