I need each player to have a different skin (one of 10 prefabs) when entering a room, like in among us. If a player takes a skin, then the next players who enter the room will not be able to take this skin. Below is my code from MenuManager.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
using Photon.Realtime;
using ExitGames.Client.Photon; // Использование правильного пространства имен
public class MenuManager : MonoBehaviourPunCallbacks
{
public InputField createInput;
public InputField joinInput;
public void CreateRoom()
{
RoomOptions roomOptions = new RoomOptions();
roomOptions.MaxPlayers = 10;
int[] occupiedPrefabs = new int[10];
roomOptions.CustomRoomProperties = new ExitGames.Client.Photon.Hashtable() { { "occupiedPrefabs", occupiedPrefabs } };
roomOptions.CustomRoomPropertiesForLobby = new string[] { "occupiedPrefabs" };
PhotonNetwork.CreateRoom(createInput.text, roomOptions, TypedLobby.Default);
}
public void JoinRoom()
{
PhotonNetwork.JoinRoom(joinInput.text);
}
public override void OnJoinedRoom()
{
PhotonNetwork.LoadLevel("Game");
AssignUniquePrefab();
}
void AssignUniquePrefab()
{
if (PhotonNetwork.CurrentRoom.CustomProperties.TryGetValue("occupiedPrefabs", out object occupiedPrefabsObject))
{
int[] occupiedPrefabs = (int[])occupiedPrefabsObject;
int prefabIndex = -1;
// Находим первый свободный префаб
for (int i = 0; i < occupiedPrefabs.Length; i++)
{
if (occupiedPrefabs[i] == 0)
{
prefabIndex = i;
occupiedPrefabs[i] = 1;
break;
}
}
// Обновляем свойства комнаты
PhotonNetwork.CurrentRoom.SetCustomProperties(new ExitGames.Client.Photon.Hashtable() { { "occupiedPrefabs", occupiedPrefabs } });
if (prefabIndex != -1)
{
// Сохраняем индекс префаба в свойства игрока
PhotonNetwork.LocalPlayer.SetCustomProperties(new ExitGames.Client.Photon.Hashtable() { { "prefabIndex", prefabIndex } });
// Загружаем префаб игрока
string prefabName = prefabIndex == 0 ? "Player" : "Player" + (prefabIndex + 1);
Vector3 spawnPosition = GetRandomSpawnPosition(); // Ваша логика определения позиции спавна
PhotonNetwork.Instantiate(prefabName, spawnPosition, Quaternion.identity);
}
else
{
Debug.LogError("Нет доступных префабов!");
}
}
else
{
Debug.LogError("Свойства комнаты не содержат 'occupiedPrefabs'.");
}
}
public override void OnPlayerLeftRoom(Player otherPlayer)
{
base.OnPlayerLeftRoom(otherPlayer);
if (PhotonNetwork.CurrentRoom.CustomProperties.TryGetValue("occupiedPrefabs", out object occupiedPrefabsObject))
{
int[] occupiedPrefabs = (int[])occupiedPrefabsObject;
// Найдите префаб, который использовал этот игрок, и освободите его
int prefabIndex = GetPlayerPrefabIndex(otherPlayer); // Ваша логика определения префаба игрока
if (prefabIndex != -1)
{
occupiedPrefabs[prefabIndex] = 0;
PhotonNetwork.CurrentRoom.SetCustomProperties(new ExitGames.Client.Photon.Hashtable() { { "occupiedPrefabs", occupiedPrefabs } });
}
}
}
// Пример логики для определения индекса префаба игрока
int GetPlayerPrefabIndex(Player player)
{
// Здесь вы можете реализовать свою логику для определения префаба игрока
// Например, сохранить индекс префаба в CustomProperties игрока
if (player.CustomProperties.TryGetValue("prefabIndex", out object prefabIndexObject))
{
return (int)prefabIndexObject;
}
return -1;
}
Vector3 GetRandomSpawnPosition()
{
// Ваша логика определения позиции спавна
return new Vector3(Random.Range(-5f, 5f), Random.Range(-5f, 5f), 0f);
}
}