Started make greybox for main location

This commit is contained in:
2026-08-05 17:49:42 +03:00
parent a259a64e80
commit 90934eca22
648 changed files with 314989 additions and 578 deletions
@@ -0,0 +1,132 @@
using System;
using Unity.Netcode;
using UnityEngine;
public enum RoundPhase : byte
{
WaitingForPlayers,
DayInProgress,
WaitingForPlayersToReturn
}
[RequireComponent(typeof(NetworkObject))]
public sealed class RoundGameLoopController : NetworkBehaviour
{
[Header("Day")]
[SerializeField, Min(1f)] private float dayDurationSeconds = 300f;
[SerializeField, Min(0.05f)] private float timerSyncInterval = 0.1f;
private readonly NetworkVariable<RoundPhase> phase = new(
RoundPhase.WaitingForPlayers,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Server);
private readonly NetworkVariable<int> dayNumber = new(
0,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Server);
private readonly NetworkVariable<float> remainingDaySeconds = new(
0f,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Server);
private StartRoomZone startRoom;
private float dayEndTime;
private float nextTimerSyncTime;
public RoundPhase Phase => phase.Value;
public int DayNumber => dayNumber.Value;
public float RemainingDaySeconds => remainingDaySeconds.Value;
public event Action<RoundPhase> PhaseChanged;
public event Action<int> DayStarted;
public event Action<float> DayTimerChanged;
public override void OnNetworkSpawn()
{
phase.OnValueChanged += HandlePhaseChanged;
dayNumber.OnValueChanged += HandleDayNumberChanged;
remainingDaySeconds.OnValueChanged += HandleTimerChanged;
startRoom = FindFirstObjectByType<StartRoomZone>();
if (IsServer)
{
phase.Value = RoundPhase.WaitingForPlayers;
remainingDaySeconds.Value = 0f;
}
}
public override void OnNetworkDespawn()
{
phase.OnValueChanged -= HandlePhaseChanged;
dayNumber.OnValueChanged -= HandleDayNumberChanged;
remainingDaySeconds.OnValueChanged -= HandleTimerChanged;
}
private void Update()
{
if (!IsServer)
return;
if (startRoom == null)
startRoom = FindFirstObjectByType<StartRoomZone>();
if (startRoom == null || Time.time < nextTimerSyncTime)
return;
nextTimerSyncTime = Time.time + timerSyncInterval;
switch (phase.Value)
{
case RoundPhase.WaitingForPlayers:
case RoundPhase.WaitingForPlayersToReturn:
if (AreAllPlayersInStartRoom())
StartNextDay();
break;
case RoundPhase.DayInProgress:
float secondsLeft = Mathf.Max(0f, dayEndTime - Time.time);
remainingDaySeconds.Value = secondsLeft;
if (secondsLeft <= 0f)
{
phase.Value = RoundPhase.WaitingForPlayersToReturn;
remainingDaySeconds.Value = 0f;
}
break;
}
}
private bool AreAllPlayersInStartRoom()
{
if (NetworkManager == null || NetworkManager.ConnectedClients.Count == 0)
return false;
foreach (NetworkClient client in NetworkManager.ConnectedClients.Values)
{
if (client.PlayerObject == null || !startRoom.Contains(client.PlayerObject.transform.position))
return false;
}
return true;
}
private void StartNextDay()
{
dayNumber.Value++;
dayEndTime = Time.time + dayDurationSeconds;
remainingDaySeconds.Value = dayDurationSeconds;
phase.Value = RoundPhase.DayInProgress;
}
private void HandlePhaseChanged(RoundPhase _, RoundPhase current) =>
PhaseChanged?.Invoke(current);
private void HandleDayNumberChanged(int _, int current) =>
DayStarted?.Invoke(current);
private void HandleTimerChanged(float _, float current) =>
DayTimerChanged?.Invoke(current);
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 520cf065a136e624c9eba714e60891c2
@@ -0,0 +1,26 @@
using UnityEngine;
[RequireComponent(typeof(Collider))]
public sealed class StartRoomZone : MonoBehaviour
{
[SerializeField] private Collider roomCollider;
private void Awake()
{
if (roomCollider == null)
roomCollider = GetComponent<Collider>();
}
public bool Contains(Vector3 worldPosition) =>
roomCollider != null && roomCollider.bounds.Contains(worldPosition);
private void OnDrawGizmosSelected()
{
Collider targetCollider = roomCollider != null ? roomCollider : GetComponent<Collider>();
if (targetCollider == null)
return;
Gizmos.color = new Color(0.2f, 0.75f, 1f, 0.22f);
Gizmos.DrawCube(targetCollider.bounds.center, targetCollider.bounds.size);
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: c25f56fa92e0cc1438d12b2ebd5f0b96