You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
3.8 KiB
C#

using System;
using Fusion.Sockets;
namespace Projectiles
{
using System.Collections.Generic;
using UnityEngine;
using Fusion;
/// <summary>
/// Handles player connections (spawning of Player instances) and prepares SceneContext when a gameplay scene load is done.
/// </summary>
[RequireComponent(typeof(NetworkRunner))]
[RequireComponent(typeof(NetworkEvents))]
[DefaultExecutionOrder(-100)]
public sealed class GameManager : SimulationBehaviour, INetworkRunnerCallbacks
{
// PRIVATE MEMBERS
[SerializeField]
private Gameplay _gameplayPrefab;
[SerializeField]
private Player _playerPrefab;
private bool _gameplaySpawned;
// INetworkRunnerCallbacks INTERFACE
void INetworkRunnerCallbacks.OnPlayerJoined(NetworkRunner runner, PlayerRef playerRef)
{
if (Runner.IsServer == false)
return;
if (_gameplaySpawned == false)
{
Runner.Spawn(_gameplayPrefab);
_gameplaySpawned = true;
}
var player = Runner.Spawn(_playerPrefab, inputAuthority: playerRef);
Runner.SetPlayerObject(playerRef, player.Object);
}
void INetworkRunnerCallbacks.OnPlayerLeft(NetworkRunner runner, PlayerRef playerRef)
{
if (Runner.IsServer == false)
return;
var player = Runner.GetPlayerObject(playerRef);
if (player != null)
{
Runner.Despawn(player);
}
}
void INetworkRunnerCallbacks.OnSceneLoadDone(NetworkRunner runner)
{
// Prepare context
var scene = runner.SimulationUnityScene.GetComponent<Scene>(true);
var context = scene.Context;
context.Runner = Runner;
// Assign context
var contextBehaviours = runner.SimulationUnityScene.GetComponents<IContextBehaviour>(true);
foreach (var behaviour in contextBehaviours)
{
behaviour.Context = context;
}
var objectPool = Runner.GetComponent<NetworkObjectPool>();
objectPool.Context = context;
if (runner.Config.PeerMode == NetworkProjectConfig.PeerModes.Multiple)
{
// In case of multipeer mode, fix the scene lighting
var renderSettingsUpdated = scene.GetComponent<RenderSettingsUpdater>();
renderSettingsUpdated.ApplySettings();
}
}
void INetworkRunnerCallbacks.OnObjectExitAOI(NetworkRunner runner, NetworkObject obj, PlayerRef player) {}
void INetworkRunnerCallbacks.OnObjectEnterAOI(NetworkRunner runner, NetworkObject obj, PlayerRef player) {}
void INetworkRunnerCallbacks.OnInput(NetworkRunner runner, NetworkInput input) {}
void INetworkRunnerCallbacks.OnInputMissing(NetworkRunner runner, PlayerRef player, NetworkInput input) {}
void INetworkRunnerCallbacks.OnShutdown(NetworkRunner runner, ShutdownReason shutdownReason) {}
void INetworkRunnerCallbacks.OnConnectedToServer(NetworkRunner runner) {}
void INetworkRunnerCallbacks.OnDisconnectedFromServer(NetworkRunner runner, NetDisconnectReason reason) {}
void INetworkRunnerCallbacks.OnConnectRequest(NetworkRunner runner, NetworkRunnerCallbackArgs.ConnectRequest request, byte[] token) {}
void INetworkRunnerCallbacks.OnConnectFailed(NetworkRunner runner, NetAddress remoteAddress, NetConnectFailedReason reason) {}
void INetworkRunnerCallbacks.OnUserSimulationMessage(NetworkRunner runner, SimulationMessagePtr message) {}
void INetworkRunnerCallbacks.OnSessionListUpdated(NetworkRunner runner, List<SessionInfo> sessionList) {}
void INetworkRunnerCallbacks.OnCustomAuthenticationResponse(NetworkRunner runner, Dictionary<string, object> data) {}
void INetworkRunnerCallbacks.OnHostMigration(NetworkRunner runner, HostMigrationToken hostMigrationToken) {}
void INetworkRunnerCallbacks.OnReliableDataReceived(NetworkRunner runner, PlayerRef player, ReliableKey key, ArraySegment<byte> data) {}
void INetworkRunnerCallbacks.OnReliableDataProgress(NetworkRunner runner, PlayerRef player, ReliableKey key, float progress) {}
void INetworkRunnerCallbacks.OnSceneLoadStart(NetworkRunner runner) {}
}
}