- Home /
UNET Clients spawn Childs on Player & Client Sync problems.
I'm having a lot of problems getting my game's multiplayer to work properly. (Using Unity 5.3.5f1)
What I have:
-player prefab consisting of an empty player GO running all the scripts and a GO with a mesh attached.
-prefab x (registered in Network manager and with a network identity and network transform components and without any scripts).
The movement of the player and the rotation of the mesh are both correctly controlled for both the server and all clients by a script ran by the player GO. I have a different script handling the x prefabs of the player. As soon as the game starts it should spawn all the x prefabs in the different locations predefined in a list of origins (a custom constructor holding vector3 position and vector3 eulerAngles) as childs of the mesh GO. This all works for the first client (the host). But for every client that joins afterwards the x prefabs no longer spawn and the x prefabs of the host Do display, but their movement seems to stutter quite a lot. (also if I run the client in the game window I can see in the hierachy that the x prefabs of the host are not childs of anything, unlike they are on the host, which I'm guessing is the main reason for the stutter) the console gives no warnings or errors.
My start code:
public override void OnStartLocalPlayer()
{
mesh = transform.FindChild("Model"); //finds the child mesh, used to get the origins of x and later to set as parent
CreateXPositions(); //creates the list of origins
Cmd_SpawnX(); // spawns the x prefabs
mesh.GetComponent<MeshRenderer>().material.color = Color.blue; //added this to test if the player was detected as local player and it was...
}
My Update code:
void Update()
{
if (!isLocalPlayer)
return;
}
My spawn code:
[Command]
void Cmd_SpawnX()
{
float scaleRatioX = mesh.localScale.x / mesh.parent.localScale.x;
float scaleRatioY = mesh.localScale.y / mesh.parent.localScale.y;
float scaleRatioZ = mesh.localScale.z / mesh.parent.localScale.z;
foreach (Origin origin in origins)
{
origin.position.x = origin.position.x * scaleRatioX;
origin.position.y = origin.position.y * scaleRatioY;
origin.position.z = origin.position.z * scaleRatioZ;
newXPos = mesh.position + mesh.rotation * origin.position;
newXAngles = Quaternion.Euler(OffsetVectors(mesh.eulerAngles, origin.eulerAngles));
GameObject x = Instantiate(xPrefab, newXPos, newXAngles) as GameObject;
x.transform.parent = mesh;
NetworkServer.SpawnWithClientAuthority(x, gameObject);
}
}
And the Class is inheritting from NetworkBehaviour.
All help would be greatly appriciated. If I forgot a part of my script (I have a function that changes the position of the x prefabs based on the parent location) that you think might cause a problem, please do ask and I'll post it as well.
Your answer
Follow this Question
Related Questions
Unity networking tutorial? 6 Answers
Changing rooms and spawning players with Multiplayer Example 2 Answers
Setting a Transform or GameObject SyncVar from a Command 0 Answers
Material Data over Network (Multiplayer) 0 Answers
SyncVar issue 0 Answers