Unity3d QuickTip – czyli szybkie porady, rozwiązania częstych problemów i sztuczki w Unity3d!

Dzisiejszy odcinek: Multiplayer w Unity3d z wykorzystaniem UNet. Część 3: Zapewnianie jakością łącza i połączenie nie tylko LAN.

Uwaga! Jest to poradnik typu QuickTip. Zatem skupia się on na osiągnięciu założonego celu. Zatem zakładamy że użytkownik zna na tyle program Unity3d, aby samodzielnie wykonać najprostsze czynności, jak np. dodanie modelu kostki do sceny czy dodanie modelowi jakiegoś komponentu. Jeżeli brakuje Ci tej podstawowej wiedzy, zapraszam do tutoriala:
Unity Tutorial – Podstawy

Kurs powstał na podstawie artykułu Christiana Arellano.

Ten artykuł jest kolejną częścią poprzednich dwóch QuickTipów. Należy je przerobić wcześniej, ponieważ pracujemy tutaj na kodzie zarówno z pierwszej, jak i drugiej części.

Teoria

W poprzednich częściach stworzyliśmy prostą grę sieciową i zoptymalizowaliśmy nieco jej działanie. Teraz zajmiemy się jeszcze trzema sprawami. Jedną przydatną, która może poprawić jakość działania gry, drugą czysto estetyczną, a trzecią cholernie ważną, która pozwoli wyjść za sieć LAN.

Quality of Services

Quality of Services (QoS) to zwyczajnie zapewnianie jakości, czyli dbałość o to, żeby gracz zawsze miał płynne działanie gry. W tym celu możemy sobie pozwolić na prosty trick, dodajemy sobie przed nazwą klasy takie coś:

[NetworkSettings(channel=2)] 
public class Moving : NetworkBehaviour

Dodatkowo, możemy też zmodyfikować naszą komendę:

[Command(channel=0)] 
void CmdMoveOnServer(KeyCode arrowKey)
{
	serverState = Move(serverState, arrowKey);
}

Co tu się dzieje? Podajemy sobie kanał, którym ma być odpowiednio: aktualizowany skrypt, oraz którym ma odbywać się wykonywanie komendy. Same kanały, powiązane są właśnie z trybami jakości, które opisane są pod tym linkiem. Kanały możemy sobie definiować sami. Wystarczy wybrać naszego Network Managera i zaznaczyć opcję Advanced Configuration:

QoS w UNet
QoS w UNet

W momencie jak podaliśmy kanał 2 w skrypcie, powinien sam się dodać (nominalnie mamy tylko 2 kanały). Taki podział na kanały zapewni nam lepszy sposób transmisji danych, tym samym zapewniając użytkownikowi większą płynność transmisji.

Upiększanie

Teraz zrobimy coś nieco odmiennego. Mianowicie nasz gracz i inni gracze są białym sześcianem. Zmodyfikujemy nieco kolory.

Na początek dodajemy nową zmienną:

[SyncVar] Color color;

Zmienimy też nieco inicjację serwera:

[Server]
void InitState()
{
	Color[] colors = {Color.blue, Color.cyan, Color.green, Color.magenta, Color.red, Color.yellow};
	color = colors[Random.Range(0, colors.Length)];

	serverState = new CubeState
	{
		moveNum = 0,
		x = 0,
		y = 0,
		z = 0
	};
}

Nic wielkiego. Mamy kilka kolorów i sobie losujemy jeden z nich, ustalając na zmienną serwerową, która dzięki [SyncVar] zostanie od razu ustawiona. Przez to, że wstawiliśmy to do Inita, wykonamy to tylko raz.

Dodamy sobie teraz nową funkcję:

void SyncColor () 
{
	GetComponent<Renderer>().material.color = (isLocalPlayer ? Color.white : Color.grey) * color;
}

Co tutaj się dzieje? Zmieniamy kolor naszej kostki na biały lub szary, i mnożymy to przez wylosowany kolor. Biały gdy mamy do czynienia z lokalnym graczem, a szary jeśli obiekt gracza należy do kogoś innego. Efekt? Nasza postać dostanie losowy kolor, ale będzie jasna (jaskrawa), a każdy inny gracz otrzyma ciemny odcień jednego z kolorów, dzięki czemu łatwo odróżnić naszą postać od reszty.

Zostało wywołać funkcje SyncColor, co robimy w funkcji Start:

void Start()
{
    if (isLocalPlayer) {
		pendingMoves = new Queue<KeyCode>();

		predictedState = new CubeState
		{
			moveNum = 0,
			x = 0,
			y = 0,
			z = 0
		};
    }
    SyncColor();
}

Tyle. Kolorowanie będzie pięknie działać.

Gra po sieci (nie tylko LAN)

OK. Ale po co nam gra multiplayer do grania tylko i wyłączenie po sieci LAN? Stworzenie prostego systemu gry internetowej jest tutaj równie proste. Nie będzie to raczej system a’la MMO, ale system tworzenia meczy, jak ma to miejsce w Counter-Strike’u, Civilization, czy niemal każdej innej grze.

Najfajniejsze jest to… że nie musimy praktycznie nic robić! Kroki są dwa. Po pierwsze potrzebujemy konto developera Unity. Jeśli pobierałeś cokolwiek z Asset Store lub uruchamiałeś Unity, prawdopodobnie takowe posiadasz, bo do Unity wszędzie jest to samo konto. Jeśli konta nie masz, nie będę opisywał jak się je zakłada, bo w dzisiejszych czasach, każdy potrafi ogarnąć taki proces. Po założeniu konta i kliknięciu w podany link, pojawi się nam takie okienko:

Unity Cloud Service
Unity Cloud Service

Tutaj oczywiście się logujemy i tym samym trafiamy do takiego okienka:

Unity Cloud Projects
Unity Cloud Projects

Przy czym projekty są moje. U Ciebie mogą być inne, albo nie być żadnego. Klikamy teraz w jakiś projekt, albo w Create New Project, wtedy tworzymy nowy projekt przez podanie jego nazwy, następnie wchodzimy w edycję tego projektu.

Tutaj mała ciekawostka. Póki co, Unity nie udostępnia możliwości usuwania swoich projektów. Więc warto wybierać od razu w miarę sensowne nazwy.

Kolejne okienko jakie zobaczymy to:

Unity Cloud Project
Unity Cloud Project

 

Na tym ekranie widzimy wszystko co udostępnia nam integracja z serwisami Unity. Unity Collaborate, Cloud Build, Analitykę, Reklamy i… Multiplayer. Wystarczy teraz kliknąć w Enable Multiplayer, a pojawi nam się okienko, gdzie wybieramy ilu maksymalnie graczy może się podpiąć do jednego pokoju (meczu). Maksymalnie możemy wybrać 20, ale o tym później. Ja zalecam wybrać jak najmniejszą liczbę (możemy to później zmienić).

Po zatwierdzeniu pojawi nam się okienko, które odpowiada tylko za licznik CCU i w tym miejscu wypada o tym powiedzieć kilka słów. CCU oznacza concurrent users. Czyli liczbę graczy znajdujących się na raz w grze. Jak widać, obecnie limit wynosi 20. Ale… 20 na wszystkie projekty. Czyli przy 5 grach multiplayer, gdy w 2 grach mamy 20 graczy, to w 3 pozostałych nikt nie utworzy serwera. Wydaje się mało, ale to dlatego, że to są zasoby testowe. W każdej chwili możemy sobie wykupić większy zapas użytkowników, gdzie płacimy za transfer danych ($0.49 / GB).

Ważne jest tutaj jak Unity liczy CCU. Tzn. 1 CCU nie musi być fizycznym graczem będącym online. Jeśli utworzymy sobie mecz na 4 graczy, Unity zabiera nam z puli właśnie 4CCU. Warto tutaj wspomnieć, że Unity ma pewne problemy z odświeżaniem tej listy. Gdy ja pierwszy raz ogarnąłem system, to po 5 uruchomieniu gry, nagle nie mogłem tego zrobić 6 raz. Okazało się, że miałem pokoje na max 4 graczy i po 5 uruchomieniach, wykorzystałem swój limit CCU. Liczba spadła dopiero po kilku dniach, przy czym to było spowodowane bugiem ich serwera. Teraz działa to nieco płynniej, ale dalej przy testach warto stosować jak najmniejsze pokoje.

OK. Wszystko fajnie, ale nasza gra jeszcze nie działa tak jak chcemy. Brakuje wspomnianego drugiego kroku w samym Unity, dlatego przechodzimy do naszego projektu z grą. Otwieramy okienko Services [Window -> Services] albo CTRL + 0. Okienko wygląda tak:

Okienko Services w Unity
Okienko Services w Unity

Korzystając z formularza, możemy stworzyć projekt w Unity Cloud, ale my zrobiliśmy to wcześniej, dlatego wybieramy “I already have a Unity Project ID”.

Linkowanie Projektu w Unity
Linkowanie Projektu w Unity

Wybieramy sobie organizację (tutaj powinna być raczej jedna, czyli nasz login z konta Unity), oraz utworzony wcześniej projekt i klikamy “Link”. Pojawi się komunikat, gdzie potwierdzamy chęć podlinkowania projektu.

Podlinkowany projekt
Podlinkowany projekt

Nowe okienko prezentuje wszystko to, co widzieliśmy wcześniej w naszym Dashboardzie. Z tego miejsca mamy dostęp do tych samych funkcjonalności co z poziomu Dashboarda.

Najciekawszą rzeczą jest teraz to, że gdy uruchomimy nasz projekt i zamiast HostLAN wybierzemy Match Making, a tam stworzymy sobie mecz, natomiast z drugiego komputera w Mach Makingu, wybierzemy listę serwerów, pojawi się nam nasz mecz i będziemy mogli do niego dołączyć.

Tutaj może się pojawić pytanie: “Czy mogę się podpiąć do jakiegoś zewnętrznego serwera?”. Na tą chwilę nie. Unity uzależnia nas od swojej chmury i nie wiadomo czy planują to zmienić.

Podsumowanie

Po wszystkich trzech częściach, mamy całkiem sympatyczny fragment gry, który pięknie działa i pozwala bawić się po sieci. Od Ciebie zależy co zrobisz z tym dalej. Powodzenia!

Podoba Ci się? Udostępnij!