예제 #1
0
        public void SQPClientServer_ServerInfoQuery_ServerInfoReceived()
        {
            var port     = 13337;
            var server   = new SQPServer(port);
            var endpoint = new IPEndPoint(IPAddress.Loopback, port);
            var client   = new SQPClient(endpoint);

            server.ServerInfoData.ServerName     = "Banana Boy Adventures";
            server.ServerInfoData.BuildId        = "2018-1";
            server.ServerInfoData.CurrentPlayers = 1;
            server.ServerInfoData.MaxPlayers     = 20;
            server.ServerInfoData.Port           = 1337;
            server.ServerInfoData.GameType       = "Capture the egg.";
            server.ServerInfoData.Map            = "Great escape to the see";

            client.StartInfoQuery();

            var iterations = 0;

            while (!(client.ClientState == SQPClient.SQPClientState.Success ||
                     client.ClientState == SQPClient.SQPClientState.Failure) &&
                   iterations++ < 1000)
            {
                server.Update();
                client.Update();
            }
            Assert.Less(iterations, 1000);
            Assert.AreEqual(client.ClientState, SQPClient.SQPClientState.Success);
        }
예제 #2
0
        public void SQPClientServer_ServerInfoQuery_ServerInfoReceived()
        {
            var port     = 13337;
            var server   = new SQPServer(port);
            var endpoint = new IPEndPoint(IPAddress.Loopback, port);
            var client   = new SQPClient();

            var sid = server.ServerInfoData;

            sid.ServerName     = "Banana Boy Adventures";
            sid.BuildId        = "2018-1";
            sid.CurrentPlayers = 1;
            sid.MaxPlayers     = 20;
            sid.Port           = 1337;
            sid.GameType       = "Capture the egg.";
            sid.Map            = "Great escape to the see";

            server.ServerInfoData = sid;

            var handle = client.GetSQPQuery(endpoint);

            client.StartInfoQuery(handle);

            var iterations = 0;

            while (handle.m_State != SQPClient.SQPClientState.Idle && iterations++ < 1000)
            {
                server.Update();
                client.Update();
            }
            Assert.Less(iterations, 1000);

            Assert.AreEqual(handle.m_State, SQPClient.SQPClientState.Idle);
            Assert.AreEqual(handle.validResult, true);
            var sidRecieved = handle.m_ServerInfo.ServerInfoData;

            Assert.AreEqual(sidRecieved.BuildId, sid.BuildId);
            Assert.AreEqual(sidRecieved.CurrentPlayers, sid.CurrentPlayers);
            Assert.AreEqual(sidRecieved.GameType, sid.GameType);
            Assert.AreEqual(sidRecieved.Map, sid.Map);
            Assert.AreEqual(sidRecieved.MaxPlayers, sid.MaxPlayers);
            Assert.AreEqual(sidRecieved.Port, sid.Port);
            Assert.AreEqual(sidRecieved.ServerName, sid.ServerName);
        }
예제 #3
0
        private void Update()
        {
            // No need to do anything if local discovery or master server is not enabled
            if (!masterServerEnabled && !localDiscoveryEnabled)
            {
                return;
            }

            if (Time.time > nextListUpdateTime)
            {
                if (localDiscoveryEnabled)
                {
                    NetWorker.RefreshLocalUdpListings();
                }

                if (masterServerEnabled)
                {
                    RefreshMasterServerListings();
                }

                nextListUpdateTime = Time.time + 5.0f + UnityEngine.Random.Range(0.0f, 1.0f);
            }

            if (sqpClient != null)
            {
                sqpClient.Update();

                foreach (var server in serverList)
                {
                    UpdateItem(server);
                    if (Time.time > server.NextUpdate && server.SqpQuery.State == ClientState.Idle)
                    {
                        sqpClient.SendChallengeRequest(server.SqpQuery);
                        server.NextUpdate = Time.time + 5.0f + UnityEngine.Random.Range(0.0f, 1.0f);
                    }
                }
            }
        }
예제 #4
0
    public void Update()
    {
        if (!m_isHeadless)
        {
            RenderSettings.Update();
        }

        // TODO (petera) remove this hack once we know exactly when renderer is available...
        if (!pipeSetup)
        {
            var hdpipe = RenderPipelineManager.currentPipeline as HDRenderPipeline;
            if (hdpipe != null)
            {
//                hdpipe.DebugLayer2DCallback = DebugOverlay.Render;
//                hdpipe.DebugLayer3DCallback = DebugOverlay.Render3D;

                var layer = LayerMask.NameToLayer("PostProcess Volumes");
                if (layer == -1)
                {
                    GameDebug.LogWarning("Unable to find layer mask for camera fader");
                }
                else
                {
                    m_Exposure        = ScriptableObject.CreateInstance <AutoExposure>();
                    m_Exposure.active = false;
                    m_Exposure.enabled.Override(true);
                    m_Exposure.keyValue.Override(0);
                    m_ExposureVolume = PostProcessManager.instance.QuickVolume(layer, 100.0f, m_Exposure);
                }

                pipeSetup = true;
            }
        }
        if (m_ExposureReleaseCount > 0)
        {
            m_ExposureReleaseCount--;
            if (m_ExposureReleaseCount == 0)
            {
                BlackFade(false);
            }
        }

        // Verify if camera was somehow destroyed and pop it
        if (m_CameraStack.Count > 1 && m_CameraStack[m_CameraStack.Count - 1] == null)
        {
            PopCamera(null);
        }

#if UNITY_EDITOR
        // Ugly hack to force focus to game view when using scriptable renderloops.
        if (Time.frameCount < 4)
        {
            try
            {
                var gameViewType = typeof(UnityEditor.EditorWindow).Assembly.GetType("UnityEditor.GameView");
                var gameView     = (EditorWindow)Resources.FindObjectsOfTypeAll(gameViewType)[0];
                gameView.Focus();
            }
            catch (System.Exception) { /* too bad */ }
        }
#endif

        frameTime = (double)m_Clock.ElapsedTicks / m_StopwatchFrequency;

        // Switch game loop if needed
        if (m_RequestedGameLoopTypes.Count > 0)
        {
            // Multiple running gameloops only allowed in editor
#if !UNITY_EDITOR
            ShutdownGameLoops();
#endif
            bool initSucceeded = false;
            for (int i = 0; i < m_RequestedGameLoopTypes.Count; i++)
            {
                try
                {
                    IGameLoop gameLoop = (IGameLoop)System.Activator.CreateInstance(m_RequestedGameLoopTypes[i]);
                    initSucceeded = gameLoop.Init(m_RequestedGameLoopArguments[i]);
                    if (!initSucceeded)
                    {
                        break;
                    }

                    m_gameLoops.Add(gameLoop);
                }
                catch (System.Exception e)
                {
                    GameDebug.Log(string.Format("Game loop initialization threw exception : ({0})\n{1}", e.Message, e.StackTrace));
                }
            }


            if (!initSucceeded)
            {
                ShutdownGameLoops();

                GameDebug.Log("Game loop initialization failed ... reverting to boot loop");
            }

            m_RequestedGameLoopTypes.Clear();
            m_RequestedGameLoopArguments.Clear();
        }

        try
        {
            if (!m_ErrorState)
            {
                foreach (var gameLoop in m_gameLoops)
                {
                    gameLoop.Update();
                }
                levelManager.Update();
            }
        }
        catch (System.Exception e)
        {
            HandleGameloopException(e);
            throw;
        }

        if (m_SoundSystem != null)
        {
            m_SoundSystem.Update();
        }

        if (clientFrontend != null)
        {
            clientFrontend.UpdateGame();
        }

        Console.ConsoleUpdate();

        WindowFocusUpdate();

        UpdateCPUStats();

        sqpClient.Update();

        endUpdateEvent?.Invoke();
    }
예제 #5
0
    public void Update()
    {
        if (!m_isHeadless)
        {
            RenderSettings.Update();
        }

        // TODO (petera) remove this hack once we know exactly when renderer is available...
        if (!pipeSetup)
        {
            var hdpipe = RenderPipelineManager.currentPipeline as HDRenderPipeline;
            if (hdpipe != null)
            {
                var layer = LayerMask.NameToLayer("PostProcess Volumes");
                if (layer == -1)
                {
                    GameDebug.LogWarning("Unable to find layer mask for camera fader");
                }
                else
                {
                    var gameObject = new GameObject()
                    {
                        name      = "Game Quick Volume",
                        layer     = layer,
                        hideFlags = HideFlags.HideAndDontSave
                    };

                    m_ExposureVolume          = gameObject.AddComponent <Volume>();
                    m_ExposureVolume.priority = 100.0f;
                    m_ExposureVolume.isGlobal = true;
                    var profile = m_ExposureVolume.profile;

                    m_Exposure        = profile.Add <Exposure>();
                    m_Exposure.active = false;
                    m_Exposure.mode.Override(ExposureMode.Automatic);
                    m_Exposure.compensation.Override(0);
                }

                pipeSetup = true;
            }
        }
        if (m_ExposureReleaseCount > 0)
        {
            m_ExposureReleaseCount--;
            if (m_ExposureReleaseCount == 0)
            {
                BlackFade(false);
            }
        }

        GameApp.CameraStack.Update();


#if UNITY_EDITOR
        // Ugly hack to force focus to game view when using scriptable renderloops.
        if (Time.frameCount < 4)
        {
            try
            {
                var gameViewType = typeof(UnityEditor.EditorWindow).Assembly.GetType("UnityEditor.GameView");
                var gameView     = (EditorWindow)Resources.FindObjectsOfTypeAll(gameViewType)[0];
                gameView.Focus();
            }
            catch (System.Exception) { /* too bad */ }
        }
#endif

        frameTime  = (double)m_Clock.ElapsedTicks / m_StopwatchFrequency;
        frameCount = Time.frameCount;

        GameDebug.SetFrameCount(frameCount);
        Console.SetFrameTime(frameTime);;

        // Switch game loop if needed
        if (m_RequestedGameLoopTypes.Count > 0)
        {
            // Multiple running gameloops only allowed in editor
#if !UNITY_EDITOR
            ShutdownGameLoops();
#endif
            bool initSucceeded = false;
            for (int i = 0; i < m_RequestedGameLoopTypes.Count; i++)
            {
                try
                {
                    IGameLoop gameLoop = (IGameLoop)System.Activator.CreateInstance(m_RequestedGameLoopTypes[i]);
                    initSucceeded = gameLoop.Init(m_RequestedGameLoopArguments[i]);
                    Debug.Log("Game initialization succeeded: " + initSucceeded);
                    if (!initSucceeded)
                    {
                        break;
                    }

                    m_gameLoops.Add(gameLoop);
                }
                catch (System.Exception e)
                {
                    GameDebug.LogError(string.Format("Game loop initialization threw exception : ({0})\n{1}", e.Message, e.StackTrace));
                }
            }


            if (!initSucceeded)
            {
                ShutdownGameLoops();

                GameDebug.LogError("Game loop initialization failed ... reverting to boot loop");
            }

            m_RequestedGameLoopTypes.Clear();
            m_RequestedGameLoopArguments.Clear();
        }

        try
        {
            if (!m_ErrorState)
            {
                foreach (var gameLoop in m_gameLoops)
                {
                    gameLoop.Update();
                }
                levelManager.Update();
            }
        }
        catch (System.Exception e)
        {
            HandleGameloopException(e);
            throw;
        }

        if (SoundSystem.Instance != null)
        {
            SoundSystem.Instance.Update();
        }

        if (clientFrontend != null)
        {
            clientFrontend.UpdateGame();
        }

        Console.ConsoleUpdate();

        bool menusShowing = (clientFrontend != null && clientFrontend.menuShowing != ClientFrontend.MenuShowing.None);
        InputSystem.WindowFocusUpdate(menusShowing);

        UpdateCPUStats();
        UpdateEntityStats();

        sqpClient.Update();

        endUpdateEvent?.Invoke();

        /* HACKY WAY TO LOOK AT MONOBEHAVIOURS LEFT
         * if (Time.frameCount % 1000 == 100)
         * {
         *  var mbs = FindObjectsOfType(typeof(MonoBehaviour));
         *  numMBS = mbs.Length;
         *  var h = new HashSet<Type>();
         *  foreach (var mb in mbs)
         *  {
         *      h.Add(mb.GetType());
         *  }
         *  foreach(var t in h)
         *      GameDebug.Log(":" + t);
         *  numUMBS = h.Count();
         * }
         * Overlay.Managed.Write(2, 4, "Monobehaviours left {0} ({1})", numMBS, numUMBS);
         */
    }