예제 #1
0
        private IEnumerator SpawnVehicle(PlayerInfo playerInfo)
        {
            var vehicleLogic = ScriptableObject.CreateInstance <MasterPlayerVehicleLogic>();

            var startPoint = GameObject.FindGameObjectWithTag("TeamAStartPoint").transform.position;

            var connection = playerInfo.clientConnection;

            if (!connection.ConnectionAlive())
            {
                connection.EstablishConnection();
                Debug.Log($"Reestablish Connection");
            }

            //Notify New Player to Spawn Other Player Vehicle
            for (int i = 0; i < VehicleList.Count; i++)
            {
                yield return(new WaitForSeconds(0.25f));

                connection.SendObject("GeneratePlayerVehicle", VehicleList[i]);

                Debug.Log($"{playerInfo.clientConnection}  Vehicle ID {VehicleList[i].VehicleID} PlayerID {VehicleList[i].OwnerPlayerID} {connection.ConnectionAlive()}");
            }

            //Generate Player Vehicle
            var vehicle = VehicleUtility.CreateVehicle("T-34", InstanceNetType.GameNetworkBotOffline, vehicleLogic);

            vehicle.transform.position = startPoint;

            var generateData = new GeneratePlayerVehicle(allocatedVehicleID, "T-34", playerInfo.PlayerID, vehicle);

            VehicleList.Add(generateData);

            allocatedVehicleID += 1;

            //Notify All Players To Spawn New Player Vehicle
            foreach (var player in PlayerList)
            {
                player.clientConnection.SendObject("GeneratePlayerVehicle", generateData);
            }
        }
예제 #2
0
        public void Initialize(string ipAdress = "127.0.0.1", int ipPort = 6576)
        {
            NetManager.ConnectToMaster(ipAdress, ipPort, new ClientListenEvents()
            {
                onRecPlayerInfo = (header, connection, playerInfo) =>
                {
                    currentPlayerInfo = playerInfo;

                    Debug.Log($"Sync Player Info  ID: {currentPlayerInfo.PlayerID}");
                },
                onRecGeneratePlayerVehicle = (header, connection, generatePlayerVehicle) =>
                {
                    mainThreadTasks.Enqueue(() =>
                    {
                        var isLocalPlayer = currentPlayerInfo.PlayerID == generatePlayerVehicle.OwnerPlayerID;

                        var netType    = isLocalPlayer ? InstanceNetType.GameNetWorkOffline : InstanceNetType.GameNetworkBotOffline;
                        var thinkLogic = isLocalPlayer ? null : ScriptableObject.CreateInstance <ClientOtherPlayerVehicleLogic>();

                        var vehicle = VehicleUtility.CreateVehicle(generatePlayerVehicle.VehicleName, netType, thinkLogic);

                        generatePlayerVehicle.tankInitSystem = vehicle;

                        var vehicleStatus = new VehicleStatus()
                        {
                            isLocalPlayer  = isLocalPlayer,
                            OwnerPlayerID  = generatePlayerVehicle.OwnerPlayerID,
                            VehicleID      = generatePlayerVehicle.VehicleID,
                            tankInitSystem = vehicle,
                            syncVehicle    = new SyncVehicle(generatePlayerVehicle.VehicleID, new ProtobufVector3(0, 0, 0), new ProtobufVector3(0, 0, 0), new ProtobufQuaternion(0, 0, 0, 1), new ProtobufVector3(0, 0, 0))
                        };

                        if (isLocalPlayer)
                        {
                            currentPlayerVehicleStatus = vehicleStatus;
                        }

                        vehicleStatusList.Add(vehicleStatus);

                        Debug.Log($"isLocalPlayer : {isLocalPlayer} VehicleID {generatePlayerVehicle.VehicleID}");
                    });
                }
                ,
                onRecSyncVehicle = (header, connection, syncVehicle) =>
                {
                    var toSyncVehicleStatus = vehicleStatusList.Find(val => val.VehicleID == syncVehicle.VehicleID);

                    if (toSyncVehicleStatus != null)
                    {
                        toSyncVehicleStatus.syncVehicle = syncVehicle;
                    }
                },
                onRecDestoryPlayerVehicle = (header, connection, destroyInfo) =>
                {
                    //TODO: Something wrong
                    var vehicle = vehicleStatusList.Find(val => val.VehicleID == destroyInfo.VehicleID);

                    if (vehicle != null)
                    {
                        mainThreadTasks.Enqueue(() =>
                        {
                            VehicleUtility.RemoveVehicle(vehicle.tankInitSystem);

                            Debug.Log($"Remove Player {destroyInfo.VehicleID}");
                        });

                        vehicleStatusList.Remove(vehicle);
                    }
                }
            });

            StartCoroutine(SyncInputToMaster());
        }