Raven Admin
|
Wysłany: Nie Gru 02, 2007 10:01 am Temat postu: 2 Typy zmiennych |
|
|
Jak każdy język programowania także i Unreal Script posiada zmienne. Zmienne deklaruje się następująco:
Kod: | Var([nazwa]) [Prefixy] TypZmiennej NazwaZmiennej; |
Typy
Istnieje kilka typów zmiennych:
byte
Liczba całkowita od 0 do 255
Unreal Script: | var byte MyByte; MyByte=255;
|
iInt
Liczba całkowita (32 bitowa)
Unreal Script: | var int MyInt; MyInt=11; MyInt++; //wartość większa o 1 MyInt--; //wartość mniejsza o 1
|
float
Liczba zmiennoprzecinkowa
Unreal Script: | var float MyFloat; MyFloat=11.05; MyFloat*=2.0; MyFloat = MyFloat/22;
|
bool
Zmienna logiczna (wartość true lub false)
Unreal Script: | var bool MyBool; MyBool=false;
|
string
Ciąg znaków ograniczony poprzez " i ":
Unreal Script: | var string MyString1; var string MyString2; var string MyString3; MyString1="ssdd1"; MyString2="ddss2"; MyString3= MyString1$MyString2;//łączy string iMyString3=Right(MyString1, 2); // zwraca 2 znaki z MyString2, zaczynając od prawej strony MyString3=Left(MyString2, 2);// zwraca 2 znaki z MyString2, zaczynając od lewej strony MyString3=Len(MyString1);// zwraca liczbę znaków w MyString1
|
name
Nazwa właściwie też jest ciągiem znaków, z tą różnicą, że ograniczamy go znakami ' i '. Najlepiej jeśli spojrzysz na nie jako na nazwy (tagi) przedmiotów w UT. Nie wykonuj na nich żadnych operacji, które wykonałbyś na ciągach.
Unreal Script: | var name MyName; MyName='FirstName';
|
enum
Zmienna, która przyjmuje wartość spośród kilku zdefiniowanych nazw
Unreal Script: | enum EMyEnum //struktura { MY_Enum1, MY_Enum2 }; var EMyEnum FirstEnumVar; // dostęp poprzez FirstEnumVar FirstEnumVar=MY_Enum1;
|
struct
Struktura jest to złożony typ danych, którego głównym zadaniem jest grupowanie zmiennych różnego typu. Składnia wygląda następująco:
Unreal Script: | struct nazwa [extends struktura_nadrzędna] { //tu deklaruje się zmienne. };
|
Przykład:
Unreal Script: | struct SMyStruct //struktura { var int IntInStruct; var float FloatInStruct; var string StringInStruct; }; var SMyStruct FirstStructVar; // dostęp poprzez FirstStructVar var SmyStruct FirstStructArray[3]; (...) FirstStructVar.IntInStruct=1; FirstStructVar.FloatInStruct=1.05; FirstStructVar.StringInStruct="jeden"; /* Nadaje warość JEDNEJ zmiennej z danej komórki tabeli.*/ (...)for(i=0; i<3; i++) { FirstStructArray[i]. IntInStruct =1; FirstStructArray[i]. FloatInStruct =1.05; FirstStructArray[i]. StringInStruct ="jeden"; }/* nadaje wartosci wszystkim zmiennym w FirstStructArray */
|
W defultproperties z kolei zmiennym w strukturze przypisuje się wartości tak
Unreal Script: | defaultproperties { FirstStructVar=(IntInStruct=1,FloatInStruct=1.05,SringInStruct ="jeden") }
|
Jedną z istniejących struktur jest werkor.
Prefixy
const
Stała – po nadaniu jej wartości (domyślna wartość zmiennej lub w UED) podczas działania skryptu nie możesz jej zmienić.
editconst
Zmiennej nie można zmienić z poziomu UnrealED :]
Unreal Script: | var editconst bool MyBool;
|
input
Sprawia, że możemy taką zmienną zbindować. Działa tylko z typami byte i float
Unreal Script: | var input byte MyInputByte;
|
transient
Jest jedynie do użycia tymczasowego. Przy ładowaniu obiektu jest zerowana.
Unreal Script: | var transient bool MyBool;
|
native
Zmienna jest częściej używana przez C++ niż Unreal Script.
private
Zmienna będzie prywatna, dostępna tylko dla skryptu
travel
Odnosi się tylko do PlayerPawn oraz Inventory. Znaczy mniej więcej tyle: "wartość tej zmiennej musi podróżować pomiędzy poziomami". Sprawia to, że po załadowaniu nowej mapy (tryb Single Player) broń, ilość amunicji, stan zdrowia nie jest "zapominany"
skip
Tylko do operacji logicznych (szczegóły w licencji). Przykładu nie podam, bo nigdzie nie ma szczegółów
export
Tylko do klas Object i Actor (szczegóły w licencji). Przykładu nie podam, bo nigdzie nie ma szczegółów
Tablice
Unreal Engine 1.x supportuje tylko jednowymiarowe tablice:
Dostęp do takiej zmiennej uzyskujemy następująco:
Gdzie "i" oznacza liczbę z zakresu od 0 do wymiar_tablicy-1 czyli w naszym przypadku od 0 do 2.
Edycja z poziomu UnrealED
Uzyskujemy dzięki wstawieniu () po var. Deklaracja powinna wyglądać następująco:
Kod: | Var([nazwa]) [Prefixy] TypZmiennej NazwaZmiennej; |
Ilustruje to przykład:
Unreal Script: | /*edytujemy ją z poziomu UED nazwa grupy=nazwa klasy */ var() int MyInt; /*edytujemy ją z poziomu UED nazwa grupy=MyGroup=nazwa w nawiasie :]*/ var(MyGroup) int MyInt2;
|
Jeśli w () nie wpiszemy żadnej nazwy, to grupą takiej zmiennej będzie nazwa klasy.
Struktury
Aby struktura mogła być edytowana z poziomu UnrealED, odpowiednio zadeklarowane muszą być także zmienne wewnątrz struktury:
Unreal Script: | struct nazwa [extends struktura_nadrzędna] { Var([nazwa]) [Prefixy] TypZmiennej NazwaZmiennej; };
|
Ilustruje to przykład:
Unreal Script: | struct SMyStruct //struktura { var() int IntInStruct; //zmienna widoczna z poziomu UnrealED var() float FloatInStruct; //zmienna widoczna z poziomu UnrealED var string StringInStruct; //zmienna niewidoczna w UnrealED }; var() SMyStruct FirstStructVar; // dostęp poprzez FirstStructVar
|
Zmienne a Obiekty
Można także zadeklarować zmienne odnoszące się do obiektów:
Unreal Script: | var actor A; // Odnosi się do klasy Actor var pawn P; // Odnosi się do klasy Pawn var texture T; // Odnosi się do Textury
|
Należy pamiętać, iż zmienna P może przechowywać każdy istniejący w grze obiekt będący dzieckiem klasy Pawn.
Unreal Script: | var pawn P, S; function MyFunction() { if(P.Enemy == S) P.PlayRunning(); }
|
Zmienna P albo odnosi się do jakiegoś istniejącego w czasie działania skryptu Pawna, albo jej wartość wynosi None. Dzięki temu możemy ulepszyć powyższą funkcję
Unreal Script: | var pawn P, S; function MyFunction() { if(P == none) return; /* jeśli pawn nie istnieje nie mamy nic do roboty i kończymy działanie funkcji, w przeciwnym wypadku kontynuujemy */ if(P.Enemy == S) // jeśli mamy przeciwnika I jest nim S P.PlayRunning(); // odtwarzamy aminację biegania }
|
Oczywiście można się obyć bez warunku if(P == none) return; i skrypt będzie działać poprawnie. W momencie jednak, gdy któraś ze zmiennych będzie pusta (wartość none) w logu zostanie zapisany słynny błąd Accessed None. Kilka takich błędów nic nie zmieni, lecz duże ich nagromadzenie może znacząco spowolnić grę.
Zmienne a Klasy
W powyrzszym przypadku, obiekty musiały istnieć w grze, aby byłć użyte. Zmiena jako klasa nie wymaga tego.
Unreal Script: | var() class C; // klasa do Spawnowania var actor A; // zmienna "przechowująca" obiekt A = Spawn(C); // tworzy obiekt w grze
|
Zmienna C określa klasę, która ma zostać utworzona w grze (dowolna), zaś A "przechowuje" obiekt. Dzięki niej możemy się odwołać do funkcji i zmiennych wewnątrz zespawnowanej klasy. Jest tylko jeden drobny szczegół... odwołać się możesz do wszystkiego zawartego w obiekcie ACTOR. Dlaczego? Bo odwołujesz się do klasy Actor i nie możesz "sięgnąć dalej". Aby uniknąć ograniczenia, musimy zdefiniować grupę:
Unreal Script: | var() class<nazwa_istniejącej_klasy> NazwaZmiennej;
|
Czy dzięki temu zapisowi możemy się odwoływać do wartości innych niż te z klasy Actor? Niezupełnie, ale to jeden krok do przodu. Proszę zwrócić uwagę, że w UED będziesz mógł wstawić tylko klasę zawartą pomiędzy < i > lub klasy pochodne. No, ale przejdźmy dalej:
Unreal Script: | var() class< decoration > D; // klasa do Spawnowaniavar Decoration A; // zmienna "przechowująca" A = Spawn(D); // tworzy obiekt w grze
|
Dopiero po zdefiniowani kolejnej zmiennej odnoszącej się do obiektu (w tym przypadku Decoration) możemy zespawnować odpowiednią klasę i odnosić się do funkcji i zmiennych w niej zawartych. W tym przypadku musimy także wpisać w defaultproperties odnośnik do klasy.
Unreal Script: | defaultproperties { D=class'Botpack.Bin2' }
|
Istniejące struktury
Vector
Punkt w przestrzeni 3D. Opisany za pomocą wartości na osiach X, Y oraz Z
Unreal Script: | struct Vector { var() config float X, Y, Z; };
|
Plane
Punkt w 3D wraz z punktem odniesienia od środka czyli X, Y, Z oraz W.
Unreal Script: | struct Plane extends Vector { var() config float W; };
|
Rotator
Rotacja (obrót) jest opisana za pomocą Pitch, Yaw, i Rol.
Unreal Script: | struct Rotator { var() config int Pitch, Yaw, Roll; };
|
Color
Kolor RGB. Jeśli nie wiesz co to takiego, poszukaj w wikipedi lub pogoogluj.
Unreal Script: | struct Color { var() config byte R, G, B, A; };
|
Coords
Definicja płaszczyzny w 3D
Unreal Script: | struct Coords { var() config vector Origin, XAxis, YAxis, ZAxis; };
|
Region
Region w którym znajduje się dany actor
Unreal Script: | struct PointRegion { var zoneinfo Zone; // Zone. var int iLeaf; // Bsp leaf. var byte ZoneNumber; // Zone number. }; var const PointRegion Region;
|
Zmienne lokalne i globalne
Do tej pory pisałem o zmiennych globalnych, czym jednak są zmienne lokalne? W praktyce nie różnią się one za bardzo od zmiennych globalnych, z tym wyjątkiem, że do zmiennych globalnych mają dostęp wszystkie funkcje w skrypcie, do nich można się także odwoływać poprzez inne skrypty, oraz ustawiać wartości z poziomu UnrealEd. Zmienne lokalne zaś dostępne są tylko dla funkcji w której zostały zadeklarowane i, w przeciwieństwie do zmiennych globalnych, mogą się powtarzać (oczywiście nie w jednej funkcji i nazwa nie może być taka sama jak zmienna globalna). Zmienne lokalne deklaruje się w następujący sposób:
Kod: | local [TypZmiennej] [NazwaZmiennej]; |
Skąd jednak podział na zmienne lokalne i globalne i jaki sens jest używania tych pierwszych? Otóż zmienne lokalne są stosowane w funkcjach, w momencie, gdy mają służyć do wykonania pewnych obliczeń, których wynik nie trzeba na dłużej zapamiętywać. Prześledźmy to na następującej funkcji:
Unreal Script: | function Draw100Lines() { local int i; for(i=0; i<100; i++;) { BroadCastMessage("Liczymy do 100. Jest to liczba: "$i+1); } }
|
Ta prosta funkcja wypisuje liczby od 0 do 100. Nie chodzi jednak o funkcje a o zmienną i. Teoretycznie mógłbym zadeklarować ją jako globalną, ale w praktyce takie postępowanie nie miałoby najmniejszego sensu. Przyjrzyjmy się jednak takiej funkcji:
Unreal Script: | function PowiekszI() { local int i; i=i+1; }
|
Najciekawsze w tej funkcji jest to, że choćbyśmy wywoływali ją 1000 razy, maksymalną wartością jaką osiągnie zmienna i będzie 1. Dzieje się tak dlatego, gdyż podczas każdego wywołania funkcja powiększa i o 1, zaś kolejne wywołania nie mają dostępu do poprzedniej wartości. Jeśli chcielibyśmy aby wartość zmiennej i była zapamiętywana, funkcja powinna mieć taki wygląd:
Unreal Script: | var int i; function PowiekszI() { i=i+1; }
|
W takiej postaci i zostanie zapamiętane, gdyż jest ono zmienną globalną. _________________
personal wiki |
|