2015-05-26 8 views
0

У меня есть два места появления, где игрок появится при подключении.Как утверждать, что икра «заполнена»?

Мне нужно, чтобы, когда один из игроков подключается к одному из пятен, любой другой игрок всегда будет появляться на другом месте.

Вот некоторые визуальные в случае это помогает: https://goo.gl/Y0ohZC

Спасибо заранее, IC

ответ

1

Вы можете добавить эти два возможных икру пятна как пустые игровые объекты. Тогда я бы сделал логический массив и установил его состояния в true или false в зависимости от того, занято ли место. Пятна не сохраняются непосредственно в этом массиве, поэтому вы должны создать другой массив. В C# это будет выглядеть приблизительно так:

public GameObject[] Spots = new GameObject[2]; //Drag the spots in here (In the editor) 
bool[] OccupiedSpawnSpots = new bool[2]; 
int mySpotNumber = -1; 

void Start() { 
    PhotonNetwork.ConnectUsingSettings ("v1.0.0"); 
} 

void OnGUI() { 
    GUILayout.Label (PhotonNetwork.connectionStateDetailed.ToString()); 
} 

void OnJoinedLobby() 
{ 
    Debug.Log ("Joined the lobby"); 
    PhotonNetwork.JoinRandomRoom(); 
} 

void OnPhotonRandomJoinFailed() 
{ 
    Debug.Log ("No room found. Creating a new one..."); 
    PhotonNetwork.CreateRoom (null); 
} 

void OnPhotonPlayerConnected(PhotonPlayer player) 
{ 
    //If we are the MasterClient, send the list to the connected player 
    if (PhotonNetwork.isMasterClient) 
     GetComponent<PhotonView>().RPC("RPC_SendList", player, OccupiedSpawnSpots); 
} 

void OnApplicationQuit() 
{ 
    //If I am outside and others want to connect, my spot shouldn't be still set as occupied: 
    //I mean if the application quits I'm of course going to be disconnected. 
    //You have to do this in every possibility of getting disconnected or leaving the room 
    OccupiedSpawnSpots[mySpotNumber] = false; 
    //Send the changed List to the others 
    GetComponent<PhotonView>().RPC("RPC_UpdateList", PhotonTargets.All, OccupiedSpawnSpots); 
} 

[RPC] 
void RPC_SendList(bool[] ListOfMasterClient) 
{ 
    OccupiedSpawnSpots = ListOfMasterClient; 

    //Get the free one 
    if (OccupiedSpawnSpots[0] == false) 
    { 
     //Spawn your player at 0 
     SpawnMyPlayer(0); 
     //Set it to occupied 
     OccupiedSpawnSpots[0] = true; 
    } 
    else //so the other must be free 
    { 
     //Spawn your player at 1 
     SpawnMyPlayer(1); 
     //Set it to occupied 
     OccupiedSpawnSpots[1] = true; 
    } 

    //Send the changed List to the others 
    GetComponent<PhotonView>().RPC("RPC_UpdateList", PhotonTargets.All, OccupiedSpawnSpots); 
} 

[RPC] 
void RPC_UpdateList(bool[] RecentList) 
{ 
    OccupiedSpawnSpots = RecentList; 
} 

void SpawnMyPlayer(int SpotNumber) { 
    // Check if spawnspots are set OK 
    if (Spots == null) { 
     Debug.LogError ("SpawnSpots aren't assigned!"); 
     return; 
    } 

    mySpotNumber = SpotNumber; 

    // The player object for the network 
    GameObject myPlayerGO = (GameObject)PhotonNetwork.Instantiate ("PlayerController", 
                    Spots[SpotNumber].transform.position, 
                    Spots[SpotNumber].transform.rotation, 0); 

    // Enable a disabled script for *this player only, or all would have the same camera, movement, etc 
    //((MonoBehaviour)myPlayerGO.GetComponent("FPSInputController")).enabled = true; 

    // Set a camera just for this player 
    //myPlayerGO.transform.FindChild ("Main Camera").gameObject.SetActive (true); 

    //standbyCamera.SetActive(false); 
} 

Примечание: Если у вас есть более двух игроков, это становится намного сложнее. Этот код не оптимизирован, поэтому, возможно, вы найдете лучший, но он должен дать вам правильную идею.

Пожалуйста, спросите, не ясно ли вам что ...

+0

Эй, спасибо за ваш ответ. Да, я нахожусь на Фотоне. Я попытался вытащить его на основе вашего скрипта, но не смог это сделать. Можете ли вы попробовать помочь мне, основываясь на моем текущем скрипте NetworkManager, пожалуйста? Должно быть проще (может быть)? Вот он: http://pastebin.com/cXJWEBFk –

+0

_Посмотреть мой отредактированный ответ_ – TTF

Смежные вопросы