Wenn ein neuer Spieler dem Spiel beitritt, muss er asymmetrisch in das richtige Team eingeteilt werden. Wenn es sich bei diesem Team um die Infiltratoren handelt, muss ihnen auch eine Instanz von OnInfiltratorDamaged() zugeordnet werden.
Befolge die nachstehenden Schritte, um zu erfahren, wie du Spieler dem richtigen Team zuordnest, wenn sie dem laufenden Spiel beitreten.
Einrichten von Spielerbeitrittsfunktionen
- Füge eine neue Funktion
OnInfiltratorJoined()in die Klassendefinition voninvisibility_managerein. Diese Funktion nimmt einen Agenten und erzeugt eine Instanz vonOnInfiltratorDamaged()mit dem angegebenen Agenten. Füge den `-Bezeichner zu dieser Funktion hinzu, da du sie vontriad_infiltration_game` aus aufrufen wirst.# Spawnt eine OnInfiltratorDamaged-Funktion, wenn ein neuer Infiltrator dem Spiel beitritt OnInfiltratorJoined<public>(InAgent:agent):void= spawn{OnInfiltratorDamaged(InAgent)} - Füge eine neue Funktion
OnPlayerAdded()zur Definition der Klassetriad_infiltration_gamehinzu. Diese Funktion nimmt einen Spieler, gleicht ihn mit dem richtigen Team ab und ruftOnInfiltratorJoined()auf, wenn der neue Spieler ein Infiltrator ist.# Behandelt einen neuen Spieler, der dem Spiel beitritt. OnPlayerAdded(InPlayer:player):void= - Hole die
fort_team_collectionfür den aktuellen Spielraum und speichere sie in einer VariablenFortTeamCollection.# Behandelt einen neuen Spieler, der dem Spiel beitritt. OnPlayerAdded(InPlayer:player):void= Logger.Print("Ein neuer Spieler ist beigetreten, Zuweisung zu Team erfolgt!") FortTeamCollection := GetPlayspace().GetTeamCollection()Refactoring der Team-Balance
- Du musst den neuen Spieler in das richtige Team einordnen, aber wenn du
BalanceTeams()aufrufst, wirst du am Ende jeden Spieler in ein neues Team einordnen. Anstatt den Code neu zu schreiben, um das kleinste Team für den neuen Spieler zu finden und zu balancieren, ist dies eine gute Gelegenheit für ein Refactoring.- Füge eine neue Methode
BalancePlayer()zur Definition der Klassetriad_infiltration_gamehinzu. Diese Methode nimmt einen Spieler und teilt ihn asymmetrisch in das richtige Team ein.# Iteriere für jeden Spieler durch die Liste der Teams und weise ihn # dem Team mit den wenigsten Spielern zu, oder bei Gleichstand dem Start-Team. BalancePlayer(InPlayer:player):void= Logger.Print("Ausgleich der Spieler begonnen") - Extrahiere den Code innerhalb der
for-Schleife inBalanceTeams()und platziere ihn innerhalb vonBalancePlayer()und benenneTeamPlayerinInPlayerum. DeinBalancePlayer()-Code sollte wie folgt aussehen:# Iteriere für jeden Spieler durch die Liste der Teams und weise ihn # dem Team mit den wenigsten Spielern zu, oder bei Gleichstand dem Start-Team. BalancePlayer(InPlayer:player):void= Logger.Print("Ausgleich der Spieler begonnen") var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, GetPlayspace().GetTeamCollection().AddToTeam[InPlayer, AssignedTeam]): Logger.Print("Versuch, neu beigetretenen Spieler einem neuen Team zuzuweisen") else: Logger.Print("Der Spieler war bereits im kleinsten Team") - Füge nun in
BalanceTeams()einen Aufruf zuBalancePlayer()innerhalb derfor-Schleife hinzu. Dadurch wird die Funktionalität vonBalanceTeams()beibehalten, während du gleichzeitig die Möglichkeit hast, einen Spieler individuell zu balancieren. DeinBalanceTeams()-Code sollte wie folgt aussehen:# Gleicht alle Spieler in allen Teams im Spiel aus. BalanceTeams():void= Logger.Print("Teams werden ausgeglichen") var AllPlayers:[]player := GetPlayspace().GetPlayers() set AllPlayers = Shuffle(AllPlayers) Logger.Print("Länge von AllPlayers ist {AllPlayers.Length}") for(TeamPlayer:AllPlayers): BalancePlayer(TeamPlayer)
- Füge eine neue Methode
- Zurück in
OnPlayerAdded(), füge einen Aufruf vonBalancePlayer()hinzu, der den Spieler übergibt, der gerade beigetreten ist.# Behandelt einen neuen Spieler, der dem Spiel beitritt. OnPlayerAdded(InPlayer:player):void= Logger.Print("Ein neuer Spieler ist beigetreten, Zuweisung zu Team erfolgt!") FortTeamCollection := GetPlayspace().GetTeamCollection() set AllPlayers = GetPlayspace().GetPlayers() # Weise den neuen Spieler dem kleinsten Team zu BalancePlayer(InPlayer) - Finde den Index der Mannschaft des Spielers nach dem Ausgleich, indem du durch jede Mannschaft im Array
Teamsiterierst undGetTeam[]als Filter verwendest, um zu prüfen, ob es gleichPlayerTeamist.# Behandelt einen neuen Spieler, der dem Spiel beitritt. OnPlayerAdded(InPlayer:player):void= Logger.Print("Ein neuer Spieler ist beigetreten, Zuweisung zu Team erfolgt!") FortTeamCollection := GetPlayspace().GetTeamCollection() # Weist den neuen Spieler dem kleinsten Team zu, asymmetrisch. BalancePlayer(InPlayer) for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] - Hole den Teleporter, der mit dem Team des Spielers assoziiert ist, indem du mit
TeamIndexin das ArrayTeleportersindizierst und es in einer VariablenTeamTeleporterspeicherst. Speichere die Transformation dieses Teleporters in einer VariablenTransform. Respawne dann den neuen Spieler am Start-Teleporter seines Teams.for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform() do: InPlayer.Respawn(Transform.Translation, Transform.Rotation) Logger.Print("Der gespawnte Spieler wurde an seine Startposition teleportiert") - Abschließend solltest du überprüfen, ob der Spieler, der gerade beigetreten ist, ein Infiltrator ist, indem du sein Team mit der
Infiltrators-Option vergleichst, die du zuvor eingerichtet hast. Wenn dies der Fall ist, rufeOnInfiltratorJoined()von der Klasseinvisibility_managerfür den neuen Spieler auf, damit er zu flackern beginnt. DeinOnPlayerAdded()-Code sollte wie folgt aussehen:# Behandelt einen neuen Spieler, der dem Spiel beitritt. OnPlayerAdded(InPlayer:player):void= Logger.Print("Ein neuer Spieler ist beigetreten, Zuweisung zu Team erfolgt!") FortTeamCollection := GetPlayspace().GetTeamCollection() # Weist den neuen Spieler dem kleinsten Team zu, asymmetrisch. 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("Der gespawnte Spieler wurde an seine Startposition teleportiert") # Wenn der Spieler ein Infiltrator war, rufe OnInfiltratorJoined auf. # InvisibilityManager. if(PlayerTeam = MaybeInfiltrators?): InvisibilityManager.OnInfiltratorJoined(InPlayer) - Speichere das Script, erstelle es und klicke auf Sitzung starten in der UEFN-Symbolleiste, um das Level zu testen. Wenn du dein Level testest, sollten die Spieler dem richtigen Team zugeordnet werden, wenn sie einem laufenden Spiel beitreten. Wenn dieser Spieler ein Infiltrator ist, sollte er unsichtbar spawnen und flackern, wenn er Schaden nimmt.
Nächster Schritt
Im nächsten Schritt dieses Tutorials lernst du, wie du einen visuellen Indikator für einen Spieler erstellst, wenn er ein Ziel erobert.