Gdy nowy gracz dołącza do gry, trzeba dodać go do odpowiedniej drużyny, stosując równoważenie asymetryczne. Jeśli gracz trafi do drużyny infiltratorów, konieczne będzie również powiązanie z nim instancji OnInfiltratorDamaged().
Poniższa procedura ilustruje, w jaki sposób przydzielać graczy dołączających do gry w trakcie jej trwania do właściwej drużyny z zachowaniem równowagi.
Konfiguracja funkcji dołączania graczy
- Dodaj nową funkcję
OnInfiltratorJoined()do definicji klasyinvisibility_manager. Funkcja ta pobiera agenta i spawnuje instancjęOnInfiltratorDamaged()z zastosowaniem danego agenta. Do funkcji tej trzeba dodać specyfikator `, ponieważ będzie ona wywoływana z poziomutriad_infiltration_game`.# Uruchamia funkcję OnInfiltratorDamaged, gdy do gry dołącza nowy infiltrator OnInfiltratorJoined<public>(InAgent:agent):void= spawn{OnInfiltratorDamaged(InAgent)} - Dodaj nową funkcję
OnPlayerAdded()do definicji klasytriad_infiltration_game. Funkcja ta pobiera gracza, przydziela go do właściwej drużyny z zachowaniem równowagi, a także wywołuje funkcjęOnInfiltratorJoined(), jeśli nowy gracz jest infiltratorem.# Określa zachowanie dotyczące nowego gracza dołączającego do gry. OnPlayerAdded(InPlayer:player):void= - Pobierz
fort_team_collectiondla bieżącej przestrzeni gry i zapisz w zmiennejFortTeamCollection.# Określa zachowanie dotyczące nowego gracza dołączającego do gry. OnPlayerAdded(InPlayer:player):void= Logger.Print("Dołączył nowy gracz, przypisuję go do drużyny") FortTeamCollection := GetPlayspace().GetTeamCollection()Refaktoryzacja równoważenia drużyn
- Musisz przydzielić nowego gracza do właściwej drużyny z zachowaniem równowagi, jednak wywołanie funkcji
BalanceTeams()spowoduje przydzielenie każdego gracza do nowej drużyny. Zamiast przepisywać kod w celu znalezienia najmniejszej drużyny dla nowego gracza i przydzielenia go do niej w sposób zrównoważony, można wykorzystać okazję do przeprowadzenia refaktoryzacji.- Dodaj nową metodę
BalancePlayer()do definicji klasytriad_infiltration_game. Metoda ta pobiera gracza i w sposób asymetryczny i zrównoważony przydziela go do właściwej drużyny.# Dla każdego gracza wykonaj iterację przez listę drużyn i przypisz gracza # do drużyny, w której jest najmniej graczy, a jeśli liczebności są równe, przypisz go do jego drużyny początkowej. BalancePlayer(InPlayer:player):void= Logger.Print("Zaczynam równoważyć gracza") - Wyodrębnij kod wewnątrz pętli
forwBalanceTeams()i umieść go w metodzieBalancePlayer(), zmieniając nazwęTeamPlayernaInPlayer. Otrzymany kodBalancePlayer()powinien wyglądać następująco:# Dla każdego gracza wykonaj iterację przez listę drużyn i przypisz gracza # do drużyny, w której jest najmniej graczy, a jeśli liczebności są równe, przypisz go do jego drużyny początkowej. BalancePlayer(InPlayer:player):void= Logger.Print("Zaczynam równoważyć gracza") var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, GetPlayspace().GetTeamCollection().AddToTeam[InPlayer, AssignedTeam]): Logger.Print("Próbuję przypisać gracza, który dopiero dołączył, do nowej drużyny") else: Logger.Print("Ten gracz był już w najmniejszej drużynie") - Teraz w
BalanceTeams()dodaj wywołanieBalancePlayer()wewnątrz pętlifor. Pozwoli to zachować funkcjonalnośćBalanceTeams(), a jednocześnie umożliwi zrównoważony przydział pojedynczych graczy. Otrzymany kodBalanceTeams()powinien wyglądać następująco:# Równoważy wszystkich graczy we wszystkich drużynach w grze BalanceTeams():void= Logger.Print("Zaczynam równoważyć drużyny") var AllPlayers:[]player := GetPlayspace().GetPlayers() set AllPlayers = Shuffle(AllPlayers) Logger.Print("Długość AllPlayers wynosi {AllPlayers.Length}") for (TeamPlayer:AllPlayers): BalancePlayer(TeamPlayer)
- Dodaj nową metodę
- Wróć do
OnPlayerAdded()i dodaj wywołanieBalancePlayer(), przekazując gracza, który właśnie dołączył.# Określa zachowanie dotyczące nowego gracza dołączającego do gry. OnPlayerAdded(InPlayer:player):void= Logger.Print("Dołączył nowy gracz, przypisuję go do drużyny") FortTeamCollection := GetPlayspace().GetTeamCollection() set AllPlayers = GetPlayspace().GetPlayers() # Przypisz nowego gracza do najmniejszej drużyny BalancePlayer(InPlayer) - Znajdź indeks drużyny gracza po zrównoważeniu, wykonując iterację przez każdą drużynę w tablicy
Teams, używającGetTeam[]jako filtra do sprawdzenia, czy jest równyPlayerTeam.# Określa zachowanie dotyczące nowego gracza dołączającego do gry. OnPlayerAdded(InPlayer:player):void= Logger.Print("Dołączył nowy gracz, przypisuję go do drużyny") FortTeamCollection := GetPlayspace().GetTeamCollection() # Przypisz nowego gracza do najmniejszej drużyny, asymetrycznie. BalancePlayer(InPlayer) for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] - Pobierz teleporter powiązany z drużyną gracza, indeksując tablicę
Teleportersz użyciemTeamIndexi zapisując go w zmiennejTeamTeleporter. Zapisz przekształcenie tego teleportera w zmiennejTransform. Następnie zresprawnuj nowego gracza przy teleporterze startowym jego drużyny.for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform() do: InPlayer.Respawn(Transform.Translation, Transform.Rotation) Logger.Print("Zespawnowany gracz został teleportowany do jego lokalizacji startowej") - Na końcu sprawdź, czy gracz, który właśnie dołączył, jest infiltratorem, porównując jego drużynę z ustawioną wcześniej opcją
Infiltrators. Jeśli gracz jest infiltratorem, wywołajOnInfiltratorJoined()z poziomu klasyinvisibility_managerdla nowego gracza, aby zainicjować jego migotanie. Otrzymany kodOnPlayerAdded()powinien wyglądać następująco:# Określa zachowanie dotyczące nowego gracza dołączającego do gry. OnPlayerAdded(InPlayer:player):void= Logger.Print("Dołączył nowy gracz, przypisuję go do drużyny") FortTeamCollection := GetPlayspace().GetTeamCollection() # Przypisz nowego gracza do najmniejszej drużyny, asymetrycznie. BalancePlayer(InPlayer) for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform() do: InPlayer.Respawn(Transform.Translation, Transform.Rotation) Logger.Print("Zespawnowany gracz został teleportowany do jego lokalizacji startowej") # Jeśli gracz był infiltratorem, wywołaj funkcję OnInfiltratorJoined w # InvisibilityManager. if(PlayerTeam = MaybeInfiltrators?): InvisibilityManager.OnInfiltratorJoined(InPlayer) - Zapisz skrypt, skompiluj go, a następnie na pasku narzędzi UEFN kliknij opcję Uruchom sesję, aby przetestować poziom w grze. W trakcie testowania poziomu w grze gracze dołączający do gry w trakcie jej trwania powinni być przydzielani do właściwej drużyny. Jeśli gracz jest infiltratorem, powinien spawnować się niewidoczny i migotać w przypadku odniesienia obrażeń.
Następny krok
W następnym kroku tego samouczka dowiesz się, jak utworzyć wizualny wskaźnik dla gracza, gdy przechwytuje on cel.