팀원들 모두가 시야를 공유하도록 함

This commit is contained in:
2026-02-25 21:45:06 +09:00
parent 23429ec096
commit 0a2119a548
3 changed files with 52 additions and 2 deletions

View File

@@ -342,12 +342,14 @@ namespace Northbound
fogData.ClearCurrentVision(); fogData.ClearCurrentVision();
} }
// 모든 시야 제공자의 시야 범위 계산 // 모든 시야 제공자의 시야 범위 계산 (팀 시야 공유)
foreach (var provider in _visionProviders) foreach (var provider in _visionProviders)
{ {
if (provider == null || !provider.IsActive()) continue; if (provider == null || !provider.IsActive()) continue;
ulong ownerId = provider.GetOwnerId(); ulong ownerId = provider.GetOwnerId();
TeamType providerTeam = provider.GetTeam();
if (!_serverFogData.ContainsKey(ownerId)) if (!_serverFogData.ContainsKey(ownerId))
{ {
_serverFogData[ownerId] = new FogOfWarData(gridWidth, gridHeight); _serverFogData[ownerId] = new FogOfWarData(gridWidth, gridHeight);
@@ -356,7 +358,8 @@ namespace Northbound
Vector3 position = provider.GetTransform().position; Vector3 position = provider.GetTransform().position;
float visionRange = provider.GetVisionRange(); float visionRange = provider.GetVisionRange();
RevealArea(ownerId, position, visionRange); // 같은 팀의 모든 멤버에게 시야 공유
RevealAreaForTeam(providerTeam, position, visionRange);
} }
// 각 클라이언트에게 시야 데이터 전송 // 각 클라이언트에게 시야 데이터 전송
@@ -387,6 +390,47 @@ namespace Northbound
} }
} }
/// <summary>
/// 같은 팀의 모든 멤버에게 시야 공개
/// </summary>
private void RevealAreaForTeam(TeamType team, Vector3 worldPosition, float radius)
{
// 해당 팀의 모든 멤버 찾기
foreach (var kvp in _serverFogData)
{
ulong clientId = kvp.Key;
// 클라이언트의 팀 확인
if (GetClientTeam(clientId) == team)
{
RevealArea(clientId, worldPosition, radius);
}
}
}
/// <summary>
/// 클라이언트의 팀 가져오기
/// </summary>
private TeamType GetClientTeam(ulong clientId)
{
if (NetworkManager.Singleton == null) return TeamType.Neutral;
// 연결된 클라이언트에서 플레이어 오브젝트 찾기
if (NetworkManager.Singleton.SpawnManager.SpawnedObjects != null)
{
foreach (var netObj in NetworkManager.Singleton.SpawnManager.SpawnedObjects.Values)
{
var playerController = netObj.GetComponent<NetworkPlayerController>();
if (playerController != null && playerController.OwnerPlayerId == clientId)
{
return playerController.GetTeam();
}
}
}
return TeamType.Neutral;
}
/// <summary> /// <summary>
/// 클라이언트에게 안개 데이터 전송 /// 클라이언트에게 안개 데이터 전송
/// </summary> /// </summary>

View File

@@ -26,5 +26,10 @@ namespace Northbound
/// 현재 활성화 상태인지 /// 현재 활성화 상태인지
/// </summary> /// </summary>
bool IsActive(); bool IsActive();
/// <summary>
/// 소속 팀 (팀 시야 공유용)
/// </summary>
TeamType GetTeam();
} }
} }

View File

@@ -35,6 +35,7 @@ namespace Northbound
public float GetVisionRange() => _playerStats?.GetSight() ?? 10f; public float GetVisionRange() => _playerStats?.GetSight() ?? 10f;
public Transform GetTransform() => transform; public Transform GetTransform() => transform;
public bool IsActive() => IsSpawned; public bool IsActive() => IsSpawned;
public TeamType GetTeam() => _playerController?.GetTeam() ?? TeamType.Player;
private void OnDrawGizmosSelected() private void OnDrawGizmosSelected()
{ {