public void Restart(
            PhysicsSyncType physicsSyncType)
        {
            _physicsSyncType = physicsSyncType;

            UpdateTexts();
        }
Esempio n. 2
0
        public void PerformRestart(
            PhysicsSyncType syncType)
        {
            _syncType = syncType;

            if (_syncType == PhysicsSyncType.Post_Update)
            {
                Physics2D.autoSimulation = false;
            }
            else
            {
                Physics2D.autoSimulation = true;
            }
        }
        private void PerformRestart()
        {
            for (int i = 0; i < _balls.Count; i++)
            {
                Destroy(_balls[i].gameObject);
            }

            _balls.Clear();

            for (int i = 0; i < _attachments.Count; i++)
            {
                Destroy(_attachments[i].gameObject);
            }

            _attachments.Clear();

            if (_vsyncSlider.value != 0)
            {
                QualitySettings.vSyncCount  = (int)_vsyncSlider.value;
                Application.targetFrameRate = 0;
            }
            else
            {
                QualitySettings.vSyncCount = 0;

                if (_frameRateSlider.value <= 300)
                {
                    Application.targetFrameRate = (int)_frameRateSlider.value;
                }
                else
                {
                    Application.targetFrameRate = int.MaxValue;
                }
            }

            Time.fixedDeltaTime = 1f / (int)_physicsRateSlider.value;

            _frameRatePanel.gameObject.SetActive(_vsyncSlider.value == 0);


            _physicsSyncType = (PhysicsSyncType)(int)_physicsSyncSlider.value;
            _manualPhysicUpdate.PerformRestart(_physicsSyncType);

            DisplayStyle displayStyle = (DisplayStyle)(int)_displaySlider.value;

            _rigidbodySpriteUpdate.PerformRestart(displayStyle);

            _colliderTilemap.ClearAllTiles();
            _backgroundTilemap.ClearAllTiles();

            int       laneCount = (int)_laneSlider.value;
            const int laneMinX  = -18;
            const int laneMaxX  = 9;
            int       laneY     = 6;

            for (int i = 0; i < laneCount; ++i)
            {
                for (int yOffset = i == 0 ? 0 : 1; yOffset < 4; ++yOffset)
                {
                    for (int x = laneMinX; x <= laneMaxX; ++x)
                    {
                        if (yOffset == 0 || yOffset == 3 || x == laneMinX || x == laneMaxX)
                        {
                            _colliderTilemap.SetTile(new Vector3Int(x, laneY, 0), _wallTile);
                        }
                        else
                        {
                            _backgroundTilemap.SetTile(new Vector3Int(x, laneY, 0), _backgroundTile);
                        }
                    }

                    laneY -= 1;
                }
            }

            CameraMinY = laneY;

            for (int i = 0; i < _players.Count; ++i)
            {
                Destroy(_players[i].gameObject);
            }
            _players.Clear();

            while (_players.Count < laneCount)
            {
                Player player = Instantiate(_playerPrefab);
                _players.Add(player);
            }

            if (_followLane >= 0)
            {
                if (_followLane > _players.Count - 1)
                {
                    _followLane = _players.Count - 1;
                }

                _mainCamera.Follow(_players[_followLane]);
            }

            while (!_sharedSettings && _laneCanvases.Count < laneCount ||
                   _sharedSettings && _laneCanvases.Count < 1)
            {
                LaneCanvas newLaneCanvas = Instantiate(_laneCanvasPrefab, _laneCanvasParent);

                if (_laneCanvases.Count > 0)
                {
                    LaneCanvas lastLaneCanvas = _laneCanvases[_laneCanvases.Count - 1];
                    newLaneCanvas.MethodType        = lastLaneCanvas.MethodType;
                    newLaneCanvas.BodyType          = lastLaneCanvas.BodyType;
                    newLaneCanvas.MovementType      = lastLaneCanvas.MovementType;
                    newLaneCanvas.InterpolationType = lastLaneCanvas.InterpolationType;
                }

                _laneCanvases.Add(newLaneCanvas);
            }

            for (int i = 0; i < _laneCanvases.Count; ++i)
            {
                LaneCanvas laneCanvas = _laneCanvases[i];

                if (!_sharedSettings && i < laneCount ||
                    _sharedSettings && i == 0)
                {
                    laneCanvas.gameObject.SetActive(true);
                }
                else
                {
                    laneCanvas.gameObject.SetActive(false);
                }

                if (i < laneCount)
                {
                    laneCanvas.Init(i, _players[i]);
                }

                laneCanvas.Restart(_physicsSyncType);
            }

            for (int i = 0; i < _players.Count; ++i)
            {
                Player player = _players[i];

                LaneCanvas laneCanvas;

                if (!_sharedSettings)
                {
                    laneCanvas = _laneCanvases[i];
                    laneCanvas.transform.position = new Vector3(14.75f, 5f - i * 3, 0);
                }
                else
                {
                    laneCanvas = _laneCanvases[0];
                    laneCanvas.transform.position = new Vector3(14.75f, 5f, 0);
                }

                player.Restart(
                    i,
                    new Vector3(_playerMinX, 5 - i * 3, 0),
                    _playerMinX,
                    _playerMaxX,
                    _physicsSyncType == PhysicsSyncType.Default ? laneCanvas.MethodType : MethodType.Update,
                    laneCanvas.BodyType,
                    laneCanvas.MovementType,
                    laneCanvas.InterpolationType,
                    _speedSlider.value,
                    displayStyle);

                _rigidbodySpriteUpdate.RegisterPlayer(player);

                if (_hingeSlider.value > 0 && player.HingeJoint != null)
                {
                    Vector2 offset       = new Vector2(0.0f, 0.7f);
                    Vector3 connectedPos = player.transform.position;

                    connectedPos.x += offset.x;
                    connectedPos.y += offset.y;

                    HingeJoint2D playerHingeJoint = player.HingeJoint;

                    Rigidbody2D attachment = GameObject.Instantiate(Simulation.Instance.AttachmentPrefab, connectedPos, Quaternion.identity, _attachmentParent);

                    playerHingeJoint.connectedBody   = attachment;
                    playerHingeJoint.connectedAnchor = offset;
                    playerHingeJoint.enabled         = true;

                    _attachments.Add(attachment);
                }


                float x = -13;

                float y       = _players[i].transform.position.y;
                float yOffset = 0;

                int ballCount = (int)_ballSlider.value;

                for (int j = 0; j < ballCount; ++j)
                {
                    Transform transform = Instantiate(_ballPrefab, _ballParent);
                    transform.position = new Vector3(x, y + (yOffset % 1f) - 0.5f);
                    _balls.Add(transform);

                    x += 1.2f;
                    if (x > 7)
                    {
                        x = -13;
                    }

                    yOffset += Mathf.PI;
                }
            }
        }