- Home /
Is this the right setup for a multiplayer game?
I took some tutorials and put together a deathmatch car game. In the editor I have every object I want to spawn as a prefab and put some objects directly on the scene. I put a Network View on all of my prefabs and objects.
From what I understand Unity now synchronizes these objects automatically in a network game. Is this correct?
I instantiate all my spawning Elements with Network.Instantiate like this:
instantiatedBullet = (GameObject)Network.Instantiate(Resources.Load("Bullet"), muzzleTransform.position, muzzleTransform.rotation * bulletRotation, 0);
Now, the problem is that all objects spawn correctly and are seen in the game except the main player (= car). I think it has to do with assigning a correct NetworkViewID to my player object. This is my network code taken from some tutorial.
#pragma strict
var gameName : String = "DM Car Project X";
private var refreshing:boolean;
private var hostData:HostData[];
private var btnX:float;
private var btnY:float;
private var btnW:float;
private var btnH:float;
private var playerPrefab:GameObject;
var spawnPoint:GameObject;
function Start () {
btnX = Screen.width * 0.05;
btnY = Screen.width * 0.05;
btnW = Screen.width * 0.2;
btnH = Screen.width * 0.1;
}
function Update () {
if(refreshing) {
if(MasterServer.PollHostList().Length>0) {
refreshing = false;
Debug.Log("HostList: "+MasterServer.PollHostList().Length);
hostData = MasterServer.PollHostList();
}
}
}
function OnGUI () {
if(!Network.isClient && !Network.isServer) {
if(GUI.Button(Rect(btnX, btnY, btnW, btnH), "Start server!")) {
Debug.Log("Starting Server...");
startServer();
}
if(GUI.Button(Rect(btnX, btnY * 1.2 + btnH, btnW, btnH), "Refresh Hosts")) {
Debug.Log("Refreshing Hosts...");
refreshHostList();
}
if(hostData) {
for(var i:int = 0; i < hostData.length; i++) {
if(GUI.Button(Rect(btnX * 1.5 + btnW, btnY * 1.2 + (btnH*i), btnW*3, btnH), hostData[i].gameName )) {
Network.Connect(hostData[i]);
}
}
}
}
}
function startServer() {
Network.InitializeServer(4,25001, !Network.HavePublicAddress);
MasterServer.RegisterHost(gameName, "Car Test Game", "Test game project X... ;)");
}
function refreshHostList () {
MasterServer.RequestHostList(gameName);
refreshing = true;
}
function spawnPlayer() {
var car : GameObject = Network.Instantiate(Resources.Load("Car"), spawnPoint.transform.position, Quaternion.identity, 0);
car.active = true;
Debug.Log("gespawnt!");
}
function OnServerInitialized() {
Debug.Log("Server initialised!");
spawnPlayer();
}
function OnMasterServerEvent(mse:MasterServerEvent) {
if(mse == MasterServerEvent.RegistrationSucceeded) {
Debug.Log("Server registered!");
}
}
function OnConnectedToServer() {
spawnPlayer();
}
I cannot seem to get the logic of assigning the right network views. If I Network.Instantiate, do I need a Network View on the object? Do I create a global array for all my players and assign the NetworkViewID to this array?