Compare commits

...

4 Commits

Author SHA1 Message Date
a65ead915b Merge branch 'main' of http://192.168.10.102:30008/dal4segno/Northbound
# Conflicts:
#	Assets/Prefabs/Worker.prefab
2026-02-13 15:42:54 +09:00
925d74aa57 Worker 상호작용에 Cost 요구사항 제거 2026-02-13 15:41:47 +09:00
e2c40827bf 건물 Ghost가 다른 오브젝트와 충돌하여 밀어내지 않도록 함 2026-02-13 15:36:59 +09:00
a85f4d8fed 몬스터의 플레이어 추격 AI(임시)
코어를 향해 전진하는 도중, 사거리 내에 플레이어가 들어올 시 추격하도록 함
2026-02-13 15:31:10 +09:00
4 changed files with 23 additions and 29 deletions

View File

@@ -75,7 +75,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject
GlobalObjectIdHash: 1475696401
GlobalObjectIdHash: 4213269672
InScenePlacedSourceGlobalObjectIdHash: 0
DeferredDespawnTick: 0
Ownership: 1
@@ -106,7 +106,6 @@ MonoBehaviour:
followDistance: 5
movementSpeed: 5
resourcesPerMining: 5
recruitmentCost: 0
interactionAnimationTrigger:
miningEffectPrefab: {fileID: 0}
depositEffectPrefab: {fileID: 0}

View File

@@ -312,6 +312,12 @@ namespace Northbound
collider.enabled = false;
}
// Disable NavMeshObstacles in preview (they act as obstacles for NavMeshAgent)
foreach (var obstacle in previewObject.GetComponentsInChildren<UnityEngine.AI.NavMeshObstacle>())
{
obstacle.enabled = false;
}
Debug.Log($"[BuildingPlacement] 프리뷰 생성됨: {data.buildingName}");
}
@@ -528,6 +534,12 @@ namespace Northbound
collider.enabled = false;
}
// Disable NavMeshObstacles in preview (they act as obstacles for NavMeshAgent)
foreach (var obstacle in preview.GetComponentsInChildren<UnityEngine.AI.NavMeshObstacle>())
{
obstacle.enabled = false;
}
dragPreviewObjects.Add(preview);
if (isValid)

View File

@@ -154,6 +154,15 @@ namespace Northbound
if (_isRecalculatingPath) return; // 코루틴 대기 중이면 중단
if (_coreTransform == null) { FindCore(); return; }
// 0. Player 감지 (코어로 가는 도중에도 Player를 타겟팅)
GameObject detectedPlayer = DetectTarget();
if (detectedPlayer != null)
{
SetTargetPlayer(detectedPlayer);
TransitionToState(EnemyAIState.ChasePlayer);
return;
}
// 1. 코어로 가는 경로가 '완전(Complete)'한지 먼저 확인
// NavMesh가 갱신되었다면 에이전트는 즉시 Complete 상태가 됩니다.
if (_agent.hasPath && _agent.pathStatus == NavMeshPathStatus.PathComplete)

View File

@@ -21,7 +21,6 @@ namespace Northbound
public float followDistance = 3f;
public float movementSpeed = 3.5f;
public int resourcesPerMining = 5;
public int recruitmentCost = 10;
[Header("Interaction")]
public string interactionAnimationTrigger = "Recruit";
@@ -373,13 +372,6 @@ namespace Northbound
if (_ownerPlayerId.Value != ulong.MaxValue && _ownerPlayerId.Value != playerId)
return false;
if (_ownerPlayerId.Value == ulong.MaxValue)
{
var coreResourceManager = CoreResourceManager.Instance;
if (coreResourceManager != null && !coreResourceManager.CanAfford(recruitmentCost))
return false;
}
return true;
}
@@ -408,20 +400,6 @@ namespace Northbound
[Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)]
private void RecruitWorkerServerRpc(ulong playerId, ulong workerNetObjectId)
{
var coreResourceManager = CoreResourceManager.Instance;
if (coreResourceManager == null)
{
Debug.LogWarning("[Worker] CoreResourceManager 인스턴스를 찾을 수 없습니다.");
return;
}
if (!coreResourceManager.CanAfford(recruitmentCost))
{
Debug.LogWarning($"[Worker] 코어 자원이 부족합니다. 필요: {recruitmentCost}");
return;
}
coreResourceManager.SpendResources(recruitmentCost);
_ownerPlayerId.Value = playerId;
SetState(WorkerState.Following);
UpdatePlayerTransform();
@@ -463,11 +441,7 @@ namespace Northbound
{
if (_ownerPlayerId.Value == ulong.MaxValue)
{
var coreResourceManager = CoreResourceManager.Instance;
if (coreResourceManager != null && !coreResourceManager.CanAfford(recruitmentCost))
return $"Resource Required: {recruitmentCost})";
return $"[E] Recruit Worker: {recruitmentCost}";
return "[E] Recruit Worker";
}
else if (NetworkManager.Singleton != null && _ownerPlayerId.Value == NetworkManager.Singleton.LocalClientId)
{