Search Unity

  1. We are migrating the Unity Forums to Unity Discussions. On July 12, the Unity Forums will become read-only.

    Please, do not make any changes to your username or email addresses at id.unity.com during this transition time.

    It's still possible to reply to existing private message conversations during the migration, but any new replies you post will be missing after the main migration is complete. We'll do our best to migrate these messages in a follow-up step.

    On July 15, Unity Discussions will become read-only until July 18, when the new design and the migrated forum contents will go live.


    Read our full announcement for more information and let us know if you have any questions.

Network RPC

Discussion in 'Multiplayer' started by gazwi86, Mar 26, 2008.

  1. gazwi86

    gazwi86

    Joined:
    Jan 25, 2008
    Posts:
    21
    Right, i need to admit im a noobie. this is my first networked game and i have been working from the network example code. Im trying to destroy the visible player on a remote view whaen the player changes level as it doesnt already. my code is as follows:


    Code (csharp):
    1.  
    2. var supportedNetworkLevels : String[] = [ "mylevel" ];
    3. var disconnectedLevel : String = "loader";
    4.  
    5. // Keep track of the last level prefix (increment each time a new level loads)
    6. private var lastLevelPrefix = 0;
    7.  
    8. function Awake ()
    9. {
    10.     // Network level loading is done in a seperate channel.
    11.     DontDestroyOnLoad(this);
    12.     networkView.group = 1;
    13.     Application.LoadLevel(disconnectedLevel);
    14. }
    15.  
    16. function OnGUI ()
    17. {
    18.     // When network is running (server or client) then display the levels
    19.     // configured in the supportedNetworkLevels array and allow them to be loaded
    20.     // at the push of a button
    21.     if (Network.peerType != NetworkPeerType.Disconnected)
    22.     {
    23.         GUILayout.BeginArea(Rect(0, Screen.height - 30, Screen.width, 30));
    24.         GUILayout.BeginHorizontal();
    25.        
    26.         for (var level in supportedNetworkLevels)
    27.         {
    28.             if (GUILayout.Button(level))
    29.             {
    30.                 // Make sure no old RPC calls are buffered and then send load level command
    31.                 Network.RemoveRPCsInGroup(1);
    32.                 // Load level with incremented level prefix (for view IDs)
    33.                
    34.                 networkView.RPC( "LoadLevel", RPCMode.AllBuffered, level, lastLevelPrefix + 1);
    35.                 networkView.RPC( "DestroyPlayer", RPCMode.Others, NetworkViewID, NetworkPlayer);
    36.             }
    37.         }
    38.         GUILayout.FlexibleSpace();
    39.         GUILayout.EndHorizontal();
    40.         GUILayout.EndArea();
    41.     }
    42. }
    43.  
    44. @RPC
    45. function LoadLevel (level : String, levelPrefix : int)
    46. {
    47.     Debug.Log("Loading level " + level + " with prefix " + levelPrefix);
    48.     lastLevelPrefix = levelPrefix;
    49.  
    50.  
    51.  
    52.     // There is no reason to send any more data over the network on the default channel,
    53.     // because we are about to load the level, thus all those objects will get deleted anyway
    54.     Network.SetSendingEnabled(0, false);
    55.  
    56.     // We need to stop receiving because first the level must be loaded.
    57.     // Once the level is loaded, RPC's and other state update attached to objects in the level are allowed to fire
    58.     Network.isMessageQueueRunning = false;
    59.        
    60.     // All network views loaded from a level will get a prefix into their NetworkViewID.
    61.     // This will prevent old updates from clients leaking into a newly created scene.
    62.     Network.SetLevelPrefix(levelPrefix);
    63.     Application.LoadLevel(level);
    64.     yield;
    65.     yield;
    66.    
    67.     // Allow receiving data again
    68.     Network.isMessageQueueRunning = true;
    69.     // Now the level has been loaded and we can start sending out data
    70.     Network.SetSendingEnabled(0, true);
    71.  
    72.     // Notify our objects that the level and the network is ready
    73.     for (var go in FindObjectsOfType(GameObject))
    74.         go.SendMessage("OnNetworkLoadedLevel", SendMessageOptions.DontRequireReceiver);
    75. }
    76.  
    77. @RPC
    78. function DestroyPlayer (NetworkViewID : int, NetworkPlayer : Transform){
    79.     Network.Destroy(GetComponent(NetworkView).viewID);
    80.  
    81.    
    82. }
    83.  
    84. function OnDisconnectedFromServer ()
    85. {
    86.     Application.LoadLevel(disconnectedLevel);
    87. }
    88.  
    89. @script RequireComponent(NetworkView)
    90.  
    But that doesnt seem to work. Ive really been struggleing to get my head around all this so if you could explain what ive done wrong i would be most grateful.