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;
}