Пример #1
0
        public void BackButton()
        {
            switch (_buttonStage)
            {
            case ButtonStages.HostSendToNetworking:
                _buttonStage = ButtonStages.HostPaste;
                break;

            case ButtonStages.ClientSendToNetworking:
                _buttonStage = ButtonStages.ClientPaste;
                break;
            }

            StartCoroutine(WaitForNetworking());
        }
Пример #2
0
        private IEnumerator WaitForNetworking()
        {
            var textEditor     = new TextEditor();
            var timeoutCounter = 0;
            RTCSessionDescription description;

            switch (_buttonStage)
            {
            case ButtonStages.Error:     // Error
                _buttonStage      = ButtonStages.Error;
                _buttonText.text  = "ERROR.";
                _subtext.fontSize = 70;
                _subtext.text     = "Something failed in establishing network connection.\n" +
                                    "Please verify that you had a valid SDP address copied.";
                break;

            case ButtonStages.DeterminingHostOrClient:     // Determining host or client
                HostToggleStartingText.SetActive(false);
                HostToggleNotice.SetActive(true);

                InitializeWebRtc();

                // True = Host. False = Client.
                var hostToggle = HostToggleObject.GetComponent <Toggle>().isOn;
                HostToggleNotice.GetComponent <Text>().text += hostToggle ? "Host." : "Client.";

                HostToggleObject.SetActive(false);

                if (hostToggle)
                {
                    goto case ButtonStages.HostPaste;
                }

                goto case ButtonStages.Client;

            case ButtonStages.Client:     // Client
                _subtext.text    = "Please wait. Generating SDP address.";
                _buttonText.text = "Save SDP address to clipboard.";

                var clientOffer = StartClientOffer();
                while (clientOffer.keepWaiting)
                {
                    // Cant place in function, has goto and a yield return.
                    if (_subtext.text.Count(c => c == '.') > 6)
                    {
                        _subtext.text = "Please wait. Generating SDP address";
                        timeoutCounter++;
                    }

                    if (timeoutCounter > 4)
                    {
                        goto case ButtonStages.Error;
                    }

                    _subtext.text += ".";
                    yield return(new WaitForSeconds(1f));
                }

                description = clientOffer.Desc;

                yield return(_peerConnection.SetLocalDescription(ref description));

                _subtext.text = "Unique SDP protocol address received.\n" +
                                "Please paste it in Discord for the host to copy.";

                textEditor.text = JsonUtility.ToJson(description).Compress();
                textEditor.SelectAll();
                textEditor.Copy();

                _buttonStage = ButtonStages.ClientPaste;
                break;

            case ButtonStages.ClientPaste:
                GoBackObject.SetActive(false);

                _subtext.fontSize = 70;
                _subtext.text     = "Please copy unique SDP address from Discord from host.\n" +
                                    "Make sure not to include any whitespace or external characters.";
                _buttonText.text = "Submit SDP address from clipboard.";
                _buttonStage     = ButtonStages.ClientVerify;
                break;

            case ButtonStages.ClientVerify:
                GoBackObject.SetActive(true);

                _buttonText.text = "Continue.";

                textEditor.Paste();
                _iceCompressed = textEditor.text.Trim();

                _subtext.fontSize = 25;
                _subtext.text     = "Given SDP Address:\n" + _iceCompressed;

                _buttonStage = ButtonStages.ClientSendToNetworking;
                break;

            case ButtonStages.ClientSendToNetworking:
                GoBackObject.SetActive(false);
                _buttonText.text = "Attempting to connect.";

                description = JsonUtility.FromJson <RTCSessionDescription>(_iceCompressed.Decompress());
                yield return(_peerConnection.SetRemoteDescription(ref description));

                _buttonText.text = _peerConnection.ConnectionState.ToString();
                _buttonStage     = ButtonStages.NotReady;
                break;

            case ButtonStages.HostPaste:     // Host
                GoBackObject.SetActive(false);

                _subtext.fontSize = 70;
                _subtext.text     = "Please copy unique SDP address from Discord from client.\n" +
                                    "Make sure not to include any whitespace or external characters.";
                _buttonText.text = "Submit SDP address from clipboard.";
                _buttonStage     = ButtonStages.HostVerify;
                break;

            case ButtonStages.HostVerify:
                GoBackObject.SetActive(true);

                _buttonText.text = "Continue.";

                textEditor.Paste();
                _iceCompressed = textEditor.text.Trim();

                _subtext.fontSize = 25;
                _subtext.text     = "Given SDP Address:\n" + _iceCompressed;

                _buttonStage = ButtonStages.HostSendToNetworking;
                break;

            case ButtonStages.HostSendToNetworking:     // Host paste SDP address.
                GoBackObject.SetActive(false);

                _subtext.fontSize = 70;
                _subtext.text     = "Please wait. Generating SDP address.";
                _buttonText.text  = "Save SDP address to clipboard.";

                description = JsonUtility.FromJson <RTCSessionDescription>(_iceCompressed.Decompress());
                yield return(_peerConnection.SetRemoteDescription(ref description));

                RTCAnswerOptions answerOption = default;
                var hostAnswer = _peerConnection.CreateAnswer(ref answerOption);
                while (hostAnswer.keepWaiting)
                {
                    // Cant place in function, has goto and a yield return.
                    if (_subtext.text.Count(c => c == '.') > 6)
                    {
                        _subtext.text = "Please wait. Generating SDP address";
                        timeoutCounter++;
                    }

                    if (timeoutCounter > 4)
                    {
                        goto case ButtonStages.Error;
                    }

                    _subtext.text += ".";
                    yield return(new WaitForSeconds(1f));
                }

                _subtext.text = "Unique SDP protocol address received.\n" +
                                "Please paste it in Discord for the client to copy.";

                description = hostAnswer.Desc;
                yield return(_peerConnection.SetLocalDescription(ref description));

                textEditor.text = JsonUtility.ToJson(description).Compress();
                textEditor.SelectAll();
                textEditor.Copy();

                _buttonStage = ButtonStages.NotReady;
                break;

            case ButtonStages.NotReady:
                break;
            }

            if (_buttonStage != ButtonStages.Error && _buttonStage != ButtonStages.NotReady)
            {
                _networkButton.interactable = true;
            }
            yield return(null);
        }