0
\$\begingroup\$

i'm following this tutorial on raywenderlich to do with multiplayer, since Unity updated, they have added a new method for the participant lefting the event. So I am getting this error on Unity:

Assets/Script/Multiplayer/GPG Multiplayer/MultiplayerController.cs(8,14): error CS0738: MultiplayerController' does not implement interface member GooglePlayGames.BasicApi.Multiplayer.RealTimeMultiplayerListener.OnParticipantLeft(GooglePlayGames.BasicApi.Multiplayer.Participant)' and the best implementing candidate MultiplayerController.OnRoomSetupProgress(float)' return typevoid' does not match interface member return type `void'

Whilst following the tutorial, I saw that someone in the comment section had the same error as me and someone replied back, however I wasn't sure how I should implement it as he didn't really explain it in great and clear detail!I also do not know how to create my own OnParticipantLeft(Participant leavingPlayer) method, which is why I was following the tutorial!

Hmm... looks like since this tutorial was written, they've added a new method or two to that interface. Here's the new method they're expecting to see

/// /// Raises the participant left event. /// This is called during room setup if a player declines an invitation /// or leaves. The status of the participant can be inspected to determine /// the reason. If all players have left, the room is closed automatically. /// /// Participant that left void OnParticipantLeft(Participant participant); If you just want to get your project going again, you can add your own OnParticipantLeft(Participant leavingPlayer) method to your MultiplayerController object and have it print out a debug message or two.

In an actual game, you could probably use this to make sure, say, your lobby display doesn't get messed up if a player joins, then leaves while you're waiting for a third or fourth player to join.

So anyway does anyone know how to fix this error? Below is my code:

 using UnityEngine; using UnityEngine.SceneManagement; using System.Collections; using GooglePlayGames; using GooglePlayGames.BasicApi.Multiplayer; using System.Collections.Generic; public class MultiplayerController : RealTimeMultiplayerListener { public MPLobbyListener lobbyListener; private static MultiplayerController _instance = null; private uint minimumOpponents = 1; private uint maximumOpponents = 1; private uint gameVariation = 0; private byte _protocolVersion = 1; // Byte + Byte + 2 floats for position + 2 floats for velcocity + 1 float for rotZ private int _updateMessageLength = 22; private List<byte> _updateMessage; public MPUpdateListener updateListener; public string GetMyParticipantId() { return PlayGamesPlatform.Instance.RealTime.GetSelf().ParticipantId; } public List<Participant> GetAllPlayers() { return PlayGamesPlatform.Instance.RealTime.GetConnectedParticipants (); } private void StartMatchMaking() { PlayGamesPlatform.Instance.RealTime.CreateQuickGame (minimumOpponents, maximumOpponents, gameVariation, this); } private MultiplayerController() { _updateMessage = new List<byte>(_updateMessageLength); PlayGamesPlatform.DebugLogEnabled = true; PlayGamesPlatform.Activate (); } private void ShowMPStatus(string message) { Debug.Log(message); if (lobbyListener != null) { lobbyListener.SetLobbyStatusMessage(message); } } public void SendMyUpdate(float posX, float posY, Vector2 velocity, float rotZ) { _updateMessage.Clear (); _updateMessage.Add (_protocolVersion); _updateMessage.Add ((byte)'U'); _updateMessage.AddRange (System.BitConverter.GetBytes (posX)); _updateMessage.AddRange (System.BitConverter.GetBytes (posY)); _updateMessage.AddRange (System.BitConverter.GetBytes (velocity.x)); _updateMessage.AddRange (System.BitConverter.GetBytes (velocity.y)); _updateMessage.AddRange (System.BitConverter.GetBytes (rotZ)); byte[] messageToSend = _updateMessage.ToArray(); Debug.Log ("Sending my update message " + messageToSend + " to all players in the room"); PlayGamesPlatform.Instance.RealTime.SendMessageToAll (false, messageToSend); } public void SignInAndStartMPGame() { if (! PlayGamesPlatform.Instance.localUser.authenticated) { PlayGamesPlatform.Instance.localUser.Authenticate((bool success) => { if (success) { Debug.Log ("We're signed in! Welcome " + PlayGamesPlatform.Instance.localUser.userName); StartMatchMaking(); } else { Debug.Log ("Oh... we're not signed in."); } }); } else { Debug.Log ("You're already signed in."); StartMatchMaking(); } } public void SignOut() { PlayGamesPlatform.Instance.SignOut (); } public bool IsAuthenticated() { return PlayGamesPlatform.Instance.localUser.authenticated; } public void TrySilentSignIn() { if (! PlayGamesPlatform.Instance.localUser.authenticated) { PlayGamesPlatform.Instance.Authenticate ((bool success) => { if (success) { Debug.Log ("Silently signed in! Welcome " + PlayGamesPlatform.Instance.localUser.userName); } else { Debug.Log ("Oh... we're not signed in."); } }, true); } else { Debug.Log("We're already signed in"); } } public static MultiplayerController Instance { get { if (_instance == null) { _instance = new MultiplayerController(); } return _instance; } } public void OnRoomSetupProgress (float percent) { ShowMPStatus ("We are " + percent + "% done with setup"); } public void OnRoomConnected (bool success) { if (success) { ShowMPStatus ("We are connected to the room! I would probably start our game now."); lobbyListener.HideLobby(); lobbyListener = null; SceneManager.LoadScene("MainGame"); } else { ShowMPStatus ("Uh-oh. Encountered some error connecting to the room."); } } public void OnLeftRoom () { ShowMPStatus ("We have left the room. We should probably perform some clean-up tasks."); } public void OnPeersConnected (string[] participantIds) { foreach (string participantID in participantIds) { ShowMPStatus ("Player " + participantID + " has joined."); } } public void OnPeersDisconnected (string[] participantIds) { foreach (string participantID in participantIds) { ShowMPStatus ("Player " + participantID + " has left."); } } public void OnRealTimeMessageReceived (bool isReliable, string senderId, byte[] data) { // We'll be doing more with this later... byte messageVersion = (byte)data[0]; // Let's figure out what type of message this is. char messageType = (char)data[1]; if (messageType == 'U' && data.Length == _updateMessageLength) { float posX = System.BitConverter.ToSingle(data, 2); float posY = System.BitConverter.ToSingle(data, 6); float velX = System.BitConverter.ToSingle(data, 10); float velY = System.BitConverter.ToSingle(data, 14); float rotZ = System.BitConverter.ToSingle(data, 18); Debug.Log ("Player " + senderId + " is at (" + posX + ", " + posY + ") traveling (" + velX + ", " + velY + ") rotation " + rotZ); // We'd better tell our GameController about this. if (updateListener != null) { updateListener.UpdateReceived(senderId, posX, posY, velX, velY, rotZ); } } } } 
\$\endgroup\$

    1 Answer 1

    1
    \$\begingroup\$

    You're missing some members from the interface RealTimeMultiplayerListener. According to your error, you need to implement GooglePlayGames.BasicApi.Multiplayer.RealTimeMultiplayerListener.OnParticipantLeft(GooglePlayGames.BasicApi.Multiplayer.Participant)

    You could fix it adding this code to your MultiplayerController:

    public void OnParticipantLeft(Participant participant) { // Your code for this case (log, message, etc) } 
    \$\endgroup\$
    0

      You must log in to answer this question.

      Not the answer you're looking for? Browse other questions tagged .