未発表パーティゲーム MultiplayerMenu.cs
msandfrey3
Aug 12, 2024
4 min read
using UnityEngine;using Fusion;using TMPro;using System.Collections;using System.Collections.Generic;using System.Threading.Tasks;using UnityEngine.EventSystems;using PartyGame.UI;using PartyGame.GameManagement;using Zenject;using PartyGame.Audio;using UnityEngine.SceneManagement;using PartyGame.Config;using Fusion.Sockets;using System;
namespace PartyGame.Multiplayer{ public class MultiplayerMenu : MonoBehaviour, INetworkRunnerCallbacks { private const string TOURNAMENT_SCENE_NAME = "TournamentScene"; private const int ROOM_CODE_LENGTH = 6; private const int PLAYER_COUNT = 4;
[SerializeField] private NetworkRunner _networkRunnerPrefab; [SerializeField] private GameObject _loadingObject; [SerializeField] private GameObject _panel; [SerializeField] private TMP_InputField _inputField; [SerializeField] private TMP_Text _errorText; [SerializeField] private TMP_Text _searchText;
[Header("Buttons")] [SerializeField] private LTSButton _defaultSelectedButton; [SerializeField] private LTSButton _achievementsButton; [SerializeField] private LTSButton _hostButton; [SerializeField] private LTSButton _joinButton; [SerializeField] private LTSButton _localPlayButton; [SerializeField] private LTSButton _settingsButton; [SerializeField] private LTSButton _storeButton; [SerializeField] private LTSButton _quitButton; [SerializeField] private LTSButton _joinCancelButton;
[Header("Submenus")] [SerializeField] private SettingsMenuUI _settingsMenuUI; [SerializeField] private GameObject _tutorialScreen;
[Inject] private SceneLoader _sceneLoader;
private NetworkRunner _networkRunner; private EventSystem _eventSystem; private bool _isStarting = false;
private void Start() { Application.targetFrameRate = ApplicationConfig.Instance.GameConfig.settings.targetFPS; _panel.SetActive(true); _loadingObject.SetActive(false); _inputField.characterValidation = TMP_InputField.CharacterValidation.Alphanumeric; _inputField.onValidateInput += ValidateJoinCode;
_eventSystem = EventSystem.current; _eventSystem.SetSelectedGameObject(_defaultSelectedButton.gameObject); _localPlayButton.Initialize(StartOffline); _hostButton.Initialize(StartHost); _joinButton.Initialize(StartClient); _settingsButton.Initialize(OpenSettings); _quitButton.Initialize(Application.Quit); _storeButton.Initialize(OpenStore); _achievementsButton.Initialize(OpenAchievements);
AudioManager.Instance.PlayMusic(MusicType.MainMenu_BackgroundMusic); }
private void StartHost() { string roomCode = RoomCode.Create(ROOM_CODE_LENGTH); _searchText.text = "Starting game..."; _joinCancelButton.gameObject.SetActive(false); StartGame(GameMode.Host, roomCode); }
private void StartClient() { string _roomCode = _inputField.text; if (_roomCode == null || _roomCode.Length <= 0) { StartCoroutine(StartRandom()); return; } if (_roomCode.Length != ROOM_CODE_LENGTH) { _errorText.text = "Please enter a room code of length: " + ROOM_CODE_LENGTH; return; } _searchText.text = "Searching for game..."; _joinCancelButton.gameObject.SetActive(true); StartGame(GameMode.Client, _roomCode, true); }
private void StartOffline() { string roomCode = RoomCode.Create(ROOM_CODE_LENGTH); _searchText.text = "Starting game..."; _joinCancelButton.gameObject.SetActive(false); StartGame(GameMode.Single, roomCode); }
private IEnumerator StartRandom() { _networkRunner = FindObjectOfType<NetworkRunner>(); if (_networkRunner == null) { _networkRunner = Instantiate(_networkRunnerPrefab); } _networkRunner.AddCallbacks(this);
// Let the Fusion Runner know that we will be providing user input _networkRunner.ProvideInput = true;
_searchText.text = "Searching for game..."; _panel.SetActive(false); _loadingObject.SetActive(true);
Task<StartGameResult> task = _networkRunner.JoinSessionLobby(SessionLobby.ClientServer);
while (!task.IsCompleted) { yield return null; } StartGameResult result = task.Result;
if (result.Ok) { Debug.Log("Successfully joined lobby"); } else { //error message _errorText.text = result.ShutdownReason.ToString(); _panel.SetActive(true); _loadingObject.SetActive(false); } }
public void OnSessionListUpdated(NetworkRunner runner, List<SessionInfo> sessionList) { Debug.Log($"Session List Updated with {sessionList.Count} session(s)");
if (sessionList.Count == 0) { return; }
bool isSessionFound = false; string session = ""; string version = Application.version.ToString(); int i = 0; while (!isSessionFound) { if (sessionList[i].IsOpen && sessionList[i].Properties["Version"] == version) { session = sessionList[i].Name; isSessionFound = true; } else { i++; isSessionFound = i >= sessionList.Count; } }
if (session == "") { return; }
_searchText.text = "Joining game..."; StartGame(GameMode.Client, session, true); }
public void CancelJoin() { if (_isStarting) { //things might get messed up if we try to cancel while joining return; } //error message _errorText.text = "No games to join"; _panel.SetActive(true); _loadingObject.SetActive(false); _networkRunner.RemoveCallbacks(this); Destroy(_networkRunner.gameObject); }
/// <summary> /// GameMode.Host = Start a session with a specific name /// GameMode.Client = Join a session with a specific name /// GameMode.Single = Local play only /// </summary> /// <param name="gameMode"></param> private void StartGame(GameMode gameMode, string roomCode, bool disableClientSessionCreation = false) { _isStarting = true; _joinCancelButton.gameObject.SetActive(false); //need a runner to do anything with fusion, so if //there isn't one, make one _networkRunner = FindObjectOfType<NetworkRunner>(); if (_networkRunner == null) { _networkRunner = Instantiate(_networkRunnerPrefab); }
// Let the Fusion Runner know that we will be providing user input _networkRunner.ProvideInput = true; _networkRunner.RemoveCallbacks(this);
Dictionary<string, SessionProperty> properties = new(); properties.Add("Version", Application.version.ToString()); StartGameArgs startGameArgs = new StartGameArgs() { GameMode = gameMode, SessionName = roomCode, PlayerCount = PLAYER_COUNT, DisableClientSessionCreation = disableClientSessionCreation, SessionProperties = properties };
//need something to explain unable to connect StartCoroutine(AttemptStartGame(startGameArgs)); }
private IEnumerator AttemptStartGame(StartGameArgs startGameArgs) { _panel.SetActive(false); _loadingObject.SetActive(true);
Task<StartGameResult> task = _networkRunner.StartGame(startGameArgs); while (!task.IsCompleted) { yield return null; } StartGameResult result = task.Result;
if (result.Ok) { yield return ShowTutoritalScreen(5.0f);
int tournamentSceneIndex = FindSceneBuildIndex(TOURNAMENT_SCENE_NAME); _networkRunner.SetActiveScene(tournamentSceneIndex); } else { //error message _errorText.text = result.ShutdownReason.ToString(); _panel.SetActive(true); _loadingObject.SetActive(false); Destroy(_networkRunner.gameObject); } }
private IEnumerator ShowTutoritalScreen(float time) { _tutorialScreen.SetActive(true); yield return new WaitForSeconds(time); }
private void OpenSettings() { _settingsMenuUI.Show(); }
private void OpenStore() { throw new System.Exception("Not implemented"); }
private void OpenAchievements() { throw new System.Exception("Not implemented"); }
private char ValidateJoinCode(string text, int charIndex, char character) { if (text.Length >= ROOM_CODE_LENGTH) { return '\0'; }
character = char.IsLetter(character) ? char.ToUpper(character) : character;
return character; }
private int FindSceneBuildIndex(string sceneName) { int sceneCount = SceneManager.sceneCountInBuildSettings; for (int i = 0; i < sceneCount; i++) { string path = SceneUtility.GetScenePathByBuildIndex(i); if (path.Contains(sceneName)) { return i; } } return -1; }
public void OnPlayerJoined(NetworkRunner runner, PlayerRef player) { throw new NotImplementedException(); }
public void OnPlayerLeft(NetworkRunner runner, PlayerRef player) { throw new NotImplementedException(); }
public void OnInput(NetworkRunner runner, NetworkInput input) { throw new NotImplementedException(); }
public void OnInputMissing(NetworkRunner runner, PlayerRef player, NetworkInput input) { throw new NotImplementedException(); }
public void OnShutdown(NetworkRunner runner, ShutdownReason shutdownReason) { Debug.Log("Shutting down network Runner."); }
public void OnConnectedToServer(NetworkRunner runner) { throw new NotImplementedException(); }
public void OnDisconnectedFromServer(NetworkRunner runner) { throw new NotImplementedException(); }
public void OnConnectRequest(NetworkRunner runner, NetworkRunnerCallbackArgs.ConnectRequest request, byte[] token) { throw new NotImplementedException(); }
public void OnConnectFailed(NetworkRunner runner, NetAddress remoteAddress, NetConnectFailedReason reason) { throw new NotImplementedException(); }
public void OnUserSimulationMessage(NetworkRunner runner, SimulationMessagePtr message) { throw new NotImplementedException(); }
public void OnCustomAuthenticationResponse(NetworkRunner runner, Dictionary<string, object> data) { throw new NotImplementedException(); }
public void OnHostMigration(NetworkRunner runner, HostMigrationToken hostMigrationToken) { throw new NotImplementedException(); }
public void OnReliableDataReceived(NetworkRunner runner, PlayerRef player, ArraySegment<byte> data) { throw new NotImplementedException(); }
public void OnSceneLoadDone(NetworkRunner runner) { throw new NotImplementedException(); }
public void OnSceneLoadStart(NetworkRunner runner) { throw new NotImplementedException(); } }}
Comments