diff --git a/Assets/DefaultNetworkPrefabs.asset b/Assets/DefaultNetworkPrefabs.asset index 99381b2..5388f8c 100644 --- a/Assets/DefaultNetworkPrefabs.asset +++ b/Assets/DefaultNetworkPrefabs.asset @@ -114,3 +114,28 @@ MonoBehaviour: SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 7245241003860522441, guid: 2c33c67d086286d4a929d533b4e26863, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 7867287811520877109, guid: 915c4daebc2463840b83193366491ba1, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 1559926009631082787, guid: 4ade932e47f340647ac833f7188a6dd0, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 4345146930867537194, guid: d754e5f1f9047ce428c55a0ae1975b4e, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 7773749726967315046, guid: b49d9f4b44d4c7d4b92498e95c847667, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} diff --git a/Assets/Prefabs/Obstacles/Rock1.prefab b/Assets/Prefabs/Obstacles/Rock1.prefab index e1d764b..7dbc1ba 100644 --- a/Assets/Prefabs/Obstacles/Rock1.prefab +++ b/Assets/Prefabs/Obstacles/Rock1.prefab @@ -10,6 +10,7 @@ GameObject: m_Component: - component: {fileID: 6371576195603730939} - component: {fileID: -3907047637289204963} + - component: {fileID: -8721167865250746961} m_Layer: 10 m_Name: Rock1 m_TagString: Untagged @@ -48,9 +49,36 @@ MonoBehaviour: showInExploredAreas: 1 updateInterval: 0.2 renderers: [] - debugLogging: 1 + enableDistantVisibility: 1 + heightVisibilityMultiplier: 2 + minHeightForDistantVisibility: 3 useExploredMaterial: 0 exploredMaterial: {fileID: 0} +--- !u!114 &-8721167865250746961 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7867287811520877109} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject + GlobalObjectIdHash: 0 + InScenePlacedSourceGlobalObjectIdHash: 0 + DeferredDespawnTick: 0 + Ownership: 1 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 1 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 + SyncOwnerTransformWhenParented: 1 + AllowOwnerToParent: 0 --- !u!1001 &276409350290535739 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/Obstacles/Rock2.prefab b/Assets/Prefabs/Obstacles/Rock2.prefab index 01e27e3..8b21e9c 100644 --- a/Assets/Prefabs/Obstacles/Rock2.prefab +++ b/Assets/Prefabs/Obstacles/Rock2.prefab @@ -10,6 +10,7 @@ GameObject: m_Component: - component: {fileID: 5791990943856352332} - component: {fileID: 6386629597168169889} + - component: {fileID: 4283595864140016680} m_Layer: 10 m_Name: Rock2 m_TagString: Untagged @@ -48,9 +49,36 @@ MonoBehaviour: showInExploredAreas: 1 updateInterval: 0.2 renderers: [] - debugLogging: 1 + enableDistantVisibility: 1 + heightVisibilityMultiplier: 2 + minHeightForDistantVisibility: 3 useExploredMaterial: 0 exploredMaterial: {fileID: 0} +--- !u!114 &4283595864140016680 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7245241003860522441} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject + GlobalObjectIdHash: 0 + InScenePlacedSourceGlobalObjectIdHash: 0 + DeferredDespawnTick: 0 + Ownership: 1 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 1 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 + SyncOwnerTransformWhenParented: 1 + AllowOwnerToParent: 0 --- !u!1001 &1439609661864653002 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/Obstacles/Rock3.prefab b/Assets/Prefabs/Obstacles/Rock3.prefab index 862448f..175f081 100644 --- a/Assets/Prefabs/Obstacles/Rock3.prefab +++ b/Assets/Prefabs/Obstacles/Rock3.prefab @@ -10,6 +10,7 @@ GameObject: m_Component: - component: {fileID: 5832127839780190644} - component: {fileID: 6163423706184354979} + - component: {fileID: 6341284887249651874} m_Layer: 10 m_Name: Rock3 m_TagString: Untagged @@ -48,9 +49,36 @@ MonoBehaviour: showInExploredAreas: 1 updateInterval: 0.2 renderers: [] - debugLogging: 1 + enableDistantVisibility: 1 + heightVisibilityMultiplier: 2 + minHeightForDistantVisibility: 3 useExploredMaterial: 0 exploredMaterial: {fileID: 0} +--- !u!114 &6341284887249651874 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7773749726967315046} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject + GlobalObjectIdHash: 0 + InScenePlacedSourceGlobalObjectIdHash: 0 + DeferredDespawnTick: 0 + Ownership: 1 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 1 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 + SyncOwnerTransformWhenParented: 1 + AllowOwnerToParent: 0 --- !u!1001 &8592066193955497239 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/Obstacles/Tree1.prefab b/Assets/Prefabs/Obstacles/Tree1.prefab index f3263b4..1215eb5 100644 --- a/Assets/Prefabs/Obstacles/Tree1.prefab +++ b/Assets/Prefabs/Obstacles/Tree1.prefab @@ -11,6 +11,7 @@ GameObject: - component: {fileID: 7011000049316995908} - component: {fileID: 1948217933253124379} - component: {fileID: 1861572095783484933} + - component: {fileID: 383497841330268597} m_Layer: 10 m_Name: Tree1 m_TagString: Untagged @@ -70,9 +71,36 @@ MonoBehaviour: showInExploredAreas: 1 updateInterval: 0.2 renderers: [] - debugLogging: 1 + enableDistantVisibility: 1 + heightVisibilityMultiplier: 2 + minHeightForDistantVisibility: 3 useExploredMaterial: 0 exploredMaterial: {fileID: 0} +--- !u!114 &383497841330268597 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1559926009631082787} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject + GlobalObjectIdHash: 0 + InScenePlacedSourceGlobalObjectIdHash: 0 + DeferredDespawnTick: 0 + Ownership: 1 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 1 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 + SyncOwnerTransformWhenParented: 1 + AllowOwnerToParent: 0 --- !u!1001 &6713237626157896158 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/Obstacles/Tree2.prefab b/Assets/Prefabs/Obstacles/Tree2.prefab index a814579..621c4ba 100644 --- a/Assets/Prefabs/Obstacles/Tree2.prefab +++ b/Assets/Prefabs/Obstacles/Tree2.prefab @@ -11,6 +11,7 @@ GameObject: - component: {fileID: 2594114534543661658} - component: {fileID: 6161783292885910878} - component: {fileID: 5630203293812958152} + - component: {fileID: 2966181383853663289} m_Layer: 10 m_Name: Tree2 m_TagString: Untagged @@ -70,9 +71,36 @@ MonoBehaviour: showInExploredAreas: 1 updateInterval: 0.2 renderers: [] - debugLogging: 1 + enableDistantVisibility: 1 + heightVisibilityMultiplier: 2 + minHeightForDistantVisibility: 3 useExploredMaterial: 0 exploredMaterial: {fileID: 0} +--- !u!114 &2966181383853663289 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4345146930867537194} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject + GlobalObjectIdHash: 0 + InScenePlacedSourceGlobalObjectIdHash: 0 + DeferredDespawnTick: 0 + Ownership: 1 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 1 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 + SyncOwnerTransformWhenParented: 1 + AllowOwnerToParent: 0 --- !u!1001 &7745148207212772657 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Scenes/GameMain.unity b/Assets/Scenes/GameMain.unity index d569a03..43ad18e 100644 --- a/Assets/Scenes/GameMain.unity +++ b/Assets/Scenes/GameMain.unity @@ -2009,6 +2009,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 1572384099} + - component: {fileID: 1572384100} - component: {fileID: 1572384098} m_Layer: 0 m_Name: ObstacleSpawner @@ -2029,6 +2030,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a889d8fab7aeaa24dbbffaee2f02ba54, type: 3} m_Name: m_EditorClassIdentifier: Assembly-CSharp::Northbound.ObstacleSpawner + ShowTopMostFoldoutHeaderGroup: 1 spawnCenter: {fileID: 0} spawnAreaSize: {x: 80, y: 725} areaShape: 0 @@ -2082,6 +2084,31 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1572384100 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1572384097} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject + GlobalObjectIdHash: 2866586184 + InScenePlacedSourceGlobalObjectIdHash: 0 + DeferredDespawnTick: 0 + Ownership: 1 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 0 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 + SyncOwnerTransformWhenParented: 1 + AllowOwnerToParent: 0 --- !u!1 &1701756764 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/ObstacleSpawner.cs b/Assets/Scripts/ObstacleSpawner.cs index 3af84d8..853da1f 100644 --- a/Assets/Scripts/ObstacleSpawner.cs +++ b/Assets/Scripts/ObstacleSpawner.cs @@ -1,12 +1,13 @@ using UnityEngine; using System.Collections.Generic; +using Unity.Netcode; #if UNITY_EDITOR using UnityEditor; #endif namespace Northbound { - public class ObstacleSpawner : MonoBehaviour + public class ObstacleSpawner : NetworkBehaviour { [System.Serializable] public class ObstacleEntry @@ -89,9 +90,9 @@ namespace Northbound Circle } - private void Start() + public override void OnNetworkSpawn() { - if (spawnOnStart) + if (IsServer && spawnOnStart) { SpawnObstacles(); } @@ -102,6 +103,12 @@ namespace Northbound /// public void SpawnObstacles() { + if (!IsServer) + { + Debug.LogWarning("[ObstacleSpawner] Only server can spawn obstacles!"); + return; + } + ClearObstacles(); _spawnedPositions.Clear(); @@ -236,17 +243,12 @@ namespace Northbound } // 장애물 생성 - Quaternion rotation = randomRotation - ? Quaternion.Euler(0, Random.Range(0f, 360f), 0) + Quaternion rotation = randomRotation + ? Quaternion.Euler(0, Random.Range(0f, 360f), 0) : Quaternion.identity; GameObject obstacle = Instantiate(obstacleEntry.prefab, randomPos, rotation); - if (groupUnderParent && _obstacleParent != null) - { - obstacle.transform.SetParent(_obstacleParent); - } - // 크기 변화 if (scaleVariation > 0) { @@ -254,11 +256,26 @@ namespace Northbound obstacle.transform.localScale *= scale; } + // Add NetworkObject component if not exists + NetworkObject networkObj = obstacle.GetComponent(); + if (networkObj == null) + { + networkObj = obstacle.AddComponent(); + } + + if (groupUnderParent && _obstacleParent != null) + { + obstacle.transform.SetParent(_obstacleParent); + } + + // Spawn on network + networkObj.Spawn(); + // Add FogOfWarVisibility component to hide obstacles in unexplored areas if (obstacle.GetComponent() == null) { var visibility = obstacle.AddComponent(); - visibility.showInExploredAreas = false; // Obstacles hidden when not visible + visibility.showInExploredAreas = false; visibility.updateInterval = 0.2f; } @@ -359,6 +376,15 @@ namespace Northbound { if (_obstacleParent != null) { + foreach (Transform child in _obstacleParent) + { + NetworkObject networkObj = child.GetComponent(); + if (networkObj != null && networkObj.IsSpawned) + { + networkObj.Despawn(true); + } + } + if (Application.isPlaying) { Destroy(_obstacleParent.gameObject);