x


Instantiating Multiple Clients into one

Hello Everyone!

I am having trouble bringing in a second player to my server. Everything runs smoothly (server lists, starting servers, ect.) until another client connects to a loaded level. Instead of syncing to each other and instantiating another player in the same game space a second prefab is instantiated on either players client.

So if Player A starts the server. Player A instantiates at the spawn point and can fly around. but when Player B connects. Player B instantiates 2 of the same prefab(within their clients), causes player A's game to instantiate another prefab at the spawn point, and player B controls both prefabs on their side simultaneously. Player A also controls its 2 spawned prefabs simultaneously.

Neither player can be seen by the other.

Obviously there is something I am not doing right but i don't know what it is. Any help would be great!

Instantiate Code:

var Player : Transform;

function OnNetworkLoadedLevel ()
{
    // Instantiating Player when Network is loaded
    Network.Instantiate(Player, transform.position, transform.rotation, 0);
}

function OnPlayerDisconnected (player : NetworkPlayer) 
{
    // Removing player if Network is disconnected
    Debug.Log("Server destroying player");
    Network.RemoveRPCs(player, 0);
    Network.DestroyPlayerObjects(player);  

}    
more ▼

asked Mar 13 '12 at 12:15 AM

Jigsaw_clr gravatar image

Jigsaw_clr
1 1 1 2

This is a simple logic error. I can't really see what it is without seeing the code. Can you edit your question to include a snippet of code including the part where your player prefabs get instantiated?

Mar 13 '12 at 12:39 AM syclamoth

I can. The only issue there is the instantiate script matches a script that does work. So i'm thinking that it has to do with my prefab of the plane itself.

Mar 13 '12 at 04:52 AM Jigsaw_clr

Well, if you are using Network.Instantiate, but calling it once per client, that is one possible cause of the problem. Like I said, it's a simple logic error, but I can't really know which logic error it is without seeing the code.

Mar 13 '12 at 05:16 AM syclamoth

And I just realised that you have actually edited your post, but because the folks at QATO haven't solved this bug yet, I can't see the changes. Thankfully, for high-karma users there are workarounds for that...

Mar 13 '12 at 05:20 AM syclamoth

Can't edit for some reason so here.

Instantiate Code:

var Player : Transform;

function OnNetworkLoadedLevel ()
{
    // Instantiating Player when Network is loaded
    Network.Instantiate(Player, transform.position, transform.rotation, 0);
}

function OnPlayerDisconnected (player : NetworkPlayer) 
{
    // Removing player if Network is disconnected
    Debug.Log("Server destroying player");
    Network.RemoveRPCs(player, 0);
    Network.DestroyPlayerObjects(player);  

}    
Mar 13 '12 at 05:21 AM Jigsaw_clr
(comments are locked)
10|3000 characters needed characters left

2 answers: sort voted first

Try wrapping the 'Network.Instantiate' line in an if-statement that checks to make sure that only the owner can instantiate the object:

if(networkView.isMine)
{
    // instantiate things here
}

Network.Instantiate gets automatically called on all clients, complete with viewID management and buffering. If you want to handle buffering and networkViewID management yourself, you shouldn't use Network.Instantiate.

more ▼

answered Mar 13 '12 at 05:19 AM

syclamoth gravatar image

syclamoth
18k 8 19 93

Ok awesome, I appreciate the insight, I'll try that. Would there be a reason that this {my version] would work somewhere else though? Because As I said it does work in another example gotten here http://www.unity3dmax.comxa.com/networking.html

Mar 13 '12 at 05:47 AM Jigsaw_clr

Yes, it would work in the example where there is only ever one object calling that code. I suspect that you have that script on a network-synchronised object, and so the code is being called more than once.

Mar 13 '12 at 05:54 AM syclamoth

Ah i see. So if i instantiate in the way you describe then the NetworkView will bring the object into sync with the others?

Mar 13 '12 at 06:11 AM Jigsaw_clr

Yes, Network.instantiate does that automatically.

Mar 13 '12 at 06:26 AM syclamoth

I got it. Mis-read the last part. thought you meant to just instantiate it within that if statement not Network.instantiate. I took your advise and a little of my own and came up with the next answer.

Mar 13 '12 at 11:28 AM Jigsaw_clr
(comments are locked)
10|3000 characters needed characters left

I took syclamoths idea and part of the FPC Controller Motor script and moved them into my movement script.

Using:

var canControl:boolean;

function Update()
{
       if(!canControl)
    {

    }
    else
    {
          //All movement code
        }
}
function OnNetworkInstantiate (msg : NetworkMessageInfo) 
{
    if(networkView.isMine ==true)
    {

       FindParent.target = transform;
       canControl = true;
    }
    else
    {
       canControl = false;

       name += "Remote";
    }
}

This also requires that you the find parent script found in this package (http://www.unity3dmax.comxa.com/networking.html). As well as the networkcam.js in the same package.

Thanks again syclamoth!!

more ▼

answered Mar 13 '12 at 11:42 AM

Jigsaw_clr gravatar image

Jigsaw_clr
1 1 1 2

(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:

x3387
x2485
x1816
x1178
x111

asked: Mar 13 '12 at 12:15 AM

Seen: 1274 times

Last Updated: Mar 13 '12 at 11:42 AM