using System.Collections.Generic; using System.Linq; using Unity.Netcode; using UnityEngine; namespace Northbound { public class PlayerSpawnPositionSetter : NetworkBehaviour { public static PlayerSpawnPositionSetter Instance { get; private set; } [Header("Spawn Settings")] public List spawnPoints = new List(); public bool useRandomSpawn = false; public bool findSpawnPointsAutomatically = true; private void Awake() { if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; if (findSpawnPointsAutomatically) { FindSpawnPoints(); } } private void FindSpawnPoints() { PlayerSpawnPoint[] points = FindObjectsByType(FindObjectsSortMode.None); var sortedPoints = points.OrderBy(p => p.spawnIndex == -1 ? int.MaxValue : p.spawnIndex); spawnPoints.Clear(); foreach (var point in sortedPoints) { if (point.isAvailable) { spawnPoints.Add(point.transform); } } Debug.Log($"[SpawnPositionSetter] {spawnPoints.Count}개의 스폰 포인트를 찾았습니다."); } public Vector3 GetSpawnPosition(ulong clientId) { if (spawnPoints.Count == 0) { Debug.LogWarning("[SpawnPositionSetter] 스폰 포인트가 없습니다. 기본 위치 반환."); return Vector3.zero; } int spawnIndex = GetSpawnIndexForClient(clientId); Debug.Log($"[SpawnPositionSetter] 클라이언트 {clientId}에게 스폰 인덱스 {spawnIndex} 할당"); return spawnPoints[spawnIndex].position; } private int GetSpawnIndexForClient(ulong clientId) { if (useRandomSpawn) { return Random.Range(0, spawnPoints.Count); } int spawnIndex; if (IsServer) { spawnIndex = GetAssignedSpawnIndexServer(clientId); } else { spawnIndex = (int)(clientId % (ulong)spawnPoints.Count); } return spawnIndex; } private int GetAssignedSpawnIndexServer(ulong clientId) { List connectedClientIds = new List(NetworkManager.Singleton.ConnectedClientsIds); connectedClientIds.Sort(); int index = connectedClientIds.IndexOf(clientId); if (index < 0) index = 0; return index % spawnPoints.Count; } public Quaternion GetSpawnRotation(ulong clientId) { if (spawnPoints.Count == 0) return Quaternion.identity; int spawnIndex = GetSpawnIndexForClient(clientId); return spawnPoints[spawnIndex].rotation; } } }