From 443942f6ca45f04ce0eda3a4e7d123e5d16900d2 Mon Sep 17 00:00:00 2001 From: Dal4segno Date: Sat, 17 Jan 2026 15:58:42 +0900 Subject: [PATCH] =?UTF-8?q?=EC=95=84=EC=9D=B4=ED=85=9C=20=EB=93=9C?= =?UTF-8?q?=EB=9E=8D=20=EB=B0=8F=20=EC=9D=B8=EB=B2=A4=ED=86=A0=EB=A6=AC=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/DefaultNetworkPrefabs.asset | 5 + Assets/Item_Resource.asset | 18 ++ Assets/Item_Resource.asset.meta | 8 + Assets/Prefabs/GenericDroppedItem.prefab | 267 ++++++++++++++++++ Assets/Prefabs/GenericDroppedItem.prefab.meta | 7 + Assets/Prefabs/Player.prefab | 18 +- Assets/Prefabs/ResourceBlock.prefab | 6 +- Assets/Scenes/DefenceScene.unity | 55 +++- Assets/Scripts/GameBase/DroppedItem.cs | 109 +++++++ Assets/Scripts/GameBase/DroppedItem.cs.meta | 2 + Assets/Scripts/GameBase/ItemData.cs | 12 + Assets/Scripts/GameBase/ItemData.cs.meta | 2 + Assets/Scripts/GameBase/ItemDatabase.cs | 12 + Assets/Scripts/GameBase/ItemDatabase.cs.meta | 2 + Assets/Scripts/MineableBlock.cs | 26 +- Assets/Scripts/Player/ItemPickup.cs | 24 ++ Assets/Scripts/Player/ItemPickup.cs.meta | 2 + Assets/Scripts/Player/PlayerInventory.cs | 23 ++ Assets/Scripts/Player/PlayerInventory.cs.meta | 2 + ProjectSettings/DynamicsManager.asset | 2 +- ProjectSettings/TagManager.asset | 2 +- 21 files changed, 589 insertions(+), 15 deletions(-) create mode 100644 Assets/Item_Resource.asset create mode 100644 Assets/Item_Resource.asset.meta create mode 100644 Assets/Prefabs/GenericDroppedItem.prefab create mode 100644 Assets/Prefabs/GenericDroppedItem.prefab.meta create mode 100644 Assets/Scripts/GameBase/DroppedItem.cs create mode 100644 Assets/Scripts/GameBase/DroppedItem.cs.meta create mode 100644 Assets/Scripts/GameBase/ItemData.cs create mode 100644 Assets/Scripts/GameBase/ItemData.cs.meta create mode 100644 Assets/Scripts/GameBase/ItemDatabase.cs create mode 100644 Assets/Scripts/GameBase/ItemDatabase.cs.meta create mode 100644 Assets/Scripts/Player/ItemPickup.cs create mode 100644 Assets/Scripts/Player/ItemPickup.cs.meta create mode 100644 Assets/Scripts/Player/PlayerInventory.cs create mode 100644 Assets/Scripts/Player/PlayerInventory.cs.meta diff --git a/Assets/DefaultNetworkPrefabs.asset b/Assets/DefaultNetworkPrefabs.asset index 31db7b1..6046df1 100644 --- a/Assets/DefaultNetworkPrefabs.asset +++ b/Assets/DefaultNetworkPrefabs.asset @@ -79,3 +79,8 @@ MonoBehaviour: SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 1253970051563370359, guid: 1d7655b1088c3ea46b8f52f6c6760047, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} diff --git a/Assets/Item_Resource.asset b/Assets/Item_Resource.asset new file mode 100644 index 0000000..4f35bf4 --- /dev/null +++ b/Assets/Item_Resource.asset @@ -0,0 +1,18 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a6974a6b8e6365d469ae0566ed23abf5, type: 3} + m_Name: Item_Resource + m_EditorClassIdentifier: Assembly-CSharp::ItemData + itemID: 0 + itemName: Resource + icon: {fileID: -2861443707260385499, guid: 2d8756227812cb6418ddf659e94f7226, type: 3} + originalBlockPrefab: {fileID: 989066657509100432, guid: 17532917e1ada23469c573abf64905f0, type: 3} diff --git a/Assets/Item_Resource.asset.meta b/Assets/Item_Resource.asset.meta new file mode 100644 index 0000000..552ce24 --- /dev/null +++ b/Assets/Item_Resource.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 953ceca9a25978549a56f0a4ff5d6a2c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/GenericDroppedItem.prefab b/Assets/Prefabs/GenericDroppedItem.prefab new file mode 100644 index 0000000..f1bc03c --- /dev/null +++ b/Assets/Prefabs/GenericDroppedItem.prefab @@ -0,0 +1,267 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1253970051563370359 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6576339220651823204} + - component: {fileID: 563888218831231194} + - component: {fileID: 3836426729625921531} + - component: {fileID: 6291056385836363784} + - component: {fileID: 6380490795664845462} + - component: {fileID: 3712338024365698940} + m_Layer: 14 + m_Name: GenericDroppedItem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6576339220651823204 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1253970051563370359} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.66592, y: 2.86682, z: -4} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8170592411553038934} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &563888218831231194 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1253970051563370359} + 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: 720625276 + InScenePlacedSourceGlobalObjectIdHash: 720625276 + DeferredDespawnTick: 0 + Ownership: 1 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 0 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 + SyncOwnerTransformWhenParented: 1 + AllowOwnerToParent: 0 +--- !u!135 &3836426729625921531 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1253970051563370359} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &6291056385836363784 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1253970051563370359} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0f19261df3e7c984f89c3427aff0522a, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::DroppedItem + ShowTopMostFoldoutHeaderGroup: 1 + myFilter: {fileID: 8145339523266927793} + myRenderer: {fileID: 1476831640209354726} + dropScale: 0.3 + jumpForce: 2 + spreadForce: 1 + rotationSpeed: 100 +--- !u!54 &6380490795664845462 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1253970051563370359} + serializedVersion: 5 + m_Mass: 10 + m_LinearDamping: 0 + m_AngularDamping: 0.5 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 1 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!114 &3712338024365698940 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1253970051563370359} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.Components.NetworkTransform + ShowTopMostFoldoutHeaderGroup: 1 + NetworkTransformExpanded: 0 + AutoOwnerAuthorityTickOffset: 1 + PositionInterpolationType: 0 + RotationInterpolationType: 0 + ScaleInterpolationType: 0 + PositionLerpSmoothing: 1 + PositionMaxInterpolationTime: 0.1 + RotationLerpSmoothing: 1 + RotationMaxInterpolationTime: 0.1 + ScaleLerpSmoothing: 1 + ScaleMaxInterpolationTime: 0.1 + AuthorityMode: 0 + TickSyncChildren: 0 + UseUnreliableDeltas: 0 + SyncPositionX: 1 + SyncPositionY: 1 + SyncPositionZ: 1 + SyncRotAngleX: 1 + SyncRotAngleY: 1 + SyncRotAngleZ: 1 + SyncScaleX: 1 + SyncScaleY: 1 + SyncScaleZ: 1 + PositionThreshold: 0.001 + RotAngleThreshold: 0.01 + ScaleThreshold: 0.01 + UseQuaternionSynchronization: 0 + UseQuaternionCompression: 0 + UseHalfFloatPrecision: 0 + InLocalSpace: 0 + SwitchTransformSpaceWhenParented: 0 + Interpolate: 1 + SlerpPosition: 0 +--- !u!1 &5445318480987147192 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8170592411553038934} + - component: {fileID: 8145339523266927793} + - component: {fileID: 1476831640209354726} + m_Layer: 14 + m_Name: Visual + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8170592411553038934 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5445318480987147192} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6576339220651823204} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8145339523266927793 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5445318480987147192} + m_Mesh: {fileID: 0} +--- !u!23 &1476831640209354726 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5445318480987147192} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} diff --git a/Assets/Prefabs/GenericDroppedItem.prefab.meta b/Assets/Prefabs/GenericDroppedItem.prefab.meta new file mode 100644 index 0000000..f68f4c9 --- /dev/null +++ b/Assets/Prefabs/GenericDroppedItem.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1d7655b1088c3ea46b8f52f6c6760047 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Player.prefab b/Assets/Prefabs/Player.prefab index 817c403..8dd9e02 100644 --- a/Assets/Prefabs/Player.prefab +++ b/Assets/Prefabs/Player.prefab @@ -219,6 +219,9 @@ PrefabInstance: - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: ffaf1ddb2ff58d2448ccfdd357387f63, type: 3} insertIndex: -1 addedObject: {fileID: 4197956822729057335} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: ffaf1ddb2ff58d2448ccfdd357387f63, type: 3} + insertIndex: -1 + addedObject: {fileID: 5271692149337681293} m_SourcePrefab: {fileID: 100100000, guid: ffaf1ddb2ff58d2448ccfdd357387f63, type: 3} --- !u!4 &2152733048352974824 stripped Transform: @@ -335,7 +338,7 @@ MonoBehaviour: interactRange: 3 interactableLayer: serializedVersion: 2 - m_Bits: 9216 + m_Bits: 25600 constructionLayer: serializedVersion: 2 m_Bits: 256 @@ -435,6 +438,19 @@ MonoBehaviour: Synchronize: 1 ParameterType: 9 AnimatorParametersExpanded: 0 +--- !u!114 &5271692149337681293 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2473992278589500093} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a1edd64a97d0b4f4aa71f0a23f32564f, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::PlayerInventory + ShowTopMostFoldoutHeaderGroup: 1 --- !u!4 &5371267496600762819 stripped Transform: m_CorrespondingSourceObject: {fileID: 7214371169738337839, guid: ffaf1ddb2ff58d2448ccfdd357387f63, type: 3} diff --git a/Assets/Prefabs/ResourceBlock.prefab b/Assets/Prefabs/ResourceBlock.prefab index 8532851..a126232 100644 --- a/Assets/Prefabs/ResourceBlock.prefab +++ b/Assets/Prefabs/ResourceBlock.prefab @@ -128,8 +128,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} m_Name: m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 1191681468 - InScenePlacedSourceGlobalObjectIdHash: 3862515551 + GlobalObjectIdHash: 822699884 + InScenePlacedSourceGlobalObjectIdHash: 1191681468 DeferredDespawnTick: 0 Ownership: 1 AlwaysReplicateAsRoot: 0 @@ -155,6 +155,8 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::MineableBlock ShowTopMostFoldoutHeaderGroup: 1 maxHp: 100 + dropItemData: {fileID: 11400000, guid: 953ceca9a25978549a56f0a4ff5d6a2c, type: 2} + genericDropPrefab: {fileID: 1253970051563370359, guid: 1d7655b1088c3ea46b8f52f6c6760047, type: 3} shakeDuration: 0.1 shakeMagnitude: 0.1 --- !u!114 &-8077891763218709486 diff --git a/Assets/Scenes/DefenceScene.unity b/Assets/Scenes/DefenceScene.unity index d8c7ce2..4f8ee05 100644 --- a/Assets/Scenes/DefenceScene.unity +++ b/Assets/Scenes/DefenceScene.unity @@ -586,7 +586,7 @@ MeshCollider: m_ProvidesContacts: 0 m_Enabled: 1 serializedVersion: 5 - m_Convex: 0 + m_Convex: 1 m_CookingOptions: 30 m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} --- !u!23 &290482134 @@ -1312,6 +1312,7 @@ Transform: - {fileID: 1866217603} - {fileID: 412220987} - {fileID: 1842105546} + - {fileID: 931645607} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &707831773 @@ -1652,6 +1653,52 @@ PrefabInstance: insertIndex: -1 addedObject: {fileID: 445606027} m_SourcePrefab: {fileID: 100100000, guid: 443aa97110814434cb36b26656f1884c, type: 3} +--- !u!1 &931645606 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 931645607} + - component: {fileID: 931645608} + m_Layer: 0 + m_Name: ItemDatabase + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &931645607 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 931645606} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 670724422} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &931645608 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 931645606} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e1161d1386968b54483e219677fcc729, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::ItemDatabase + allItems: + - {fileID: 11400000, guid: 953ceca9a25978549a56f0a4ff5d6a2c, type: 2} --- !u!1 &1044242050 GameObject: m_ObjectHideFlags: 0 @@ -2448,10 +2495,6 @@ PrefabInstance: propertyPath: GlobalObjectIdHash value: 822699884 objectReference: {fileID: 0} - - target: {fileID: 7528764990365051674, guid: 17532917e1ada23469c573abf64905f0, type: 3} - propertyPath: InScenePlacedSourceGlobalObjectIdHash - value: 1191681468 - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -2833,7 +2876,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!4 &1842105546 Transform: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/GameBase/DroppedItem.cs b/Assets/Scripts/GameBase/DroppedItem.cs new file mode 100644 index 0000000..3828b3d --- /dev/null +++ b/Assets/Scripts/GameBase/DroppedItem.cs @@ -0,0 +1,109 @@ +using Unity.Netcode; +using UnityEngine; + +public class DroppedItem : NetworkBehaviour, IInteractable +{ + [SerializeField] private MeshFilter myFilter; // 자식의 MeshFilter 연결 + [SerializeField] private MeshRenderer myRenderer; // 자식의 MeshRenderer 연결 + [SerializeField] private float dropScale = 0.3f; + + private Rigidbody _rb; + [SerializeField] private float jumpForce = 5f; // 위로 솟구치는 힘 + [SerializeField] private float spreadForce = 2f; // 옆으로 퍼지는 힘 + [SerializeField] private float rotationSpeed = 100f; // 빙글빙글 도는 속도 + + private NetworkVariable _itemDataID = new NetworkVariable(); + private bool _isProcessed = false; // 중복 획득 방지 (서버용) + + private void Awake() + { + _rb = GetComponent(); + } + + public override void OnNetworkSpawn() + { + UpdateVisuals(); + _itemDataID.OnValueChanged += (oldVal, newVal) => UpdateVisuals(); + + if (IsServer) + { + ApplyInitialPop(); + } + } + + private void ApplyInitialPop() + { + // 위쪽 방향 + 무작위 주변 방향으로 힘을 줍니다. + Vector3 force = Vector3.up * jumpForce + Random.insideUnitSphere * spreadForce; + _rb.AddForce(force, ForceMode.Impulse); + + // 무작위 회전력(Torque)을 주어 던져지는 느낌을 냅니다. + _rb.AddTorque(Random.insideUnitSphere * spreadForce, ForceMode.Impulse); + } + + public void Initialize(int id) + { + if (IsServer) _itemDataID.Value = id; + } + + private void Update() + { + // 비주얼만 빙글빙글 돌게 하고 싶다면 (선택 사항) + transform.Rotate(Vector3.up * rotationSpeed * Time.deltaTime); + } + + private void UpdateVisuals() + { + ItemData data = ItemDatabase.Instance.GetItemByID(_itemDataID.Value); + + if (data != null && data.originalBlockPrefab != null) + { + // 원본 프리팹(큰 블록)에서 비주얼 컴포넌트를 찾습니다. + MeshFilter sourceFilter = data.originalBlockPrefab.GetComponentInChildren(); + MeshRenderer sourceRenderer = data.originalBlockPrefab.GetComponentInChildren(); + + if (sourceFilter != null && myFilter != null) + myFilter.sharedMesh = sourceFilter.sharedMesh; + + if (sourceRenderer != null && myRenderer != null) + myRenderer.sharedMaterial = sourceRenderer.sharedMaterial; + + // 크기를 작게 줄여서 아이템처럼 보이게 합니다. + transform.localScale = Vector3.one * dropScale; + } + } + + // 플레이어의 OnInteractTap에서 호출될 함수입니다. + public void Interact(GameObject interactor) + { + Debug.Log("[DroppedItem] 상호작용 시도됨"); + // 1. 상호작용한 플레이어가 본인(Owner)인지 확인합니다. + if (interactor.TryGetComponent(out var playerNetObj) && playerNetObj.IsOwner) + { + // 2. 서버에 이 아이템을 줍겠다고 요청합니다. + RequestPickupServerRpc(playerNetObj.NetworkObjectId); + Debug.Log("[DroppedItem] 아이템 획득 요청 서버 RPC 호출됨"); + } + } + + [Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)] + private void RequestPickupServerRpc(ulong playerNetId) + { + if (_isProcessed) return; + + // 서버에서 아이템 데이터를 가져오고 플레이어 인벤토리에 추가합니다. + if (NetworkManager.Singleton.SpawnManager.SpawnedObjects.TryGetValue(playerNetId, out var playerObj)) + { + if (playerObj.TryGetComponent(out var inventory)) + { + _isProcessed = true; + ItemData data = ItemDatabase.Instance.GetItemByID(_itemDataID.Value); + + inventory.AddItem(data); // 인벤토리에 추가 + + // 3. 획득 성공 시 네트워크 상에서 제거합니다. + GetComponent().Despawn(); + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/GameBase/DroppedItem.cs.meta b/Assets/Scripts/GameBase/DroppedItem.cs.meta new file mode 100644 index 0000000..c80ab64 --- /dev/null +++ b/Assets/Scripts/GameBase/DroppedItem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0f19261df3e7c984f89c3427aff0522a \ No newline at end of file diff --git a/Assets/Scripts/GameBase/ItemData.cs b/Assets/Scripts/GameBase/ItemData.cs new file mode 100644 index 0000000..55cdb24 --- /dev/null +++ b/Assets/Scripts/GameBase/ItemData.cs @@ -0,0 +1,12 @@ +using UnityEngine; + +[CreateAssetMenu(fileName = "New Item", menuName = "Inventory/Item")] +public class ItemData : ScriptableObject +{ + public int itemID; + public string itemName; + public Sprite icon; + + [Header("Visual Source")] + public GameObject originalBlockPrefab; // 이제 이것만 있으면 됩니다! +} \ No newline at end of file diff --git a/Assets/Scripts/GameBase/ItemData.cs.meta b/Assets/Scripts/GameBase/ItemData.cs.meta new file mode 100644 index 0000000..a2478eb --- /dev/null +++ b/Assets/Scripts/GameBase/ItemData.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a6974a6b8e6365d469ae0566ed23abf5 \ No newline at end of file diff --git a/Assets/Scripts/GameBase/ItemDatabase.cs b/Assets/Scripts/GameBase/ItemDatabase.cs new file mode 100644 index 0000000..cfdcb97 --- /dev/null +++ b/Assets/Scripts/GameBase/ItemDatabase.cs @@ -0,0 +1,12 @@ +using UnityEngine; +using System.Collections.Generic; + +public class ItemDatabase : MonoBehaviour +{ + public static ItemDatabase Instance; + public List allItems; + + void Awake() => Instance = this; + + public ItemData GetItemByID(int id) => allItems.Find(x => x.itemID == id); +} \ No newline at end of file diff --git a/Assets/Scripts/GameBase/ItemDatabase.cs.meta b/Assets/Scripts/GameBase/ItemDatabase.cs.meta new file mode 100644 index 0000000..81826a7 --- /dev/null +++ b/Assets/Scripts/GameBase/ItemDatabase.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e1161d1386968b54483e219677fcc729 \ No newline at end of file diff --git a/Assets/Scripts/MineableBlock.cs b/Assets/Scripts/MineableBlock.cs index 1378238..3868e46 100644 --- a/Assets/Scripts/MineableBlock.cs +++ b/Assets/Scripts/MineableBlock.cs @@ -1,6 +1,7 @@ +using NUnit.Framework.Interfaces; +using System.Collections; using Unity.Netcode; using UnityEngine; -using System.Collections; public class MineableBlock : NetworkBehaviour { @@ -9,6 +10,8 @@ public class MineableBlock : NetworkBehaviour // [동기화] 모든 플레이어가 동일한 블록 체력을 보게 함 private NetworkVariable _currentHp = new NetworkVariable(); + [SerializeField] private ItemData dropItemData; + [SerializeField] private GameObject genericDropPrefab; // 여기에 위에서 만든 'GenericDroppedItem' 프리팹을 넣으세요. [Header("Visuals")] private Outline _outline; @@ -60,6 +63,7 @@ public class MineableBlock : NetworkBehaviour private void DestroyBlock() { + DropItem(); // 2. 서버에서 네트워크 오브젝트 제거 (모든 클라이언트에서 사라짐) GetComponent().Despawn(); } @@ -84,8 +88,6 @@ public class MineableBlock : NetworkBehaviour private IEnumerator ShakeRoutine() { float elapsed = 0.0f; - Debug.Log("흔들림 코루틴 시작"); // 시작 확인 - while (elapsed < shakeDuration) { Vector3 randomOffset = Random.insideUnitSphere * shakeMagnitude; @@ -99,6 +101,22 @@ public class MineableBlock : NetworkBehaviour } transform.localPosition = _originalPos; - Debug.Log("흔들림 코루틴 종료 및 위치 복구"); + } + + private void DropItem() + { + if (!IsServer || dropItemData == null || genericDropPrefab == null) return; + + // 원본 블록이 아니라 '범용 컨테이너'를 소환합니다. + GameObject dropObj = Instantiate(genericDropPrefab, transform.position + Vector3.up * 0.5f, Quaternion.identity); + + NetworkObject netObj = dropObj.GetComponent(); + netObj.Spawn(); + + // 소환된 컨테이너에 "너는 어떤 아이템의 모양을 따라해야 해"라고 알려줍니다. + if (dropObj.TryGetComponent(out var droppedItem)) + { + droppedItem.Initialize(dropItemData.itemID); + } } } \ No newline at end of file diff --git a/Assets/Scripts/Player/ItemPickup.cs b/Assets/Scripts/Player/ItemPickup.cs new file mode 100644 index 0000000..5c95b87 --- /dev/null +++ b/Assets/Scripts/Player/ItemPickup.cs @@ -0,0 +1,24 @@ +using Unity.Netcode; +using UnityEngine; + +public class ItemPickup : NetworkBehaviour +{ + public ItemData itemData; + + public void SetItem(ItemData data) => itemData = data; + + private void OnTriggerEnter(Collider medical) + { + if (!IsServer) return; + + // 플레이어인지 확인 + if (medical.CompareTag("Player")) + { + if (medical.TryGetComponent(out var inventory)) + { + inventory.AddItem(itemData); + GetComponent().Despawn(); // 먹었으므로 제거 + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Player/ItemPickup.cs.meta b/Assets/Scripts/Player/ItemPickup.cs.meta new file mode 100644 index 0000000..30643de --- /dev/null +++ b/Assets/Scripts/Player/ItemPickup.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1e494b2626c9e354eba277618a850ee8 \ No newline at end of file diff --git a/Assets/Scripts/Player/PlayerInventory.cs b/Assets/Scripts/Player/PlayerInventory.cs new file mode 100644 index 0000000..510910e --- /dev/null +++ b/Assets/Scripts/Player/PlayerInventory.cs @@ -0,0 +1,23 @@ +using Unity.Netcode; +using UnityEngine; +using System.Collections.Generic; + +public class PlayerInventory : NetworkBehaviour +{ + // 아이템 이름과 개수를 저장 + private Dictionary items = new Dictionary(); + + public void AddItem(ItemData data) + { + if (!IsServer) return; + + if (items.ContainsKey(data.itemName)) + items[data.itemName]++; + else + items.Add(data.itemName, 1); + + Debug.Log($"[Inventory] {data.itemName} 획득! (현재: {items[data.itemName]}개)"); + + // 여기서 클라이언트 UI를 갱신하는 ClientRpc를 호출할 수 있습니다. + } +} \ No newline at end of file diff --git a/Assets/Scripts/Player/PlayerInventory.cs.meta b/Assets/Scripts/Player/PlayerInventory.cs.meta new file mode 100644 index 0000000..d7510dd --- /dev/null +++ b/Assets/Scripts/Player/PlayerInventory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a1edd64a97d0b4f4aa71f0a23f32564f \ No newline at end of file diff --git a/ProjectSettings/DynamicsManager.asset b/ProjectSettings/DynamicsManager.asset index eb777c1..2b0cd22 100644 --- a/ProjectSettings/DynamicsManager.asset +++ b/ProjectSettings/DynamicsManager.asset @@ -17,7 +17,7 @@ PhysicsManager: m_EnableAdaptiveForce: 0 m_ClothInterCollisionDistance: 0.1 m_ClothInterCollisionStiffness: 0.2 - m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffffffffffffbfffffffffffffffffffffffffffffffffffffffbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff m_SimulationMode: 0 m_AutoSyncTransforms: 0 m_ReuseCollisionCallbacks: 1 diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset index 5d0a273..c0d4079 100644 --- a/ProjectSettings/TagManager.asset +++ b/ProjectSettings/TagManager.asset @@ -22,7 +22,7 @@ TagManager: - Tunnel - Mineable - TunnelNode - - + - DroppedItem - - -