Slot Machine

Gra jest prostą aplikacją typu "Point & Click" o charakterze edukacyjnym. Gracz wchodzi w interakcję z maszyną typu "Jednoręki Bandyta". Po pociągnięciu za dźwignię, zamiast wygranej, uruchamiana jest animacja wyświetlająca kluczowy przekaz gry: "Hazard Szkodzi Zdrowiu". Zasada działania: Gracz klika przycisk/dźwignię. Skrypt podmienia grafikę maszyny (symulując ruch wajchy), odczekuje chwilę, a następnie aktywuje ukryte animacje, które wyświetlają napis ostrzegawczy.

Written By Coder Matthew

Last updated 6 months ago


1) Grafiki i Zasoby użyte w Slot Machine

Poniżej znajdują się kluczowe elementy wizualne widoczne w folderze Assets oraz na scenie.

Nazwa Zasobu

Opis Wizualny

Zastosowanie w Skryptach

bandyta (Sprite)

Główna grafika automatu do gry z dźwignią w pozycji "w górę".

Podstawowy wygląd obiektu bandyta. Przypisany jako normalSprite w skrypcie Click.

bandyta_clicked

Grafika automatu z dźwignią pociągniętą w dół.

Przypisany jako clickedSprite. Skrypt podmienia na tę grafikę po aktywacji funkcji Trigg().

360_F_... (Tło)

Ciemne tło z wzorem karcianym (piki, kiery).

Statyczne tło (Canvas/Sprite) budujące klimat kasyna. Nie posiada logiki, służy jako warstwa wizualna.

Hazard Text

Napis "Hazard Szkodzi Zdrowiu" (widoczny na Game View).

Obiekt kontrolowany przez Animator. Domyślnie ukryty lub niewidoczny, aktywowany przez zmienne animm1 / animm2.

F (Font)

Czcionka użyta do napisów.

Wykorzystywana przez komponent TextMeshPro do wyświetlania hasła oraz kwoty "100$".


2) Hierarchia w Unity

Hierarchia elementów

Oto jak zbudowana jest scena (na podstawie panelu Hierarchy):

  • Main Camera

    • Odpowiada za widok gry. Ustawiona statycznie na automat.

  • Global Light 2D

    • Zapewnia oświetlenie sceny 2D (wymagane przy użyciu Sprite'ów z materiałami reagującymi na światło).

  • EventSystem

    • Niezbędny do obsługi kliknięć i interakcji z interfejsem UI.

  • 360_F_27629... (Tło)

    • Obiekt graficzny stanowiący tło całej sceny (tapeta z wzorami kart).

  • bandyta

    • Serce logiki gry. Obiekt reprezentujący maszynę losującą.

    • Posiada komponent SpriteRenderer (wyświetla maszynę).

    • Posiada przypięty skrypt Click, który steruje całą interakcją.

  • Text (TMP)

    • Element tekstowy (TextMeshPro), wyświetlający początkową kwotę lub komunikaty UI.


3) Skrypty użyte w Slot Machine

W projekcie wykorzystano jeden główny skrypt sterujący logiką.

Click

Skrypt odpowiedzialny za symulację pociągnięcia dźwigni i wywołanie efektu końcowego (pojawienie się napisu).

  • Zarządzanie Sprite'ami: Przechowuje dwie wersje grafiki maszyny: normalSprite (dźwignia góra) i clickedSprite (dźwignia dół).

  • Korekta Pozycji: Bardzo ważna funkcja – przy zamianie grafik (które mogą mieć różne rozmiary), skrypt oblicza różnicę w pozycji dolnej krawędzi (bounds.min.y) i przesuwa obiekt, aby maszyna nie "skakała" po ekranie przy zmianie grafiki.

  • Sekwencja Czasowa: Używa korutyny (IEnumerator), aby odczekać changeTime (2 sekundy) przed przywróceniem dźwigni.

  • Aktywacja Finału: Po zakończeniu ruchu dźwigni, włącza komponenty Animator na obiektach animm1 i animm2, co powoduje wjazd/pojawienie się napisu "Hazard Szkodzi Zdrowiu".


4) Całe skrypty

Poniżej znajdziesz kompletny kod użyty w grze wraz z komentarzami wyjaśniającymi działanie poszczególnych bloków.

Example
using UnityEngine; public class Click : MonoBehaviour { public SpriteRenderer targetSprite; public Sprite normalSprite; public Sprite clickedSprite; public float changeTime = 2f; public GameObject animm1; public GameObject animm2; private bool isChanging = false; public void Trigg() { if (!isChanging) StartCoroutine(ChangeSpriteTemporarily()); } private System.Collections.IEnumerator ChangeSpriteTemporarily() { isChanging = true; float bottomBefore = targetSprite.bounds.min.y; targetSprite.sprite = clickedSprite; yield return null; float bottomAfter = targetSprite.bounds.min.y; float delta = bottomBefore - bottomAfter; targetSprite.transform.position += new Vector3(0, delta, 0); yield return new WaitForSeconds(changeTime); bottomBefore = targetSprite.bounds.min.y; targetSprite.sprite = normalSprite; yield return null; bottomAfter = targetSprite.bounds.min.y; delta = bottomBefore - bottomAfter; targetSprite.transform.position += new Vector3(0, delta, 0); isChanging = false; animm1.GetComponent<Animator>().enabled = true; animm2.GetComponent<Animator>().enabled = true; } }