Executing on Server or Client

How you can run certain code on only the server, or only a client, or only on a host.

Overview

Very often your code will need to know if it's running on a server or a client, or both at the same time. There are several ways of knowing this, for example, code executed directly from client or server only events or methods, checking compiler directives to see the type of game build, marking methods to only allow running on a specific instance, or simply checking a Boolean value.


Checking a Boolean

You can easily check if the current code is running on the server with a Boolean check. FishNet's NetworkBehaviour and NetworkObject classes have easy to use properties for this exact reason. They are also accessible from the NetworkManager directly.

You can use IsClientStarted to detect if the instance running the code is a client. It could also be a server.

IsClientOnlyStarted can be used to detect if the instance running the code is a client only and not a server.

IsServerStarted detects if the instance running the code is the server. It could also be a client.

And finally, IsServerOnlyStarted returns whether the instance running the code is a server only and not a client.

If you are in a NetworkBehaviour then using IsServerStarted is easiest, but it also checks whether the NetworkObject has been spawned on the network. You can easily use the InstanceFinder to access the NetworkManager in order to check from a MonoBehaviour or non-spawned NetworkBehaviour though.


Method Attributes

There are a variety of attributes which can be used to ensure a method only runs on the appropriate game instance.

Client Method Attribute

Placing a Client attribute above a method ensures that the method cannot be called unless the local client is active (and optionally additionally the NetworkObject is initialized). There are additional properties which may be added to the attribute for additional functionality.

Server Method Attribute

The Server attribute provides similar features of the Client variant, except will not allow the method to run if the server is not active (and optionally additionally the NetworkObject is initialized).

Last updated