Marek Winiarski

Unity3d OneLine #2 – Własny kursor myszy

Unity3d OneLine – problemy, które da się rozwiązać w jednej linii kodu. Dosłownie!

Linia: Jak ustawić własny kursor myszy?

Kiedy pracujemy nad grą, w której głównym narzędziem sterowania jest widoczna myszka – tak jak ma to miejsce w przygodówkach czy grach strategicznych – chcemy żeby był on unikalny i utrzymany w klimacie. Praktycznie każda gra w swoim menu głównym, również posiada unikatowy kursor.

Pakiet kursorów z gry Dungeon Keeper
Pakiet kursorów z gry Dungeon Keeper

Rozwiązanie

Rozwiązanie jest bardzo proste, bo potrzebujemy w sumie tylko tekstury, którą przypisujemy za pomocą prostej funkcji:

Cursor.SetCursor(cursorTexture, hotSpot, cursorMode);

Czym są tutaj zmienne?

CursorTexture – to obiekt typu Texture2D, czyli zwykła tekstura, która będzie reprezentować kursor.

HotSpot – czyli faktyczne miejsce kliknięcia, liczone od lewego, górnego rogu tekstury. Tak jak ma to miejsce na przykładzie z rękami z Dungeon Keepera, hotspotem, będzie ten plusik.

CursorMode – Jest to opcja, która pozwala zdefiniować czy chcemy kursor sprzętowy (hardware) czy systemowy (software). Różnica jest bardzo techniczna. Kursor hardwareowy jest obsługiwany przez GPU. Kursor posiada pewną ramkę, która jest łatwo przesuwana, zaś sam kursor poruszający się w ramce nie musi być przerysowany. W wersji systemowej, każde przesunięcie kursora, to usunięcie grafiki i narysowanie jej na nowo w nowym miejscu. Niestety system Hardware, nie zawsze jest obsługiwany wszędzie.

public CursorMode cursorMode = CursorMode.Auto;
public CursorMode cursorMode = CursorMode.ForceSoftware;

Domyślnie, kursor będzie rysowany jako Hardwerowy (o ile to możliwe), a ta opcja pozwala jedynie wymusić rysowanie normalne.

Znamy teorię, teraz jak to wykorzystać? Domyślny kursor, najlepiej będzie ustawić w funkcji Start lub Awake, w skrypcie który startuje początkowo. Ale co ze zmianami kursora np. po najechaniu myszką? Możemy do obiektu dodać prosty skrypt:

void OnMouseEnter() {
    Cursor.SetCursor(cursorTexture, hotSpot, cursorMode);
}
void OnMouseExit() {
    Cursor.SetCursor(null, Vector2.zero, cursorMode);
}

OnMouseEnter ustawiamy sobie nasz kursor, zgodnie z poznaną funkcją. OnMouseExit, usuwamy teksturę, hotSpot ustawiamy na wektor wyzerowany (0, 0).

Gotowe!

Exit mobile version