- Home /
What can prevent a prefab network instantiation?
Hello everybody,
I am struggling with a quite unusual issue with Network.instantiate.
In short, it seems a Network.instantiate of a specific prefab keeps views of other prefabs from instantiating through the network on the owner of the "blocking" prefab.
My project has a small lobby/room management system that also handles map and slot selection.
I'll try to give you a clear overview of the thing:
ClientServerApp.cs:
//method called server side on launch of the module.
private void launcher()
{
if(Network.connections.Length + 1 < SceneProperties.networkModule.spots.Count)
{
SendMessage("addMessage","Not enough players in lobby yet");
return;
}
if(_occupiedSlots.Count < SceneProperties.networkModule.spots.Count)
{
SendMessage("addMessage","Not all players are ready");
return;
}
SceneProperties.isServer = Network.isServer;
networkView.RPC("launchLevel",RPCMode.AllBuffered);
}
This part is for when the host clicks "start module", a RPC call is sent to all ClientServerApp.cs, causing the selected level to load additively on every client
[RPC]
private void launchLevel()
{
SendMessage("levelStarted");
SceneProperties.spot = SceneProperties.networkModule.spots[_occupiedSlots[Network.player]];
Network.SetLevelPrefix(1);
Application.LoadLevelAdditive(SceneProperties.networkScene);
}
The actual RPC method, everything going smoothly so far
Now, at this point, a gameObject with a networkView observing a script called LevelManager.cs is loaded, it is within the actual level scene. The important bits:
void Start()
{
if(LevelManager.Instance != null && LevelManager.Instance != this)
{
DestroyImmediate(gameObject);
}
LevelManager.Instance = this;
this._onAllClientsLoaded = new AllClientsLoadedDelegate(this.instantiate);
ClientServerApp.Instance.AllClientsLoadedEvent += this._onAllClientsLoaded;
DontDestroyOnLoad(this.gameObject);
this.onNodeReadyEvent = new nodeReadyDelegate(this.nodeReadyHandler);
ClientServerApp.Instance.setReady();
}
What this does is basicaly subscribing to some events to coordinates to scene/networkNodes loads. But more importantly, it signifies the ClientServerApp that it was loaded.
The following methods are from ClientServerApp.cs, directly following up the previous: public void setReady() { this.networkView.RPC("setReadyRPC",RPCMode.AllBuffered); }
[RPC]
private void setReadyRPC(NetworkMessageInfo info)
{
if(++this._clientsReady==this.userNb)
{
AllClientsLoadedEvent();
}
}
What this does is if all the clients (or Level Managers) have loaded, the ClientServerApp fires an event on all client saying the level is loaded on every client
...event that is listened to by LevelManager.cs, and the callBack is:
void instantiate()
{
GameObject newnode = Network.Instantiate(Resources.Load(SceneProperties.spot.engin+"_networkNode"),SceneProperties.spot.beginPoint.position,SceneProperties.spot.beginPoint.rotation,0) as GameObject;
setSpecifics(newnode);
}
Aaaaand it doesn't work at this point. I can instantiate 2 types of prefabs with that last "instantiate()" method, one of them blocks further instantiation from other prefabs views on its owner's side.
Sorry if I'm abusing your time with such a long post, but I'm growing quite desperate with this, I'm stuck for about 4 days now....
please halp.
Your answer
Follow this Question
Related Questions
How to fix OnObjSpawn netId: 1 has invalid asset Id when using Lobby example in existing project 0 Answers
Network instantiate command do not execute in all client.. 1 Answer
Instantiating a prefab that needs a public reference to another prefab 3 Answers