I am trying to understand UNET and developing a very simple card game, just to see if it works.
I just realized that when i start the host in the editor (local) all works fine. However, when i generate a client and start that as a host none of the players sprite is showed on the remote. The actual player works so i can click on objects etc.
I have removed all scripts from the player and somewhat isolated the “problem” to the NetworkManager script, see below. I cannot identify where the problem is and really need help.
Summary: Players sprites are only displayed on the host, when the host is in the editor.
Here is the script:
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class MsgTypes
{
public const short PlayerPrefab = MsgType.Highest + 1;
public class PlayerPrefabMsg : MessageBase
{
public short controllerID;
public short prefabIndex;
}
}
public class MyNetworkManager : NetworkManager {
private int colorNumber;
// in the Network Manager component, you must put your player prefabs
// in the Spawn Info -> Registered Spawnable Prefabs section
public short playerPrefabIndex;
public UNET_SyncListEngine _syncEngine;
private GameObject go;
public override void OnStartServer()
{
NetworkServer.RegisterHandler(MsgTypes.PlayerPrefab, OnResponsePrefab);
base.OnStartServer();
}
public override void OnClientConnect(NetworkConnection conn)
{
client.RegisterHandler(MsgTypes.PlayerPrefab, OnRequestPrefab);
base.OnClientConnect(conn);
// Register the cards
foreach (string aSTR in MP_CardsAndConversions.frontFullCardDeck) {
go = Resources.Load (aSTR) as GameObject;
ClientScene.RegisterPrefab (go);
}
go = Resources.Load ("_BackSide") as GameObject;
ClientScene.RegisterPrefab (go);
go = Resources.Load ("_cardBackRed") as GameObject;
ClientScene.RegisterPrefab (go);
go = Resources.Load ("_cardBackBlue") as GameObject;
ClientScene.RegisterPrefab (go);
go = Resources.Load ("_cardBackGreen") as GameObject;
ClientScene.RegisterPrefab (go);
go = Resources.Load ("_cardBackYellow") as GameObject;
ClientScene.RegisterPrefab (go);
}
private void OnRequestPrefab(NetworkMessage netMsg)
{
MsgTypes.PlayerPrefabMsg msg = new MsgTypes.PlayerPrefabMsg();
msg.controllerID = netMsg.ReadMessage<MsgTypes.PlayerPrefabMsg>().controllerID;
msg.prefabIndex = playerPrefabIndex;
client.Send(MsgTypes.PlayerPrefab, msg);
// Set wallet button on or off
//
string checkString = PlayerPrefs.GetString("setup_tgl_UseCoinsInNetworkMultiplayerGame");
if (checkString == "")
checkString = "FALSE";
}
private void OnResponsePrefab(NetworkMessage netMsg)
{
MsgTypes.PlayerPrefabMsg msg = netMsg.ReadMessage<MsgTypes.PlayerPrefabMsg>();
playerPrefab = spawnPrefabs[msg.prefabIndex];
base.OnServerAddPlayer(netMsg.conn, msg.controllerID);
}
public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
{
MsgTypes.PlayerPrefabMsg msg = new MsgTypes.PlayerPrefabMsg();
msg.controllerID = playerControllerId;
NetworkServer.SendToClient(conn.connectionId, MsgTypes.PlayerPrefab, msg);
}
}