...
This commit is contained in:
104
Assets/Scripts/Fusion/BasicSpawner.cs
Normal file
104
Assets/Scripts/Fusion/BasicSpawner.cs
Normal file
@@ -0,0 +1,104 @@
|
||||
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<PlayerRef, NetworkObject> _spawnedCharacters = new Dictionary<PlayerRef, NetworkObject>();
|
||||
|
||||
async void StartGame(GameMode mode)
|
||||
{
|
||||
if (_runner != null) return;
|
||||
_runner = gameObject.AddComponent<NetworkRunner>();
|
||||
_runner.ProvideInput = true;
|
||||
DontDestroyOnLoad(gameObject);
|
||||
await _runner.StartGame(new StartGameArgs()
|
||||
{
|
||||
GameMode = mode,
|
||||
SessionName = "TestRoom",
|
||||
Scene = SceneRef.FromIndex(1),
|
||||
SceneManager = gameObject.AddComponent<NetworkSceneManagerDefault>()
|
||||
});
|
||||
}
|
||||
|
||||
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<SessionInfo> sessionList) { }
|
||||
public void OnCustomAuthenticationResponse(NetworkRunner runner, Dictionary<string, object> 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<byte> data) { }
|
||||
public void OnReliableDataProgress(NetworkRunner runner, PlayerRef player, ReliableKey key, float progress) { }
|
||||
}
|
||||
Reference in New Issue
Block a user