- Home /
Problems with spawning items that the players can pick up - Unet
So this is what I am trying to implement in my multiplayer game using unet: Items spawn around the map and players press 'F' to pick them up, but I am getting many problems to do with the networking. First, I had an implementation but it only made changes to the current client and so if a object was picked up then the item would still be there for the other clients. I realized my problem so I tried using ServerManager.Spawn. As the object had to be in the spawnable prefabs in the network manager I created a new prefab which would contain the item and the rigidbody and the actual model of the item with the collider would be the child as the model is used elsewhere. But, for some reason on the client that is not the host the prefab that is registered under spawnable is getting spawned but no the model. I suspect this is to do with my use of Instantiate but I am not sure what to do as I am planning to add many more tiems and I don't want a long list of spawnable prefabs in my network manager. If it is the only way I am willing to do so though. My code:
Item.GetItem(int) - gets the item at the specified id Item.gfx.model - contains the gameobject for the item model
The code for the spawner:
[SerializeField]
int[] spawns;
Item item;
[SerializeField]
GameObject droppedItem;
GameObject drop;
GameObject model;
// Use this for initialization
public override void OnStartServer () {
item = Items.GetItem(spawns[Random.Range(0, spawns.Length)]);
drop = Instantiate(droppedItem,transform.position, Quaternion.identity);
drop.GetComponent<DroppedItem>().item = item;
model = Instantiate(item.gfx.model, transform.position, item.gfx.model.transform.rotation, drop.transform);
model.GetComponent<MeshCollider>().enabled = true;
model.tag = "DroppedItem";
drop.GetComponent<DroppedItem>().Init();
NetworkServer.Spawn(drop);
//NetworkServer.Spawn(model);
}
The small init code for the item:
public Item item;
bool initialized = false;
public void Init () {
if (initialized) return;
item.InitForSpawn();
initialized = true;
}