Ejemplo n.º 1
0
    private void UpdateMyCharacter()
    {
        if (!mMyPlayerCharacter.alive) // 復活
        {
            mReviveTimer += Time.deltaTime;

            if (mReviveTimer >= REVIVE_TIME)
            {
                mMyPlayerCharacter.Spawn(GetPlayerSpawnPosition());

                // MSG_REVIVE

                mSendBuffer.Clear();
                mSendBuffer.Write(MSG_REVIVE);
                WriteVector2(mMyPlayerCharacter.position);

                mPeer.Send(mSendBuffer.RawData, mSendBuffer.Size, BleSock.Address.Others);
            }

            return;
        }

        if (Input.GetMouseButtonDown(0))
        {
            StartCoroutine(TouchDown());
        }

        // 弾に対し総当たりで衝突判定(よい子はまねしてはいけない)

        foreach (var bullet in mBullets)
        {
            if (bullet.playerId == mMyPlayerCharacter.playerId)
            {
                continue;
            }

            float sqrMagnitude = (bullet.position - mMyPlayerCharacter.position).sqrMagnitude;
            if (sqrMagnitude > (PlayerCharacter.RADIUS + Bullet.RADIUS) * (PlayerCharacter.RADIUS + Bullet.RADIUS))
            {
                continue;
            }

            mBullets.Remove(bullet);
            Destroy(bullet.gameObject);

            mMyPlayerCharacter.Die();
            mReviveTimer = 0;

            var killer = mPeer.Players.Where(player => player.PlayerId == bullet.playerId).FirstOrDefault();
            if (killer != null)
            {
                Log("{0}に倒された", killer.PlayerName);
            }

            var killerCharacter = mPlayerCharacters.Where(pc => pc.playerId == bullet.playerId).FirstOrDefault();
            if (killerCharacter != null)
            {
                killerCharacter.score += PlayerCharacter.KILL_SCORE;
            }

            // MSG_DIE

            mSendBuffer.Clear();
            mSendBuffer.Write(MSG_DIE);
            mSendBuffer.Write(bullet.playerId);
            mSendBuffer.Write(bullet.bulletId);

            mPeer.Send(mSendBuffer.RawData, mSendBuffer.Size, BleSock.Address.Others);

            break;
        }

        // 壁と衝突判定

        Vector2 position = mMyPlayerCharacter.position;

        if (position.x < -FIELD_X + PlayerCharacter.RADIUS)
        {
            position.x = -FIELD_X + PlayerCharacter.RADIUS;
            mMyPlayerCharacter.velocity.x = -mMyPlayerCharacter.velocity.x;
        }

        if (position.x > FIELD_X - PlayerCharacter.RADIUS)
        {
            position.x = FIELD_X - PlayerCharacter.RADIUS;
            mMyPlayerCharacter.velocity.x = -mMyPlayerCharacter.velocity.x;
        }

        if (position.y < -FIELD_Y + PlayerCharacter.RADIUS)
        {
            position.y = -FIELD_Y + PlayerCharacter.RADIUS;
            mMyPlayerCharacter.velocity.y = -mMyPlayerCharacter.velocity.y;
        }

        if (position.y > FIELD_Y - PlayerCharacter.RADIUS)
        {
            position.y = FIELD_Y - PlayerCharacter.RADIUS;
            mMyPlayerCharacter.velocity.y = -mMyPlayerCharacter.velocity.y;
        }

        mMyPlayerCharacter.position = position;

        // 他プレイヤーへ同期

        mSyncTimer += Time.deltaTime;
        if (mSyncTimer >= SYNC_INTERVAL)
        {
            mSyncTimer -= SYNC_INTERVAL;

            // MSG_SYNC

            mSendBuffer.Clear();
            mSendBuffer.Write(MSG_SYNC);
            WriteVector2(mMyPlayerCharacter.position);
            WriteVector2(mMyPlayerCharacter.velocity);
            WriteFloat(mMyPlayerCharacter.rotation);
            mSendBuffer.Write(mMyPlayerCharacter.accelerating);

            mPeer.Send(mSendBuffer.RawData, mSendBuffer.Size, BleSock.Address.Others);
        }
    }
Ejemplo n.º 2
0
    private void Start()
    {
        modeSelectObject.SetActive(true);

        playerNameInputField.onEndEdit.AddListener((name) =>
        {
            bool interactable       = !string.IsNullOrEmpty(name);
            hostButton.interactable = interactable;
            joinButton.interactable = interactable;
        });

        // Host

        hostButton.interactable = false;
        hostButton.onClick.AddListener(() =>
        {
            modeSelectObject.SetActive(false);
            testObject.SetActive(true);

            backButton.interactable = true;

            var host            = new BleSock.HostPeer();
            host.MaximumPlayers = 2;

            host.onReady += () =>
            {
                Log("初期化が完了しました");

                try
                {
                    host.StartAdvertising(playerNameInputField.text);
                }
                catch (Exception e)
                {
                    Debug.LogException(e);
                    Log("アドバタイズ開始できません");
                }

                Log("接続を待っています..");
            };

            host.onBluetoothRequire += () =>
            {
                Log("Bluetoothを有効にしてください");
            };

            host.onFail += () =>
            {
                Log("失敗しました");
            };

            host.onPlayerJoin += (player) =>
            {
                Log("{0} が参加しました", player.PlayerName);
                sizesDropdown.interactable = true;
                testButton.interactable    = true;
            };

            host.onPlayerLeave += (player) =>
            {
                Log("{0} が離脱しました", player.PlayerName);
                sizesDropdown.interactable = false;
                testButton.interactable    = false;
            };

            host.onReceive += OnReceive;

            try
            {
                host.Initialize(PROTOCOL_IDENTIFIER, playerNameInputField.text);
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                Log("初期化できません");
                return;
            }

            Log("初期化しています..");
            mPeer = host;
        });

        // Guest

        connectObject.SetActive(false);

        joinButton.interactable = false;
        joinButton.onClick.AddListener(() =>
        {
            modeSelectObject.SetActive(false);
            connectObject.SetActive(true);
            testObject.SetActive(true);

            devicesDropdown.interactable = false;
            connectButton.interactable   = false;

            backButton.interactable = true;

            var guest = new BleSock.GuestPeer();

            guest.onBluetoothRequire += () =>
            {
                Log("Bluetoothを有効にしてください");
            };

            guest.onReady += () =>
            {
                Log("初期化が完了しました");

                try
                {
                    guest.StartScan();
                }
                catch (Exception e)
                {
                    Debug.LogException(e);
                    Log("スキャン開始できません");
                    return;
                }

                Log("デバイスを探索しています..");
                devicesDropdown.ClearOptions();
            };

            guest.onFail += () =>
            {
                Log("失敗しました");
            };

            guest.onDiscover += (deviceName, deviceId) =>
            {
                Log("デバイスを発見: {0} [{1}]", deviceName, deviceId);
                devicesDropdown.options.Add(new ValueOptionData(deviceName, deviceId));

                if (!devicesDropdown.interactable)
                {
                    devicesDropdown.interactable = true;
                    devicesDropdown.value        = 0;
                    devicesDropdown.RefreshShownValue();
                    connectButton.interactable = true;
                }
            };

            guest.onConnect += () =>
            {
                Log("接続されました");
                sizesDropdown.interactable = true;
                testButton.interactable    = true;
            };

            guest.onDisconnect += () =>
            {
                Log("切断されました");
                sizesDropdown.interactable = false;
                testButton.interactable    = false;
            };

            guest.onPlayerJoin += (player) =>
            {
                Log("{0} が参加しました", player.PlayerName);
            };

            guest.onPlayerLeave += (player) =>
            {
                Log("{0} が離脱しました", player.PlayerName);
            };

            guest.onReceive += OnReceive;

            try
            {
                guest.Initialize(PROTOCOL_IDENTIFIER, playerNameInputField.text);
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                Log("初期化できません");
                return;
            }

            Log("初期化しています..");
            mPeer = guest;
        });

        connectButton.onClick.AddListener(() =>
        {
            var optionData = (ValueOptionData)devicesDropdown.options[devicesDropdown.value];
            try
            {
                ((BleSock.GuestPeer)mPeer).Connect(optionData.value);
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                Log("エラー");
                return;
            }

            Log("デバイスに接続しています..");
            devicesDropdown.interactable = false;
            connectButton.interactable   = false;
        });

        // Test

        testObject.SetActive(false);

        sizesDropdown.interactable = false;
        for (int i = 8; i < 13; ++i)
        {
            int size = 1 << i;
            sizesDropdown.options.Add(new ValueOptionData(size.ToString(), size));
        }
        sizesDropdown.value = 0;

        testButton.interactable = false;
        testButton.onClick.AddListener(() =>
        {
            int size  = ((ValueOptionData)sizesDropdown.options[sizesDropdown.value]).value;
            var bytes = new byte[size];

            mRandom.GetBytes(bytes);

            bytes[0] = 0;

            try
            {
                mPeer.Send(bytes, bytes.Length, BleSock.Address.Others);
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                Log("エラー");
                return;
            }

            Log("スピード計測中..");
            mStartTime = Environment.TickCount;
            sizesDropdown.interactable = false;
            testButton.interactable    = false;
        });

        backButton.interactable = false;
        backButton.onClick.AddListener(() =>
        {
            if (mPeer != null)
            {
                mPeer.Dispose();
                mPeer = null;
            }

            mLogs.Clear();

            modeSelectObject.SetActive(true);
            connectObject.SetActive(false);
            testObject.SetActive(false);
        });
    }
Ejemplo n.º 3
0
    private void Start()
    {
        modeSelectObject.SetActive(true);

        playerNameInputField.onEndEdit.AddListener((name) =>
        {
            bool interactable       = !string.IsNullOrEmpty(name);
            hostButton.interactable = interactable;
            joinButton.interactable = interactable;
        });

        // Host

        hostObject.SetActive(false);

        hostButton.interactable = false;
        hostButton.onClick.AddListener(() =>
        {
            modeSelectObject.SetActive(false);
            hostObject.SetActive(true);
            chatObject.SetActive(true);

            advertiseButton.interactable = false;
            stopButton.interactable      = false;

            backButton.interactable = true;

            var host = new BleSock.HostPeer();

            host.onReady += () =>
            {
                Log("初期化が完了しました");
                advertiseButton.interactable = true;
                sendInputField.interactable  = true;
            };

            host.onBluetoothRequire += () =>
            {
                Log("Bluetoothを有効にしてください");
            };

            host.onFail += () =>
            {
                Log("失敗しました");
            };

            host.onPlayerJoin += (player) =>
            {
                Log("{0} が参加しました", player.PlayerName);
            };

            host.onPlayerLeave += (player) =>
            {
                Log("{0} が離脱しました", player.PlayerName);
            };

            host.onReceive += (message, messageSize, sender) =>
            {
                Log("{0}: {1}", sender.PlayerName, Encoding.UTF8.GetString(message, 0, messageSize));
            };

            try
            {
                host.Initialize(PROTOCOL_IDENTIFIER, playerNameInputField.text);
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                Log("初期化できません");
                return;
            }

            Log("初期化しています..");
            mPeer = host;
        });

        advertiseButton.onClick.AddListener(() =>
        {
            try
            {
                ((BleSock.HostPeer)mPeer).StartAdvertising(playerNameInputField.text);
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                Log("アドバタイズ開始できません");
                return;
            }

            Log("アドバタイズしています..");
            advertiseButton.interactable = false;
            stopButton.interactable      = true;
        });

        stopButton.onClick.AddListener(() =>
        {
            ((BleSock.HostPeer)mPeer).StopAdvertising();

            Log("アドバタイズを停止しました");
            advertiseButton.interactable = true;
            stopButton.interactable      = false;
        });

        // Guest

        guestObject.SetActive(false);

        joinButton.interactable = false;
        joinButton.onClick.AddListener(() =>
        {
            modeSelectObject.SetActive(false);
            guestObject.SetActive(true);
            chatObject.SetActive(true);

            devicesDropdown.interactable  = false;
            connectButton.interactable    = false;
            disconnectButton.interactable = false;

            backButton.interactable = true;

            var guest = new BleSock.GuestPeer();

            guest.onBluetoothRequire += () =>
            {
                Log("Bluetoothを有効にしてください");
            };

            guest.onReady += () =>
            {
                Log("初期化が完了しました");

                try
                {
                    guest.StartScan();
                }
                catch (Exception e)
                {
                    Debug.LogException(e);
                    Log("スキャン開始できません");
                    return;
                }

                Log("デバイスを探索しています..");
                devicesDropdown.ClearOptions();
            };

            guest.onFail += () =>
            {
                Log("失敗しました");
            };

            guest.onDiscover += (deviceName, deviceId) =>
            {
                Log("デバイスを発見: {0} [{1}]", deviceName, deviceId);
                devicesDropdown.options.Add(new DeviceOptionData(deviceName, deviceId));

                if (!devicesDropdown.interactable)
                {
                    devicesDropdown.interactable = true;
                    devicesDropdown.value        = 0;
                    devicesDropdown.RefreshShownValue();
                    connectButton.interactable = true;
                }
            };

            guest.onConnect += () =>
            {
                Log("接続されました");

                foreach (var player in guest.Players)
                {
                    Log(player.PlayerName);
                }

                sendInputField.interactable = true;
            };

            guest.onDisconnect += () =>
            {
                Log("切断されました");
                sendInputField.interactable   = false;
                disconnectButton.interactable = false;
            };

            guest.onPlayerJoin += (player) =>
            {
                Log("{0} が参加しました", player.PlayerName);
            };

            guest.onPlayerLeave += (player) =>
            {
                Log("{0} が離脱しました", player.PlayerName);
            };

            guest.onReceive += (message, messageSize, sender) =>
            {
                Log("{0}: {1}", sender.PlayerName, Encoding.UTF8.GetString(message, 0, messageSize));
            };

            try
            {
                guest.Initialize(PROTOCOL_IDENTIFIER, playerNameInputField.text);
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                Log("初期化できません");
                return;
            }

            Log("初期化しています..");
            mPeer = guest;
        });

        connectButton.onClick.AddListener(() =>
        {
            var optionData = (DeviceOptionData)devicesDropdown.options[devicesDropdown.value];
            try
            {
                ((BleSock.GuestPeer)mPeer).Connect(optionData.deviceId);
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                Log("エラー");
                return;
            }

            Log("デバイスに接続しています..");
            devicesDropdown.interactable  = false;
            connectButton.interactable    = false;
            disconnectButton.interactable = true;
        });

        disconnectButton.onClick.AddListener(() =>
        {
            ((BleSock.GuestPeer)mPeer).Disconnect();
        });

        // Chat

        chatObject.SetActive(false);

        sendInputField.interactable = false;
        sendInputField.onEndEdit.AddListener((text) =>
        {
            var bytes = Encoding.UTF8.GetBytes(text);
            try
            {
                mPeer.Send(bytes, bytes.Length, BleSock.Address.All);
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                Log("エラー");
                return;
            }

            sendInputField.text = "";
        });

        backButton.interactable = false;
        backButton.onClick.AddListener(() =>
        {
            if (mPeer != null)
            {
                mPeer.Dispose();
                mPeer = null;
            }

            mLogs.Clear();

            modeSelectObject.SetActive(true);
            hostObject.SetActive(false);
            guestObject.SetActive(false);
            chatObject.SetActive(false);
        });
    }