Syncing Gameobject variables
I've been trying all night to make this work:
I'm making a game where the player can build a ship using a set of prefabs. The Player() class takes GameObject values from the script attached to the UI and uses them to build the ship. However, this means that all players on each client end up with the same ship, since they're referencing the same script. For the life of me, I can't figure out a way to synchronize my component prefabs to the remote client. I've tried setting the variable through an RPC call, a Command, saving them to a SyncVar'd struct, etc. Does anyone know how to do this?
Here's a condensed version of the relevant code:
void Awake()
{
y = 0;
componentsToDisable = new Behaviour[3];
shipBuild = GameObject.Find("MenuManager").GetComponent<ShipBuilder>();
hull = shipBuild.hull;
engine = shipBuild.engine;
weapon = shipBuild.weapon;
power = shipBuild.power;
CreateShip();
}
public void CreateShip()
{
ship = (GameObject)Instantiate(hull, transform.position, hull.transform.rotation);
Network.Instantiate(ship, transform.position, transform.rotation, 0);
ship.transform.SetParent(transform);
ship.transform.localPosition = new Vector3(0, 0, 0);
ship.transform.localEulerAngles = Vector3.zero;
foreach (Transform slot in ship.transform)
{
if (slot.tag == "WeaponSlot")
{
GameObject gun = (GameObject)Instantiate(weapon, slot.position, slot.rotation);
gun.transform.SetParent(slot);
gun.transform.localPosition = Vector3.zero;
}
if (slot.tag == "EngineSlot")
{
GameObject eng = (GameObject)Instantiate(engine, slot.position, slot.rotation);
eng.transform.SetParent(slot);
eng.transform.localPosition = new Vector3(0, 0, 0);
}
if (slot.tag == "PowerSlot")
{
GameObject pow = (GameObject)Instantiate(power, slot.position, slot.rotation);
pow.transform.SetParent(slot);
pow.transform.localPosition = new Vector3(0, 0, 0);
}
}
ship.GetComponent<BaseShip>().enabled = true;
ship.transform.localPosition = new Vector3(0, 0, 0);
ship.transform.rotation = Quaternion.Euler(Vector3.zero);
Network.Instantiate(ship, transform.position, transform.rotation, 0);
}
Network.Instantiate() doesn't seem to work either. I tried this out of desperation:
[ClientRpc]
void RpcShipFix ()
{
hull = shipBuild.hull;
engine = shipBuild.engine;
weapon = shipBuild.weapon;
power = shipBuild.power;
}
If I could just SyncVar the GameObjects, that'd be great. But I can't. Please help me. If it turns out to be something simple I've overlooked, I won't even care at this point.
Your answer
![](https://koobas.hobune.stream/wayback/20220612093834im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
how to split player objects over network? 0 Answers
[UNET] Syncing the position of a non-player object such as a trap (no player authority whatsoever) 3 Answers
uNet Network Sync Problem With Non-Player Object 0 Answers
Networking not working when upgrade project from 5.6 to 2017 or 2018. 0 Answers
Error when using NetworkList "Don't know how to serialize List`1 " 0 Answers