Mineable 블록에 대해 전장의 안개 추가

그림자 안나오는 문제도 해결
This commit is contained in:
2026-01-17 20:14:12 +09:00
parent 443942f6ca
commit 8369e4d42f
47 changed files with 1991 additions and 2730 deletions

View File

@@ -19,6 +19,8 @@ public class PlayerNetworkController : NetworkBehaviour
[SerializeField] private LayerMask interactableLayer;
[SerializeField] private LayerMask constructionLayer;
[SerializeField] private float buildSpeedMultiplier = 2f;
[SerializeField] private float pickupRadius = 1.5f; // 줍기 인식 범위
[SerializeField] private LayerMask itemLayer; // DroppedItem 레이어 설정
[Header("Mining Settings")]
[SerializeField] private float attackRange = 3.5f;
@@ -32,6 +34,11 @@ public class PlayerNetworkController : NetworkBehaviour
[SerializeField] private UnityEngine.UI.Image crosshairUI;
[SerializeField] private Sprite idleCrosshair;
[SerializeField] private Sprite targetCrosshair;
[Header("Fog of War Settings")]
[SerializeField] private float visionRadius = 5f; // 시야 반경
private float _lastRevealTime;
private RectTransform _crosshairRect;
private MineableBlock _currentTargetBlock; // 현재 강조 중인 블록 저장
private MineableBlock _lastHighlightedBlock;
@@ -110,6 +117,13 @@ public class PlayerNetworkController : NetworkBehaviour
UpdateCrosshairPosition(); // 이 안에서 움직여야 합니다.
UpdateTargetFeedback();
// 매 프레임 실행하면 무거우므로 0.2초마다 주변 시야 갱신
if (Time.time - _lastRevealTime > 0.2f)
{
_lastRevealTime = Time.time;
RevealSurroundings();
}
}
// --- 이동 관련 로직 (기존 유지) ---
@@ -355,6 +369,39 @@ public class PlayerNetworkController : NetworkBehaviour
}
}
private void RevealSurroundings()
{
// 시야 반경 내의 블록 감지
Collider[] hitBlocks = Physics.OverlapSphere(transform.position, visionRadius, mineableLayer);
foreach (var col in hitBlocks)
{
if (col.TryGetComponent<MineableBlock>(out var block))
{
// 1. [로컬] 내 화면에서 이 블록을 보이게 함 (실시간 시야)
block.UpdateLocalVisibility();
// 2. [서버] 아직 발견 안 된 블록이라면 서버에 알림 (공유 안개 해제)
if (IsOwner)
{
RequestRevealServerRpc(block.GetComponent<NetworkObject>().NetworkObjectId);
}
}
}
}
[ServerRpc]
private void RequestRevealServerRpc(ulong blockNetId)
{
if (NetworkManager.Singleton.SpawnManager.SpawnedObjects.TryGetValue(blockNetId, out var netObj))
{
if (netObj.TryGetComponent<MineableBlock>(out var block))
{
block.RevealBlock(); // 서버가 블록 상태를 true로 변경
}
}
}
private void OnDrawGizmos()
{
if (!Application.isPlaying || !IsOwner) return;