Repository navigation
Plugin Documentatie
Netcode for GameObjects is de door Unity aangeraden plugin voor multiplayer. Voor dit project hebben we niet alle onderdelen van deze plugin nodig, maar de onderdelen die we wel gebruiken zijn hier gedocumenteerd.
De NetworkManager is een singleton in de scene dat het netwerk beheerd. Het is een leeg GameObject met een NetworkManager script waarin je alle instellingen van het netwerken kan aanpassen. Ook staat er een Unity Transport script op. Dat wordt er automatisch voor je opgezet wanneer je de Network Transport property op het script wilt veranderen.
Een NetworkObject is een leeg GameObject met een NetworkObject script eraan. Dit zorgt ervoor dat het object genetwerkt wordt tussen meerdere clients.
Elk NetworkObject, of kinderen van het NetworkObject, heeft ook ten minste één NetworkBehaviour script. De volgorde van deze twee componenten is belangrijk. In de Inspector in Unity moet het NetworkObject component bovenaan staan, dus voor de NetworkBehaviour scripts.
Een NetworkBehaviour script is een script waarin de class overerft van de NetworkBehaviour class, in plaats van de MonoBehaviour class. De NetworkBehaviour class erft ook over van MonoBehaviour, dus standaard functies zijn nog steeds mogelijk.
In deze class wordt vaak ook OnNetworkSpawn() gebruikt. Deze functie wordt aangeroepen wanneer het NetworkObject ingespawned wordt. De "Order of Execution" verschilt dan wanneer het NetworkObject dynamisch ingespawned wordt of niet:
| In-scene Geplaatst | Dynamisch Ingespawned |
|---|---|
| Awake | Awake |
| Start | OnNetworkSpawn |
| OnNetworkSpawn | Start |
using Unity.Netcode;
public class NetworkedClassName : NetworkBehaviour
{
public override void OnNetworkSpawn()
{
base.OnNetworkSpawn();
}
}NetworkVariables zijn speciale variabelen die automatisch gesynchroniseerd worden over het netwerk. Veranderingen van die variabelen kunnen gecheckt worden door op OnValueChanged te abonneren met een functie. Die functie krijgt dan 2 parameters voor de vorige waarde en de nieuwe (huidige) waarde.
Je kan in de NetworkVariables ook de lees/schrijf rechten aanpassen. Standaard zijn ze leesbaar voor iedereen en schrijfbaar voor alleen de server. Dit zijn de mogelijke rechten:
Lezen (NetworkVariableReadPermission) |
Schrijven (NetworkVariableWritePermission) |
|---|---|
| Everyone | Server |
| Owner | Owner |
using Unity.Netcode;
public class NetworkedClassName : NetworkBehaviour
{
private NetworkVariable<int> _networkedInteger = new(default, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server);
public override void OnNetworkSpawn()
{
base.OnNetworkSpawn();
_networkedInteger.Value = 69;
_networkedInteger.OnValueChanged += NetworkedIntegerChanged;
}
private void NetworkedIntegerChanged(int _previous, int _current)
{
}
}Scripts kunnen communiceren met andere clients en de server door RPC's aan te roepen. Dat zijn functies die over het netwerk gestuurd worden om op een andere plek uitgevoerd te worden.
RPC's worden gemaakt door een [Rpc()] attribute boven een functie te zetten, en door een Rpc navoegsel toe te voegen aan de method naam. In de attribute specificeer je waar de functie uitgevoerd moet worden:
SendTo.ServerSendTo.NotServerSendTo.AuthoritySendTo.NotAuthoritySendTo.OwnerSendTo.NotOwnerSendTo.MeSendTo.NotMeSendTo.EveryoneSendTo.ClientsAndHostSendTo.SpecifiedInParams
using Unity.Netcode;
public class NetworkedClassName : NetworkBehaviour
{
[Rpc(SendTo.Server)]
private void RunOnServerRpc()
{
}
}