O Unreal Script - [UE1] [UC] 2 Typy zmiennych by Raven dnia: 02 Grudzien 2007, 11:01
     Jak kazdy jezyk programowania takze i Unreal Script posiada zmienne. Zmienne deklaruje sie nastepujaco:

Kod:
Var([nazwa]) [Prefixy] TypZmiennej NazwaZmiennej;


Typy
     Istnieje kilka typów zmiennych:

byte
Liczba calkowita od 0 do 255
Unreal Script:
  1. var byte MyByte;
  2. MyByte=255;


iInt
Liczba calkowita (32 bitowa)

Unreal Script:
  1. var int MyInt;
  2. MyInt=11;
  3. MyInt++; //wartosc wieksza o 1
  4. MyInt--; //wartosc mniejsza o 1
  5.  


float
Liczba zmiennoprzecinkowa
Unreal Script:
  1. var float MyFloat;
  2. MyFloat=11.05;
  3. MyFloat*=2.0;
  4. MyFloat = MyFloat/22;


bool
Zmienna logiczna (wartosc true lub false)
Unreal Script:
  1. var bool MyBool;
  2. MyBool=false;


string
Ciag znaków ograniczony poprzez " i ":
Unreal Script:
  1. var string MyString1;
  2. var string MyString2;
  3. var string MyString3;
  4. MyString1="ssdd1";
  5. MyString2="ddss2";
  6. MyString3= MyString1$MyString2;//laczy string
  7. iMyString3=Right(MyString1, 2); // zwraca 2 znaki z MyString2, zaczynajac od prawej strony
  8. MyString3=Left(MyString2, 2);// zwraca 2 znaki z MyString2, zaczynajac od lewej strony
  9. MyString3=Len(MyString1);// zwraca liczbe znaków w MyString1
  10.  


name
Nazwa wlasciwie tez jest ciagiem znaków, z ta róznica, ze ograniczamy go znakami ' i '. Najlepiej jesli spojrzysz na nie jako na nazwy (tagi) przedmiotów w UT. Nie wykonuj na nich zadnych operacji, które wykonalbys na ciagach.
Unreal Script:
  1. var name MyName;
  2. MyName='FirstName';


enum
Zmienna, która przyjmuje wartosc sposród kilku zdefiniowanych nazw
Unreal Script:
  1. enum EMyEnum //struktura
  2. {
  3.     MY_Enum1,
  4.    MY_Enum2
  5. };
  6. var EMyEnum FirstEnumVar; // dostep poprzez FirstEnumVar
  7. FirstEnumVar=MY_Enum1;


struct
Struktura jest to zlozony typ danych, którego glównym zadaniem jest grupowanie zmiennych róznego typu. Skladnia wyglada nastepujaco:

Unreal Script:
  1. struct nazwa [extends struktura_nadrzedna] {
  2.   //tu deklaruje sie zmienne.
  3. };


Przyklad:

Unreal Script:
  1. struct SMyStruct //struktura
  2. {
  3.     var int IntInStruct;
  4.     var float FloatInStruct;
  5.     var string StringInStruct;
  6. };
  7. var SMyStruct FirstStructVar; // dostep poprzez FirstStructVar
  8. var SmyStruct FirstStructArray[3];
  9. (...)
  10. FirstStructVar.IntInStruct=1;
  11. FirstStructVar.FloatInStruct=1.05;
  12. FirstStructVar.StringInStruct="jeden"; /* Nadaje warosc JEDNEJ zmiennej z danej komórki tabeli.*/
  13. (...)for(i=0; i<3; i++)
  14. {
  15.   FirstStructArray[i]. IntInStruct =1;
  16.   FirstStructArray[i]. FloatInStruct =1.05;
  17.   FirstStructArray[i]. StringInStruct ="jeden";
  18. }/* nadaje wartosci wszystkim zmiennym w FirstStructArray */


W defultproperties z kolei zmiennym w strukturze przypisuje sie wartosci tak

Unreal Script:
  1. defaultproperties
  2. {
  3.   FirstStructVar=(IntInStruct=1,FloatInStruct=1.05,SringInStruct ="jeden")
  4. }


Jedna z istniejacych struktur jest werkor.

     Prefixy

const
     Stala – po nadaniu jej wartosci (domyslna wartosc zmiennej lub w UED) podczas dzialania skryptu nie mozesz jej zmienic.
Unreal Script:
  1. var const bool MyBool;

editconst
     Zmiennej nie mozna zmienic z poziomu UnrealED :]
Unreal Script:
  1. var editconst bool MyBool;

input
     Sprawia, ze mozemy taka zmienna zbindowac. Dziala tylko z typami byte i float
Unreal Script:
  1. var input byte MyInputByte;

transient
     Jest jedynie do uzycia tymczasowego. Przy ladowaniu obiektu jest zerowana.
Unreal Script:
  1. var transient bool MyBool;

native
     Zmienna jest czesciej uzywana przez C++ niz Unreal Script.
Unreal Script:
  1. var native bool MyBool;

private
     Zmienna bedzie prywatna, dostepna tylko dla skryptu
Unreal Script:
  1. var private bool MyBool;

travel
     Odnosi sie tylko do PlayerPawn oraz Inventory. Znaczy mniej wiecej tyle: "wartosc tej zmiennej musi podrózowac pomiedzy poziomami". Sprawia to, ze po zaladowaniu nowej mapy (tryb Single Player) bron, ilosc amunicji, stan zdrowia nie jest "zapominany"
Unreal Script:
  1. var travel bool MyBool;

skip
     Tylko do operacji logicznych (szczególy w licencji). Przykladu nie podam, bo nigdzie nie ma szczególów :(
export
     Tylko do klas Object i Actor (szczególy w licencji). Przykladu nie podam, bo nigdzie nie ma szczególów :(

Tablice

     Unreal Engine 1.x supportuje tylko jednowymiarowe tablice:

Unreal Script:
  1. var int MyArInt[3];


Dostep do takiej zmiennej uzyskujemy nastepujaco:

Unreal Script:
  1. JakasZmienna=MyArInt[i];


Gdzie "i" oznacza liczbe z zakresu od 0 do wymiar_tablicy-1 czyli w naszym przypadku od 0 do 2.

Edycja z poziomu UnrealED

Uzyskujemy dzieki wstawieniu () po var. Deklaracja powinna wygladac nastepujaco:

Kod:
Var([nazwa]) [Prefixy] TypZmiennej NazwaZmiennej;


Ilustruje to przyklad:

Unreal Script:
  1. /*edytujemy ja z poziomu UED nazwa grupy=nazwa klasy */
  2. var() int MyInt;
  3. /*edytujemy ja z poziomu UED nazwa grupy=MyGroup=nazwa w nawiasie :]*/
  4. var(MyGroup) int MyInt2;


Jesli w () nie wpiszemy zadnej nazwy, to grupa takiej zmiennej bedzie nazwa klasy.

     Struktury

Aby struktura mogla byc edytowana z poziomu UnrealED, odpowiednio zadeklarowane musza byc takze zmienne wewnatrz struktury:

Unreal Script:
  1. struct nazwa [extends struktura_nadrzedna] {
  2.   Var([nazwa]) [Prefixy] TypZmiennej NazwaZmiennej;
  3. };


Ilustruje to przyklad:

Unreal Script:
  1. struct SMyStruct //struktura
  2. {
  3.     var() int IntInStruct;      //zmienna widoczna z poziomu UnrealED
  4.     var() float FloatInStruct;  //zmienna widoczna z poziomu UnrealED
  5.     var string StringInStruct;  //zmienna niewidoczna w UnrealED
  6. };
  7. var() SMyStruct FirstStructVar; // dostep poprzez FirstStructVar
  8.  


Zmienne a Obiekty

Mozna takze zadeklarowac zmienne odnoszace sie do obiektów:

Unreal Script:
  1. var actor A; // Odnosi sie do klasy Actor
  2. var pawn P; // Odnosi sie do klasy Pawn
  3. var texture T; // Odnosi sie do Textury
  4.  


Nalezy pamietac, iz zmienna P moze przechowywac kazdy istniejacy w grze obiekt bedacy dzieckiem klasy Pawn.

Unreal Script:
  1. var pawn P, S;
  2. function MyFunction()
  3. {
  4.    if(P.Enemy == S)
  5.       P.PlayRunning();
  6. }


Zmienna P albo odnosi sie do jakiegos istniejacego w czasie dzialania skryptu Pawna, albo jej wartosc wynosi None. Dzieki temu mozemy ulepszyc powyzsza funkcje

Unreal Script:
  1. var pawn P, S;
  2. function MyFunction()
  3. {
  4.    if(P == none)  return; /* jesli pawn nie istnieje nie mamy nic do roboty i konczymy dzialanie funkcji, w przeciwnym wypadku kontynuujemy */
  5.    if(P.Enemy == S) // jesli mamy przeciwnika I jest nim S     
  6.       P.PlayRunning(); // odtwarzamy aminacje biegania
  7. }


Oczywiscie mozna sie obyc bez warunku if(P == none) return; i skrypt bedzie dzialac poprawnie. W momencie jednak, gdy któras ze zmiennych bedzie pusta (wartosc none) w logu zostanie zapisany slynny blad Accessed None. Kilka takich bledów nic nie zmieni, lecz duze ich nagromadzenie moze znaczaco spowolnic gre.

Zmienne a Klasy

W powyrzszym przypadku, obiekty musialy istniec w grze, aby bylc uzyte. Zmiena jako klasa nie wymaga tego.

Unreal Script:
  1. var() class C; // klasa do Spawnowania
  2. var actor A; // zmienna "przechowujaca" obiekt
  3. A = Spawn(C); // tworzy obiekt w grze
  4.  


Zmienna C okresla klase, która ma zostac utworzona w grze (dowolna), zas A "przechowuje" obiekt. Dzieki niej mozemy sie odwolac do funkcji i zmiennych wewnatrz zespawnowanej klasy. Jest tylko jeden drobny szczegól... odwolac sie mozesz do wszystkiego zawartego w obiekcie ACTOR. Dlaczego? Bo odwolujesz sie do klasy Actor i nie mozesz "siegnac dalej". Aby uniknac ograniczenia, musimy zdefiniowac grupe:

Unreal Script:
  1. var() class<nazwa_istniejacej_klasy> NazwaZmiennej;


Czy dzieki temu zapisowi mozemy sie odwolywac do wartosci innych niz te z klasy Actor? Niezupelnie, ale to jeden krok do przodu. Prosze zwrócic uwage, ze w UED bedziesz mógl wstawic tylko klase zawarta pomiedzy < i > lub klasy pochodne. No, ale przejdzmy dalej:

Unreal Script:
  1. var() class< decoration > D; // klasa do Spawnowaniavar
  2. Decoration A; // zmienna "przechowujaca"
  3. A = Spawn(D); // tworzy obiekt w grze
  4.  


Dopiero po zdefiniowani kolejnej zmiennej odnoszacej sie do obiektu (w tym przypadku Decoration) mozemy zespawnowac odpowiednia klase i odnosic sie do funkcji i zmiennych w niej zawartych. W tym przypadku musimy takze wpisac w defaultproperties odnosnik do klasy.

Unreal Script:
  1. defaultproperties
  2. {
  3.      D=class'Botpack.Bin2'
  4. }


Istniejace struktury

Vector
     Punkt w przestrzeni 3D. Opisany za pomoca wartosci na osiach X, Y oraz Z
Unreal Script:
  1. struct Vector
  2. {
  3.         var() config float X, Y, Z;
  4. };


Plane
     Punkt w 3D wraz z punktem odniesienia od srodka czyli X, Y, Z oraz W.
Unreal Script:
  1. struct Plane extends Vector
  2. {
  3.         var() config float W;
  4. };
  5.  

Rotator
     Rotacja (obrót) jest opisana za pomoca Pitch, Yaw, i Rol.
Unreal Script:
  1. struct Rotator
  2. {
  3.         var() config int Pitch, Yaw, Roll;
  4. };


Color
     Kolor RGB. Jesli nie wiesz co to takiego, poszukaj w wikipedi lub pogoogluj.
Unreal Script:
  1. struct Color
  2. {
  3.         var() config byte R, G, B, A;
  4. };


Coords
     Definicja plaszczyzny w 3D
Unreal Script:
  1. struct Coords
  2. {
  3.         var() config vector Origin, XAxis, YAxis, ZAxis;
  4. };


Region
     Region w którym znajduje sie dany actor
Unreal Script:
  1. struct PointRegion
  2. {
  3.         var zoneinfo Zone;       // Zone.
  4.         var int      iLeaf;      // Bsp leaf.
  5.         var byte     ZoneNumber; // Zone number.
  6. };
  7. var const PointRegion     Region;   


Zmienne lokalne i globalne

Do tej pory pisalem o zmiennych globalnych, czym jednak sa zmienne lokalne? W praktyce nie róznia sie one za bardzo od zmiennych globalnych, z tym wyjatkiem, ze do zmiennych globalnych maja dostep wszystkie funkcje w skrypcie, do nich mozna sie takze odwolywac poprzez inne skrypty, oraz ustawiac wartosci z poziomu UnrealEd. Zmienne lokalne zas dostepne sa tylko dla funkcji w której zostaly zadeklarowane i, w przeciwienstwie do zmiennych globalnych, moga sie powtarzac (oczywiscie nie w jednej funkcji i nazwa nie moze byc taka sama jak zmienna globalna). Zmienne lokalne deklaruje sie w nastepujacy sposób:

Kod:
local [TypZmiennej] [NazwaZmiennej];


Skad jednak podzial na zmienne lokalne i globalne i jaki sens jest uzywania tych pierwszych? Otóz zmienne lokalne sa stosowane w funkcjach, w momencie, gdy maja sluzyc do wykonania pewnych obliczen, których wynik nie trzeba na dluzej zapamietywac. Przesledzmy to na nastepujacej funkcji:

Unreal Script:
  1. function Draw100Lines()
  2. {
  3.     local int i;    for(i=0; i<100; i++;)
  4.    {
  5.         BroadCastMessage("Liczymy do 100. Jest to liczba: "$i+1);
  6.     }
  7. }


Ta prosta funkcja wypisuje liczby od 0 do 100. Nie chodzi jednak o funkcje a o zmienna i. Teoretycznie móglbym zadeklarowac ja jako globalna, ale w praktyce takie postepowanie nie mialoby najmniejszego sensu. Przyjrzyjmy sie jednak takiej funkcji:


Unreal Script:
  1. function PowiekszI()
  2. {
  3.     local int i;
  4.     i=i+1;
  5. }


Najciekawsze w tej funkcji jest to, ze chocbysmy wywolywali ja 1000 razy, maksymalna wartoscia jaka osiagnie zmienna i bedzie 1. Dzieje sie tak dlatego, gdyz podczas kazdego wywolania funkcja powieksza i o 1, zas kolejne wywolania nie maja dostepu do poprzedniej wartosci. Jesli chcielibysmy aby wartosc zmiennej i byla zapamietywana, funkcja powinna miec taki wyglad:


Unreal Script:
  1. var int i;
  2. function PowiekszI()
  3. {
  4.     i=i+1;
  5. }


W takiej postaci i zostanie zapamietane, gdyz jest ono zmienna globalna.