using System; using System.Collections.Generic; using Fusion; using Fusion.Sockets; using UnityEngine; using UnityEngine.SceneManagement; // ĐỊNH NGHĨA DỮ LIỆU GỬI QUA MẠNG public struct NetworkInputData : INetworkInput { public Vector2 move; public Quaternion rot; public bool sprint; } public class BasicSpawner : MonoBehaviour, INetworkRunnerCallbacks { private NetworkRunner _runner; [SerializeField] private NetworkPrefabRef _playerPrefab; private Dictionary _spawnedCharacters = new Dictionary(); async void StartGame(GameMode mode) { if (_runner != null) return; _runner = gameObject.AddComponent(); _runner.ProvideInput = true; DontDestroyOnLoad(gameObject); await _runner.StartGame(new StartGameArgs() { GameMode = mode, SessionName = "TestRoom", Scene = SceneRef.FromIndex(1), SceneManager = gameObject.AddComponent() }); } private void OnGUI() { if (_runner == null) { if (GUI.Button(new Rect(10, 10, 200, 40), "Host (Tạo phòng)")) StartGame(GameMode.AutoHostOrClient); if (GUI.Button(new Rect(10, 60, 200, 40), "Join (Vào phòng)")) StartGame(GameMode.Client); } } public void OnPlayerJoined(NetworkRunner runner, PlayerRef player) { if (runner.IsServer) { Vector3 spawnPosition = new Vector3((player.RawEncoded % 10) * 2, 1, 0); NetworkObject networkPlayerObject = runner.Spawn(_playerPrefab, spawnPosition, Quaternion.identity, player); runner.SetPlayerObject(player, networkPlayerObject); _spawnedCharacters.Add(player, networkPlayerObject); } } public void OnInput(NetworkRunner runner, NetworkInput input) { var data = new NetworkInputData(); // Lấy dữ liệu từ nhân vật local của chính mình if (OnlyScove.Scripts.PlayerStateMachine.Local != null) { var sm = OnlyScove.Scripts.PlayerStateMachine.Local; data.move = sm.Input.MoveInput; data.sprint = sm.Input.IsSprintHeld; // Lấy hướng xoay từ Camera (nếu có) if (sm.Cam != null) data.rot = sm.Cam.PlanarRotation; else data.rot = sm.NetworkedCameraRotation; // Fallback } input.Set(data); } public void OnPlayerLeft(NetworkRunner runner, PlayerRef player) { if (_spawnedCharacters.TryGetValue(player, out NetworkObject networkObject)) { if (networkObject != null) runner.Despawn(networkObject); _spawnedCharacters.Remove(player); } } public void OnInputMissing(NetworkRunner runner, PlayerRef player, NetworkInput input) { } public void OnShutdown(NetworkRunner runner, ShutdownReason shutdownReason) { } public void OnConnectedToServer(NetworkRunner runner) { } public void OnDisconnectedFromServer(NetworkRunner runner, NetDisconnectReason reason) { } public void OnConnectRequest(NetworkRunner runner, NetworkRunnerCallbackArgs.ConnectRequest request, byte[] token) { } public void OnConnectFailed(NetworkRunner runner, NetAddress remoteAddress, NetConnectFailedReason reason) { } public void OnUserSimulationMessage(NetworkRunner runner, SimulationMessagePtr message) { } public void OnSessionListUpdated(NetworkRunner runner, List sessionList) { } public void OnCustomAuthenticationResponse(NetworkRunner runner, Dictionary data) { } public void OnHostMigration(NetworkRunner runner, HostMigrationToken hostMigrationToken) { } public void OnSceneLoadDone(NetworkRunner runner) { } public void OnSceneLoadStart(NetworkRunner runner) { } public void OnObjectExitAOI(NetworkRunner runner, NetworkObject obj, PlayerRef player) { } public void OnObjectEnterAOI(NetworkRunner runner, NetworkObject obj, PlayerRef player) { } public void OnReliableDataReceived(NetworkRunner runner, PlayerRef player, ReliableKey key, ArraySegment data) { } public void OnReliableDataProgress(NetworkRunner runner, PlayerRef player, ReliableKey key, float progress) { } }