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); } }
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); }); }
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); }); }