C# z Unity - Podstawy

Tutoriale ogólnie, nie tylko Unity.

C# z Unity - Podstawy

Postprzez superpawelTV » 09 Lis 2013, 00:19

C# z Unity - Podstawy pisania skryptów

1.Wprowadzenie
Witam, chciałbym przedstawić wam sesję poradników, w której będę opisywał podstawy tworzenia skryptów do silnika Unity w języku C#. Zaczniemy od całkowitych podstaw języka C# a skończymy na pisaniu dosyć prostych skryptów z użyciem komponentów Unity. Pisaniem zaawansowanych skryptów zajmiemy się w następnej serii poradników. Poradniki będą podzielone na rozdziały, które będą łączyły się ze sobą tematycznie, przynajmniej takie są moje założenia. Co jakiś czas będę publikował kolejną część/rozdział poradników po prostu edytując ten post więc sprawdzajcie go co jakiś czas :). Warto by też wspomnieć że samą znajomością języka dużo nie zdziałamy, trzeba też posiadać umiejętność logicznego myślenia, która jest potrzebna do tego, aby nasze skrypty działały dokładnie tak jak chcemy. Dobrze, koniec paplania, przejdźmy do samych poradników.

2. Co to są te si-sharpy i Unity?
C# jest obiektowym językiem programowania, używanym między innymi w silniku Unity 3D. Co to znaczy że jest obiektowy? Otóż, programowanie obiektowe to takie, w którym programy, lub ja w naszym przypadku skrypty, definiujemy za pomocą obiektów. Czyli np. klas, zmiennych ale o nich później. Pytanie początkującego może brzmieć, no dobrze, tylko że w Unity są rzeczy, których nie ma w "normalnym" C#. Otóż, plusem języków obiektowych jest to, iż możemy użyć wcześniej napisanego kodu jeszcze raz. Używa się do tego m.in. bibliotek dll (dynamic link library), które mogą przechowywać obiekty, których możemy użyć, jednakże nie możemy edytować obiektów zawartych w takiej bibliotece. Unity z góry "mówi" naszemu skryptowi, że będziemy używać ich bibliotek, które mają w sobie właśnie te rzeczy, których nie ma w "normalnym" C#.
Unity 3D jest silnikiem graficznym, dzięki któremu możemy tworzyć fantastyczne gry, interaktywne prezentacje i tym podobne. Cechuje się przyjaznym interfejsem, prostotą, mocą i wspaniałym zespołem, który go tworzy. Tutaj koniec przechwałek, bez skryptów nie ma naszej gry, ponieważ to one ustalają co, jak, kiedy i dlaczego ma się dziać. Tutaj koniec mojego ględzenia, przechodzimy do prawdziwych lekcji.

3. Zmienne
Co to jest zmienna? Zmienna to obiekt, przechowujący określony typ danych. Takich jak np. ciąg znaków, tekstura, kolor i tym podobne. Wyobraźcie sobie karteczkę, na której zapiszecie zdanie "Jestem fajny". Ta karteczka jest naszą zmienną, jej typem jest ciąg znaków a jej wartością napis "Jestem fajny". W każdej chwili możemy odczytać co jest na takiej karteczce zapisane.
Do każdej zadeklarowanej zmiennej musimy podać:
-co będzie przechowywała
-jej nazwę
-jej wartość
Przykładowy zapis zmiennej, może wyglądać tak:
Image

Nazwa zmiennej może być dowolna ale nie może zaczynać się od cyfr i znaków specjalnych. Ponadto nie może zostać przedzielona w połowie.
Przykłady złego zapisania zmiennej: 6liczba, licz ba, 4, #liczba, )licz 6 ba.
Gdy chcemy zapisać więcej zmiennych tego samego typu, możemy zapisać je tak:
Image

Zaoszczędzamy wtedy trochę pisania (szczególnie, gdy typ jest bardzo długi). Do treści naszej karteczki możemy dostać się tylko z miejsc, w których ją widzimy. Nie zobaczymy jej, gdy jesteśmy w innym pokoju, lub w innym domu.
Nie podam wam wszystkich typów zmiennych, ponieważ jest ich naprawdę bardzo dużo ale podam wam kilka najbardziej podstawowych.
Image

Zauważ że wartość zmiennej typu string oznaczamy pomiędzy znakami " ", a char ' '. Zmienna bool jest używana głównie w instrukcjach warunkowych, o których w następnej lekcji.
Dodatkowo, na zmiennych liczbowych możemy wykonywać operacje arytmetyczne, takie jak dodawanie itp. Wygląda to tak
Image
Myślę iż wyczerpałem temat zmiennych w C#.

4.Instrukcja warunkowa if
Co to jest instrukcja warunkowa? Jest to warunek, który musi zostać spełniony aby dana część kodu się wykonała. Jedną z nich jest if (jeśli). Warunek w if'ie zawsze zwraca nam typ bool (true/false). Do sprawdzenia czy warunek się zgadza używamy operatorów porównań. Możemy np. sprawdzić czy jedna zmienna liczbowa(jej wartość) jest równa drugiej, wtedy zostanie wykonany jakiś kod (np. zmiana wartości tej liczby).
Deklaracja if'a wygląda tak
Image

(Oczywiście nie musicie robić aż tak dużych przerw pomiędzy nazwami zmiennych a operatorem porównania, zrobiłem je tak duże aby wszystko zmieściło się na grafice.)

Kod, który ma się wykonać, gdy warunek zostanie spełniony ograniczamy klamrami ('{' i '}'). Operator równania, składa się z dwóch lub jednego znaku, deklarującego, jak chcemy porównać dwie wartości. Wszystkie operatory porównań to
Image

Co jednak jeśli chcemy aby jakiś kod wykonał się gdy instrukcja się sprawdzi a inny jeśli nie? Otóż, nie musimy pisać dwóch if'ów, tutaj posłuży nam instrukcja else (w przeciwnym razie). Jej deklaracja jest bardzo prosta i wygląda tak
Image

Myślę, że to już wszystko na tę lekcję :).

5.Operatory działań matematycznych
Czasami a raczej bardzo często chcemy zmienić wartość naszej zmiennej ale nie zawsze przypisując jej wartość innej zmiennej. Służą do tego operatory działań matematycznych.
Nie jest ich dużo więc wymienię wszystkie i opiszę po krótce ich działanie:

Dodawanie czyli „+”
Odejmowanie czyli „-”
Dzielenie czyli „/”
Mnożenie czyli „*”
Potęgowanie czyli „^”
Dzielenie modulo, zwraca resztę z dzielenia czyli „%”

Przykład:
int liczba1 = 5;
int liczba2 = 3;
int liczba3 = liczba1 ^ liczba2;

Tutaj liczba3 będzie równa zmiennej liczba1 potęgowanej do liczba2 (czyli inaczej mówiąc 5 do potęgi 3). Co jeśli chcemy aby zmienna liczba równała się samej sobie do potęgi X? Moglibyśmy zapisać to tak:

int X = 3;
int liczba = 2;

liczba = liczba ^ X;

Lecz możemy skrócić ten zapis, zyskując również na szybkości wykonywania się kodu

int X = 3;
int liczba = 2;

liczba ^= X;
W taki sposób możemy użyć każdego operatora.

6. Operatory logiczne „&” i „|”
Po co nam to? Otóż, czasami w instrukcjach warunkowych będziemy chcieli sprawdzić więcej niż jedną rzecz na raz.
Zacznijmy od operatora „&”. Dzięki niemu będziemy mogli sprawdzić w jednym if’ie czy dwa lub więcej warunków jest spełnionych. Przykład:
int X = 4;
int Y = 6;

If(X = 4 && Y = 7)
{
//Jakiś kod, który się nie wykona, ponieważ Y nie równa się 7
}
Drugim operatorem, czyli „|” możemy sprawdzić czy jakikolwiek warunek w naszym if’ie jest spełniony. Przykład:
int X = 5;
int Y = 2;

if(Y == 2 || X == 2)
{
//Jakiś kod, który się wykona, ponieważ Y jest równe 2
}
7.Kolekcje
Co to są kolekcje? Są to zbiory elementów o tym samym typie. My omówimy dwa typy kolekcji, 'Array' i 'List'. Zacznijmy od Array'a. Deklaracja wygląda tak:
typ[] nazwa = new typ[ilość_elementów_w_kolekcji];
Np.:
int[] liczby = new int[10];
Array jest typem kolekcji, z niezmienialną długością. Długość kolekcji, to ilość elementów, które zawiera/może zawierać (C# obsługuje typy, które mogą mieć puste wartości (null)). Teraz czas na listę (List), aby użyć tego typu kolekcji musimy do skryptu dołączyć bibliotekę System.Collections.Generic, wystarczy że na początku skryptu dodamy linijkę:
using System.Collections.Generic;

Teraz możemy zadeklarować już listę:
List<typ> nazwa = new List<typ>() lub { elementy_kolekcji };
Np.:
List<int> liczby = new List<int>{ 5, 666, 10, 69 };
Jak widzicie nie podajemy tutaj długości kolekcji, ponieważ jej długość możemy zmienić w każdej chwili i jeśli dodajemy do niej element, długość automatycznie się dostosowuje. Teraz czas na to abym pokazał wam jak odczytywać i zapisywać wartości w kolekcjach, poczekałem z tym do teraz, ponieważ robi się to w nich podobnie.
Najlepiej będzie pokazać to na przykładzie:
int[] liczby = new int[10];
liczby[0] = 4;
liczby [1] = 8;
liczby[index] = 2;

Index jest to miejsce w kolekcji, do którego chcemy zapisać daną wartość. Numerowanie kolekcji zawsze zaczyna się od 0, przez co w kolekcji o długości 10 maksymalny index będzie wynosić 9 (ponieważ 1. element w kolekcji ma index 0, 2. ma 1 itd.). To był przykład przypisywania wartości, robi się to tak samo dla typu 'List', jak i 'Array'.

Teraz pokażę wam jak odczytać wartość.
List<string> napisy = new List<string>{ "Boo", "Foo", "Blah"};
string napis = napisy[0]; //napis będzie mieć wartość 'Boo'
Jak mówiłem, w typie kolekcji 'List' możemy dodawać elementy nie patrząc na index, robimy to za pomocą prostej metody:
nazwa_kolekcji.Add(wartość); Np.:
napisy.Add("Troll");
To by było na tyle na tę lekcję.

8.Instrukcja kontrolna switch
Co to jest switch? Wyobraźcie sobie, że chcecie wykonywać różne akcje w skrypcie zależnie od wartości pewnej zmiennej. Moglibyście to wykonać za pomocą dużej ilości if'ów lecz, gdy wartość tej zmiennej jest zmieniana po wykonaniu się pewnego if'a do wartości, spełniającej warunek if'a umieszczonego później to zostaną wykonane instrukcje, które potencjalnie nie chcemy aby zostały wykonane. Poza tym switch jest wydajniejszy przy dużej ilości warunków, lepiej czytelny w kodzie, pozwala na wykonanie się jakiś instrukcji, gdy żaden warunek nie został spełniony bez używania ogromnej ilości if'ów i else'ów oraz klamr. Przejdźmy więc do deklaracji:

switch (zmienna)
{
case warunek:
//Intrukcje
break;

case inny_warunek:
//Inne instrukcje
break;

default:
//Ten kod wykona się jeśli nie zostaną spełnione żadne warunki
break;
}

Np.:
int liczba = 3;

switch (liczba)
{
case 1:
//Ten kod się nie wykona
break;

case 3:
//Ten kod się wykona
liczba = 5;
break;

case 5:
//Ten kod się nie wykona, nie ważne że liczba teraz równa się 5, ponieważ switch został już przerwany
break;

default:
//Ten kod wykona się jeśli nie zostaną spełnione żadne warunki
break;
}

9.Klasa Mathf
Klasa Mathf jest zawarta w bibliotece UnityEngine.dll. Opiszę niektóre jej metody a dokładniej mówiąc te, których będziemy używać później przy pisaniu naszego skryptu. Opiszę również alternatywy dla nich (nie koniecznie lepsze od nich samych, ale zrobię to po to abyście dowiedzieli się dlaczego używać tej właśnie funkcji a nie innych metod). Mógłbym opisać je wszystkie aczkolwiek od tego jest już dokumentacja dostępna po polsku na tej stronie (wystarczy popatrzeć w górę i kliknąć "Dokumentacja" :)). Mój opis będzie różnił się tym, że będzie, być może, bardziej zrozumiały. Zacznijmy od Clamp. Ta metoda jest przydatna, gdy chcemy aby wartość naszej zmiennej nigdy nie wykraczała poza ustalone przez nas wartości. Możemy to zrobić również za pomocą if'ów, ale wtedy nasz kod będzie dłuższy. Poniżej przykład użycia, oraz porównanie do if'ów. Metodę Clamp wywołujemy w metodzie 'Update'. Unity automatycznie wywołuje Update() co klatkę, dzięki temu wartość zmiennej nigdy nie będzie mniejsza niż 0 i większa niż 1.5. Zauważcie również że przy podawaniu float'ów w C# musimy po liczbie dać literkę 'f', którą oznaczamy, że podana liczba to float.

public float liczba;

void Update()
{
Mathf.Clamp(liczba, 0.0f, 1.5f);

//Alternatywa if'owa

if (liczba >= 1.5f)
{
liczba = 1.5f;
}
if (liczba <= 0)
{
liczba = 0;
}
}
Jak widzicie używanie if'ów zajmuje więcej miejsca w kodzie a robi dokładnie to samo co Clamp.

Zgłaszajcie wszelkie błędy i swoje propozycje.
Paweł
Ostatnio edytowany przez superpawelTV 19 Sie 2014, 17:07, edytowano w sumie 10 razy
superpawelTV
 
Posty: 87
Rejestracja: 03 Gru 2012, 19:01
Has thanked: 0 time
Been thanked: 0 time

Re: C# z Unity - Podstawy

Postprzez superpawelTV » 09 Lis 2013, 13:30

Dodałem lekcję "Instrukcja warunkowa if", zapraszam do czytania :).
superpawelTV
 
Posty: 87
Rejestracja: 03 Gru 2012, 19:01
Has thanked: 0 time
Been thanked: 0 time

Re: C# z Unity - Podstawy

Postprzez patrykas1000 » 09 Lis 2013, 14:57

Bardzo dobry poradnik, jeżeli będzie się dalej rozwijał to przyda się każdemu kto zaczyna lub ma problemy z programowaniem. Warto też dodać że dzięki znajomość C# i C# w Unity bardzo dużo nie osiągniemy, w programowaniu równie ważna jest umiejętność "odpowiedniego" myślenia żeby umieć wszystko złożyć w jedną całość która będzie działać.

Pozdrawiam
Patryk
Służę pomocą przy programowaniu w Unity3D ( C# ) lub w Javie
patrykas1000
 
Posty: 329
Rejestracja: 16 Sie 2013, 21:35
Has thanked: 0 time
Been thanked: 0 time

Re: C# z Unity - Podstawy

Postprzez superpawelTV » 09 Lis 2013, 15:10

Dzięki za opinię, zaktualizowałem wprowadzenie o tę uwagę.

regards
Paweł
superpawelTV
 
Posty: 87
Rejestracja: 03 Gru 2012, 19:01
Has thanked: 0 time
Been thanked: 0 time

Re: C# z Unity - Podstawy

Postprzez Ghandhi » 12 Lis 2013, 16:12

Brakuje else if oraz operatorów *= /= += -=
Ghandhi
 
Posty: 8
Rejestracja: 19 Paź 2013, 15:06
Has thanked: 0 time
Been thanked: 0 time

Re: C# z Unity - Podstawy

Postprzez ValaAntha » 16 Lis 2013, 19:52

A kiedy ciąg dalszy z pozostałymi instrukcjami??
Awatar użytkownika
ValaAntha
 
Posty: 479
Rejestracja: 17 Gru 2011, 03:37
Miejscowość: Olsztynek
Has thanked: 0 time
Been thanked: 0 time

Re: C# z Unity - Podstawy

Postprzez superpawelTV » 27 Lis 2013, 19:52

Ghandhi napisał(a):Brakuje else if oraz operatorów *= /= += -=


If i else są ;). Pozatym ten tutorial nie jest skończony i nie wiem kiedy będzie.

ValaAntha napisał(a):A kiedy ciąg dalszy z pozostałymi instrukcjami??


Wróciłem i będę dalej pisać :).

EDIT: Dodałem dwie lekcje, zapraszam do czytania :).
superpawelTV
 
Posty: 87
Rejestracja: 03 Gru 2012, 19:01
Has thanked: 0 time
Been thanked: 0 time

Re: C# z Unity - Podstawy

Postprzez superpawelTV » 11 Gru 2013, 20:30

Dodałem lekcję na temat kolekcji, zapraszam do lektury :).
superpawelTV
 
Posty: 87
Rejestracja: 03 Gru 2012, 19:01
Has thanked: 0 time
Been thanked: 0 time

Re: C# z Unity - Podstawy

Postprzez Sawik » 12 Gru 2013, 10:14

superpawelTV napisał(a):[b]
Array jest typem kolekcji, z niezmienialną długością.

A co z dynamic array? Unity nie obsługuje?
Sawik
 
Posty: 254
Rejestracja: 11 Maj 2012, 16:04
Miejscowość: Bradford
Has thanked: 0 time
Been thanked: 0 time

Re: C# z Unity - Podstawy

Postprzez superpawelTV » 15 Gru 2013, 19:50

Napisałem o typie 'List' pod Array'em a z tą niezmienialną długością chodziło mi tylko o array, nie o listę (List).
List<int> liczby = new List<int>{ 5, 666, 10, 69 };
Jak widzicie nie podajemy tutaj długości kolekcji, ponieważ jej długość możemy zmienić w każdej chwili
superpawelTV
 
Posty: 87
Rejestracja: 03 Gru 2012, 19:01
Has thanked: 0 time
Been thanked: 0 time

Następna

Wróć do Tutoriale

Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 4 gości

cron