- Home /
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);
}
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?
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.
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.
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...
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);
}
Answer by syclamoth · Mar 13, 2012 at 05:19 AM
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.
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
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.
Ah i see. So if i instantiate in the way you describe then the NetworkView will bring the object into sync with the others?
I got it. $$anonymous$$is-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.
Answer by Jigsaw_clr · Mar 13, 2012 at 11:42 AM
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!!