Zróbmy sobie gre #3 - Nabijamy sobie STEEM!

in #polish6 years ago

Nareszcie nadszedł czas, by troszkę oskryptować nasz projekt. Dzięki przeorganizowaniu o którym pisałem w poprzednim poście, teraz będzie nam łatwiej z orientacją w obiektach. Co na dzisiaj? Ożywiamy nasz główny przycisk, który będzie nam dodawał STEEM oraz stworzymy "główny" obiekt, który będzie przechowywał informacje o ilości tokenów itd. Zajmijmy się najpierw tym obiektem.

Tworzymy pusty obiekt i nazywamy go GameController. Następnie w oknie "Project" klikamy PPMCreateFolder i nazywamy go "Scripts". Wchodzimy w niego i tworzymy skrypt (analogicznie jak folder, lecz wybieramy C# Script) o nazwie "GameController". Skrypt przeciągamy na wcześniej utworzony obiekt o tej samej nazwie.

Aktualnie potrzebne nam są 4 zmienne które będą nam przechowywały informacje o ilości STEEM, Obserwujących, STEEM Power i delegacji. Dodatkowo będzie zmieniał tekst które pokazują nam stan tych informacji w grze. Jeśli korzystamy z MonoDevelop to w nowo utworzonym skrypcie będzie taki o to kod:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameController : MonoBehaviour {
    // Use this for initialization
    void Start () {
        
    }
    // Update is called once per frame
    void Update () {
    }
}

Co to wszystko jest?

using ... - Dodanie biblioteki.
: MonoBehaviour - Dziedziczenie po klasie, MonoBehaviour to podstawowa klasa Unity.
void ... () - Funkcja. Tak napisana jest prywatna, czyli niedostępna z innej klasy (nie możemy wywołać funkcji z innego skryptu). Możemy poprzedzić ją słowami public/private/protected
void Start() - Specjalna funkcja która jest uruchamiana tylko raz, w momencie uruchomienia skryptu (czyli np. w momencie włączenia gry).
void Update() - Również specjalna funkcja. Uruchamiana jest razem z każdą klatką. Dla przykładu, jeśli gra ma 60FPS, to ta funkcja uruchomi się 60 razy na sekundę.


Na szybko opiszę podstawowe i najczęściej używane zmienne w Unity.

int - liczba całkowita,
float - liczba zmiennoprzecinkowa,
double - liczba zmiennoprzecinkowa, bardziej dokładna niż float,
char - pojedyńczy znak,
string - ciąg znaków,
bool - wartość boolowska, czyli True/False lub 0/1
GameObject - przyjmuje obiekt ze sceny lub projektu (jest to klasa!),
Transform - przyjmuje "transformacje" (przekształcenie) obiektu - mamy bezpośredni dostęp do pozycji, rotacji i skali obiektu (jest to klasa!).
Vector3 - współrzędne w 3 osiach (lub Vector2 - w 2 osiach) (jest to klasa!)
Jeśli coś zapomniałem - będzie w trakcie :)
Text/Image [...] - przyjmuje bezpośrednio komponent UI z obiektu


 
Ok, teraz trzeba napisać te zmienne które potrzebujemy. Wszystkie muszą być publiczne, czyli dostępne dla innych klas.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameController : MonoBehaviour {

    public float STEEM = 0;
    public float STEEM_Power = 0.100f;
    public float STEEM_Delegation = 14.500f;
    public float Followers = 0;

    public Text Txt_STEEM;
    public Text Txt_STEEM_Power;
    public Text Txt_STEEM_Delegation;
    public Text Txt_Followers;
    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        
    }
}

 

Żeby przyjmować komponenty UI do zmiennych, trzeba dodać bibliotekę UnityEngine.UI. Ok, ale widzimy, że przypisałem już pewne wartości do zmiennych liczbowych, ale co z tym Text? Mamy 2 wybory: albo przeciągniemy z hierarchii odpowiednie obiekty (wystarczy obiekt, zmienna sama "wyciągnie" z niego komponent), albo w skrypcie możemy je.. poszukać. Ja wybiorę tą drugą opcję.

W funkcji Start dodajemy ten kod:

Txt_STEEM = GameObject.Find ("Canvas/Txt_STEEM").GetComponent<Text> ();
Txt_STEEM_Power = GameObject.Find ("Canvas/Txt_STEEM_Power").GetComponent<Text> ();
Txt_STEEM_Delegation = GameObject.Find ("Canvas/Txt_STEEM_Delegation").GetComponent<Text> ();
Txt_Followers = GameObject.Find ("Canvas/Txt_Followers").GetComponent<Text> ();

Jak to działa?

Łopatologicznie
ZmiennaDoKtórejChcęCośPrzypisać = Klasa GameObject . Funkcja wyszukująca ("ścieżka do wyszukiwanego obiektu") . Funkcja pobierająca komponent < Komponent >()

Normalnie
Pobieramy podany komponent z konkretnego obiektu wyszukanego po podanej ścieżce i przypisujemy do zmiennej tego samego typu co komponent.
 

Jak widzimy ładnie to pobrało to co chcieliśmy. Dlaczego wybrałem ten sposób a nie przeciągnąłem po prostu tych obiektów? Po pierwsze - żeby pokazać jak wyszukiwać obiekty i jak pobrać komponenty, a po drugie - osobiście wolę ten sposób, ale tylko przy małych projektach. Wyszukiwanie i pobieranie długo zajmuje, za długo by pozwolić sobie je tak swobodnie wyszukiwać i pobierać. Przy tak małym projekcie, gdzie aktualnie wyszukujemy 4 obiekty, obciążenie nie jest zauważalne, ale gdy mamy duży projekt w którym potrzebujemy 500/1000 obiektów - może to zająć kilka jak nie kilkanaście milisekund - zależnie od sprzętu.


Teraz tekst który widzimy w grze musi się zmieniać względem zmiennych.
Do funkcji Update dodajemy kod:

Txt_STEEM.text = "STEEM: " + STEEM.ToString();
Txt_STEEM_Power.text = "STEEM Power" + STEEM_Power.ToString();
Txt_STEEM_Delegation.text = "(" + STEEM_Delegation.ToString() + ")";
Txt_Followers.text = "Followers: " + Followers.ToString ();

 
".text" to odwołanie się do zmiennej "text" która przyjmuje ciąg znaków typu string, dlatego do każdej przypisującej zmiennej innego typu (w naszym przypadku int) musimy dodać funkcję ToString() która zmieni wartości innego typu do typu string. Dodatkowo wyświetlamy napis, każdy osobny element musimy dodać znakiem "+". Nie, to nie skomplikowane ;)

 
Ok, teraz tylko pozostało nadać życie temu przyciskowi na środku. Dodajemy tylko kod:

public void ClickSteemButton(){
    STEEM = STEEM + 0.001f;
}

Teraz klikamy w obiekt BTN_STEEM i szukamy w nim komponent Button a w nim funkcję OnClick. Klikamy w plusik i przeciągamy nasz obiekt GameController na None (Object). Z No Function wybieramy GameControllerClickSteemButton().

No i wszystko działa jak należy :). Czasami wartości będą takie: 0.00599999, ale tym zajmiemy się w kolejnej części. Walcie w przycisk ile wlezie :D

Sort:  

Czy to takie proste jak piszesz? Nikt nie komentuje - dla mnie to czarna magia, może warto poklikać. Pozdrawiam. Świetna robota.

To jest proste :) Spróbuj sam, prześledź ten kurs i zobaczysz :)

Congratulations @chewing! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of upvotes

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Do not miss the last post from @steemitboard!


Participate in the SteemitBoard World Cup Contest!
Collect World Cup badges and win free SBD
Support the Gold Sponsors of the contest: @good-karma and @lukestokes


Do you like SteemitBoard's project? Then Vote for its witness and get one more award!

Coin Marketplace

STEEM 0.27
TRX 0.11
JST 0.030
BTC 70700.78
ETH 3798.19
USDT 1.00
SBD 3.43