Mineable 블록에 대해 전장의 안개 추가
그림자 안나오는 문제도 해결
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user