コード例 #1
0
        void RemovePlayer(NetworkConnection conn, UnityEngine.Networking.PlayerController controller)
        {
            var playerConnection = new PlayerConnection {
                ConnectionID       = conn.connectionId,
                PlayerControllerID = controller.playerControllerId
            };

            if (PlayerMap.ContainsKey(playerConnection))
            {
                var player = PlayerMap[playerConnection];
                player.Type      = PlayerType.None;
                player.Selection = new PlayerSelection();
                PlayerMap.Remove(playerConnection);
            }
            playerCount = Mathf.Max(0, playerCount - 1);
        }
コード例 #2
0
        void AddPlayer(NetworkConnection conn, short playerControllerId, PlayerSelection selection)
        {
            if (playerControllerId < conn.playerControllers.Count &&
                conn.playerControllers[playerControllerId].IsValid &&
                conn.playerControllers[playerControllerId].gameObject != null)
            {
                Log.Error("There is already a player at that playerControllerId for this connections.");
                return;
            }

            var  startPosition = GetStartPosition();
            var  character     = selection.Character;
            bool random        = character == null;

            Analytics.CustomEvent("characterSelected", new Dictionary <string, object> {
                { "character", character != null ? character.name : "Random" },
                { "color", selection.Pallete },
            });
            if (random)
            {
                Log.Info("No character was specfied, randomly selecting character and pallete...");
                selection.Character = DataManager.Characters.Random();
                selection.Pallete   = Mathf.FloorToInt(Random.value * selection.Character.PalleteCount);
            }
            var sameCharacterSelections = new HashSet <PlayerSelection>(PlayerManager.MatchPlayers.Select(p => p.Selection));

            if (sameCharacterSelections.Contains(selection))
            {
                bool success = false;
                for (var i = 0; i < selection.Character.PalleteCount; i++)
                {
                    selection.Pallete = i;
                    if (!sameCharacterSelections.Contains(selection))
                    {
                        success = true;
                        break;
                    }
                }
                if (!success)
                {
                    Log.Error("Two players made the same selection, and no remaining palletes remain. {0} doesn't have enough colors".With(selection.Character));
                    ClientScene.RemovePlayer(playerControllerId);
                    return;
                }
            }

            selection.Character.Prefab.LoadAsync().Then(prefab => {
                if (prefab == null)
                {
                    Log.Error("The character {0} does not have a prefab. Please add a prefab object to it.", selection.Character);
                    return;
                }

                if (prefab.GetComponent <NetworkIdentity>() == null)
                {
                    Log.Error(
                        "The character prefab for {0} does not have a NetworkIdentity. Please add a NetworkIdentity to it's prefab.",
                        selection.Character);
                    return;
                }

                GameObject playerObj;
                if (startPosition != null)
                {
                    playerObj = Instantiate(prefab, startPosition.position, startPosition.rotation);
                }
                else
                {
                    playerObj = Instantiate(prefab, Vector3.zero, Quaternion.identity);
                }
                var player     = PlayerManager.MatchPlayers.Get(playerCount);
                playerObj.name = "Player {0} ({1},{2})".With(playerCount + 1, selection.Character.name, selection.Pallete);
                NetworkServer.AddPlayerForConnection(conn, playerObj, playerControllerId);
                var colorState = playerObj.GetComponentInChildren <ColorState>();
                if (colorState != null)
                {
                    colorState.Pallete = selection.Pallete;
                }
                player.Selection    = selection;
                player.Type         = PlayerType.HumanPlayer;
                player.PlayerObject = playerObj;
                playerCount++;
                NetworkServer.SendToAll(Messages.UpdatePlayer, UpdatePlayerMessage.FromPlayer(player));
                var playerConnection = new PlayerConnection {
                    ConnectionID       = conn.connectionId,
                    PlayerControllerID = playerControllerId
                };
                PlayerMap[playerConnection] = player;
                playerObj.GetComponentsInChildren <IDataComponent <Player> >().SetData(player);
                //player.Changed += () => playerObj.GetComponentInChildren<IDataComponent<Player>>().SetData(player);
            });
        }