x


Networking trouble

Hi everyone.

I've got a problem. I have a multiplayer game, and when it starts i use a function to instantiate the player.

The thing is that the client does exactly what the server does, i mean, if my player in the server turns around and ends up looking at a tree, the client does the same.

This is the code i use to instantiate the players. Please help me i have no clue.

function OnNetworkLoadedLevel () {

    //instantiates the player

    myPlayer = playerPrefab;     

    myPlayer = Network.Instantiate(myPlayer, transform.position, transform.rotation, 0);     
    myPlayer.name = "PlayerNet" + playersCont.ToString();

    if(playersCont < 1){      

         myPlayer.AddComponent("Move");
         myPlayer.AddComponent("NetworkView");                             

    }

    if(Network.isServer){

                    //Instatiates a target 

         myPlayer = targetPrefab;     
         myPlayer.name = "Target";                                            
         myPlayer = Network.Instantiate(myPlayer, new Vector3(50,2.5,80), transform.rotation, 0);

    }

}

When the game is running the players are instantiated in client and server, but just the local player has attached a networkview component and the "Move" Script, so, i dont think the script is controlling the other player.

Thanks, regards.

more ▼

asked Mar 14 '12 at 07:10 AM

jaramillo gravatar image

jaramillo
16 6 7 8

(comments are locked)
10|3000 characters needed characters left

1 answer: sort voted first

That's because you use Network.Instantiate. What happens is all network players get an RPC to instantiate the player prefab, and that's it. The other part, where you attach components to it are only executed on the local machine. If you'll check you'll probably see the name of the player hasn't changed as well.

What you should do is write your custom instantiate RPC and within it change the name, attach the components etc.

Also note that you always need to attach a NetworkView component, and that this component has to have the same networkViewID across all connected machines, server and clients in order for it to synchronize correctly. You can assure that by adding a call to Network.AllocateViewID outside the instantiation RPC, then sending the resulting viewID as a parameter to the RPC.

It is important to realize that the network owner of an object is the last player to allocate it a viewID. This means that if a player calls Network.AllocateViewID, they own that ID. So if they send an RPC to everyone else to assign their newly acquired viewID to some object, they become the network owners of that objects, which means they're the only ones writing to the stream of that object (this means that they'll get true back when getting the BitStream.isWriting in OnSerializeNetworkView.

more ▼

answered Mar 14 '12 at 08:29 AM

asafsitner gravatar image

asafsitner
2.4k 2 8 19

Hi thanks for the answer. I'm a little lost here, because i had another game, and i load the players in the OnNetworkLoadedLevel () function.

I think i know what it is, but just in case i'm mistaken, could you please tell me, the player prefab has a networkview, you said that the networkview ID in the server has to be the same that the networkview ID in the client? if not, it they wont synchronize correctly?

Thanks, i will try what you tell me, in case i cant make it work, do you mind if i ask you some more questions?

Thanks.

Mar 14 '12 at 06:29 PM jaramillo

Not at all, although I can't guarantee an answer. :)

You are correct, though. The player prefab has to have the same networkViewID across all connected machines in order for it to synchronize properly.

If the player prefab comes with a NetworkView component already, just send an RPC to overwrite it's viewID with a new one.

Mar 15 '12 at 01:50 AM asafsitner

Thanks. I found the problem, i have some RPC functions on my Main Camera and since it has a NetworkView component it seems like it was synchronized with all cameras in the clients.

One more question, is there any way to do something like this? :

var nView : NetworkView; nView = clone.GetComponent(NetworkView); nView.viewID = 10;

I mean assign a viewID directly.

Thanks

Mar 15 '12 at 06:21 AM jaramillo

Yes, except that instead of assigning like this:

nView.viewID = 10;

you use Network.AllocateViewID() to reserve an ID. Then, you can pass this around by RPC to all the rest of the clients.

var newID : NetworkViewID = Network.AllocateViewID();

// send the newID as a paramater in the instantiation RPC

var nView : NetworkView;
nView = clone.GetComponent(NetworkView);
nView.viewID = newID;
Mar 15 '12 at 06:31 AM syclamoth
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x702
x683
x116

asked: Mar 14 '12 at 07:10 AM

Seen: 711 times

Last Updated: Mar 15 '12 at 06:31 AM