Hello,
I’ve recently followed the multiplayer course of Code Monkey, and I’m facing a problem that I clearly don’t understand.
When I need to SetRelayServerData, I followed the instructions of the course and the documentation and wrote this :
NetworkManager.Singleton.GetComponent().SetRelayServerData(new RelayServerData(allocation, “dtls”));
From your screenshot, I’m not sure you’re using the proper hostConnectionData from the allocation? You’ve got allocation.ConnectionData instead of allocation.HostConnectionData for that parameter in the RelayServerData signature. Can you give that a try?
It seems that Unity think HostConnectionData doesn’t exist ?
But it’s weird, because I saw some information about the : “HostConnectionData”, and I just can’t figure where is it
Ok, is this the Kitchen Chaos course? I did that in my free time this past summer and ported it to Unity 6 + the new Multiplayer Services SDK. Are you using the Multiplayer Services SDK instead of the standalone SDKs? (FYI that is the recommendation since those packages will be deprecated in upcoming releases).
I found that the new SDK does not ship an assembly for Relay therefore couldn’t use the Relay allocation based constructors for UnityTransport and instead needed to construct the RelayServerData myself. I gave that feedback to the team and I believe they provided a better option with that SDK. Here is a recent post detailing how to use the new sdk:
Yep this is this course ! And also yes I use the Multiplayer Services SDK and not the Relay classic one ( and I do the same for the Lobby SDK, I don’t use the classic)
So If I understand well, the Multiplayer Services Package doesn’t have a certain assembly that is requiered for making the Relay, and so I’ll need to find a better solution with the topic you linked me ? Am I right ?
Cool, thanks for confirming that information. The direct link has the solution that “should” work, use the AllocationUtils class as demonstrated by Erick. Otherwise, Here is the code I used to get that course to work (again, I think that post should resolve your issue, but providing the snippet I wrote “just in case”).
public async void JoinWithCode(string lobbyCode) {
OnJoinStarted?.Invoke(this, EventArgs.Empty);
try {
joinedLobby = await LobbyService.Instance.JoinLobbyByCodeAsync(lobbyCode);
string relayJoinCode = joinedLobby.Data[KEY_RELAY_JOIN_CODE].Value;
JoinAllocation joinAllocation = await JoinRelay(relayJoinCode);
// NetworkManager.Singleton.GetComponent<UnityTransport>().SetRelayServerData(new RelayServerData(joinAllocation, "dtls"));
// Note: the new MPS SDK (as of 0.5.0) does not ship an assembly for Relay therefore we cannot use the Relay
// allocation based constructors for UnityTransport and instead must construct the RelayServerData ourselves
string host = joinAllocation.RelayServer.IpV4;
ushort port = (ushort)joinAllocation.RelayServer.Port;
byte[] joinAllocationId = joinAllocation.AllocationIdBytes;
byte[] connectionData = joinAllocation.ConnectionData;
byte[] hostConnectionData = joinAllocation.HostConnectionData;
byte[] key = joinAllocation.Key;
bool isSecure = false;
foreach (var endpoint in joinAllocation.ServerEndpoints)
{
if (endpoint.ConnectionType == "dtls")
{
host = endpoint.Host;
port = (ushort)endpoint.Port;
isSecure = endpoint.Secure;
}
}
NetworkManager.Singleton.GetComponent<UnityTransport>().SetRelayServerData(new RelayServerData(host, port, joinAllocationId, connectionData, hostConnectionData, key, isSecure));
KitchenGameMultiplayer.Instance.StartClient();
} catch (LobbyServiceException e) {
Debug.Log(e);
OnJoinFailed?.Invoke(this, EventArgs.Empty);
}
}
Just a little question, why is this solution work ? And how would I find this kind of solution if you wouldn’t be there ?
I want to be able to solve that pretty tough problem by myself
Nice, glad it helped! So firstly CodeMonkey’s excellent course was done with the original standalone SDKs and although things are fairly close to compatible with the new Multiplayer Services SDK there are some differences. Secondly, the solution works because it’s doing specifically what you wanted it to do but in a simplified api call
As for how to find such a solution… we’ve begun documenting some of this here: Migrating from the standalone SDKs to the Multiplayer SDK but honestly on this specific solution we needed to do better by documenting the AllocationUtils use cases and making that easy to find. Your forum post and the other one along with some internal feedback has already triggered a work item to properly document this moving forward.
As a general recommendation, I personally spend time skimming through API documentation, but also open Unity packages in my IDE and trace through the code to get a general sense of what things do and the shape of the public interfaces. Live debugging with breakpoints to understand the flow is also super helpful. Usually I come away with a sufficient grasp to debug what’s going wrong in my custom code. But this is just typical programming advice, not terribly pertinent to you specific use case.
Good luck with the remainder of the course and your future projects!
Okay okay I take notes I take notes. I don’t pass time on API documentation at all, at least not the same way you doing it hehe !
I can’t wait to one day be able to help someone else with that kind of problem et maybe apply for some jobs that require that kind of skill level !