인터랙션 시스템 및 터널 기능 생성

This commit is contained in:
2026-01-15 16:45:14 +09:00
parent f70223a4aa
commit b8ecb9a24c
12 changed files with 959 additions and 37 deletions

View File

@@ -116,14 +116,14 @@ public partial class @PlayerInputActions: IInputActionCollection2, IDisposable
""id"": ""852140f2-7766-474d-8707-702459ba45f3"",
""expectedControlType"": """",
""processors"": """",
""interactions"": ""Hold"",
""interactions"": """",
""initialStateCheck"": false
},
{
""name"": ""Crouch"",
""type"": ""Button"",
""id"": ""27c5f898-bc57-4ee1-8800-db469aca5fe3"",
""expectedControlType"": ""Button"",
""expectedControlType"": """",
""processors"": """",
""interactions"": """",
""initialStateCheck"": false

View File

@@ -30,14 +30,14 @@
"id": "852140f2-7766-474d-8707-702459ba45f3",
"expectedControlType": "",
"processors": "",
"interactions": "Hold",
"interactions": "",
"initialStateCheck": false
},
{
"name": "Crouch",
"type": "Button",
"id": "27c5f898-bc57-4ee1-8800-db469aca5fe3",
"expectedControlType": "Button",
"expectedControlType": "",
"processors": "",
"interactions": "",
"initialStateCheck": false

View File

@@ -0,0 +1,261 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &5334341810660213834
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5524516627708568918}
- component: {fileID: 8060172296368980519}
- component: {fileID: 3945124241373782966}
m_Layer: 10
m_Name: TunnelNodeB
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &5524516627708568918
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5334341810660213834}
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: 7892781535212668078}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &8060172296368980519
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5334341810660213834}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 275306f282948c343bf20ee884ad22b8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::TunnelNode
connectedNode: {fileID: 0}
otherEndOfThisSegment: {fileID: 2320767985316498782}
detectionRadius: 0.5
tunnelLayer:
serializedVersion: 2
m_Bits: 1024
--- !u!65 &3945124241373782966
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5334341810660213834}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}
--- !u!1 &5462246585413302240
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4703568612144557396}
- component: {fileID: 2320767985316498782}
- component: {fileID: 2292926820231089492}
m_Layer: 10
m_Name: TunnelNodeA
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4703568612144557396
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5462246585413302240}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -3, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7892781535212668078}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &2320767985316498782
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5462246585413302240}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 275306f282948c343bf20ee884ad22b8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::TunnelNode
connectedNode: {fileID: 0}
otherEndOfThisSegment: {fileID: 8060172296368980519}
detectionRadius: 0.5
tunnelLayer:
serializedVersion: 2
m_Bits: 1024
--- !u!65 &2292926820231089492
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5462246585413302240}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}
--- !u!1 &7817822323996939414
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7892781535212668078}
- component: {fileID: 1090720987273437667}
- component: {fileID: 2921653441481381272}
- component: {fileID: 5176949106980054761}
m_Layer: 0
m_Name: Tunnel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7892781535212668078
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7817822323996939414}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0.5, z: 0}
m_LocalScale: {x: 1, y: 2, z: 2}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 4703568612144557396}
- {fileID: 5524516627708568918}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &1090720987273437667
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7817822323996939414}
m_Mesh: {fileID: 4300000, guid: 791bea6128e52074ab5677f405e2d4d0, type: 3}
--- !u!23 &2921653441481381272
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7817822323996939414}
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: 2100000, guid: 25af05085d2957e42ac6b80b69ddd26a, type: 2}
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}
--- !u!64 &5176949106980054761
MeshCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7817822323996939414}
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: 5
m_Convex: 1
m_CookingOptions: 30
m_Mesh: {fileID: 4300000, guid: 791bea6128e52074ab5677f405e2d4d0, type: 3}

View File

@@ -677,6 +677,152 @@ MonoBehaviour:
m_MinRegionArea: 2
m_NavMeshData: {fileID: 23800000, guid: 2d822e23a760f3943a3174a0d27b4254, type: 2}
m_BuildHeightMesh: 0
--- !u!1 &342345820
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 342345821}
- component: {fileID: 342345825}
- component: {fileID: 342345824}
- component: {fileID: 342345823}
- component: {fileID: 342345822}
m_Layer: 7
m_Name: DungeonBase
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!4 &342345821
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 342345820}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -9, y: -8, z: 0}
m_LocalScale: {x: 10, y: 2, z: 6}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 743367988}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &342345822
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 342345820}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7a5ac11cc976e418e8d13136b07e1f52, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.AI.Navigation::Unity.AI.Navigation.NavMeshSurface
m_SerializedVersion: 0
m_AgentTypeID: 0
m_CollectObjects: 0
m_Size: {x: 10, y: 10, z: 10}
m_Center: {x: 0, y: 2, z: 0}
m_LayerMask:
serializedVersion: 2
m_Bits: 4294967295
m_UseGeometry: 0
m_DefaultArea: 0
m_GenerateLinks: 0
m_IgnoreNavMeshAgent: 1
m_IgnoreNavMeshObstacle: 1
m_OverrideTileSize: 0
m_TileSize: 256
m_OverrideVoxelSize: 0
m_VoxelSize: 0.016666668
m_MinRegionArea: 2
m_NavMeshData: {fileID: 0}
m_BuildHeightMesh: 0
--- !u!64 &342345823
MeshCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 342345820}
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: 5
m_Convex: 0
m_CookingOptions: 30
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &342345824
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 342345820}
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: 2100000, guid: a3cd22eceea5e8548b10cdb5d9b49a25, type: 2}
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}
--- !u!33 &342345825
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 342345820}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!4 &372588680 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 6438027004378685690, guid: 2bb7e098e271eb44a873c856dbf59c7c, type: 3}
@@ -801,11 +947,11 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 2338240775821095493, guid: 1955bdf7dd2940f44aa117fbcf6eb626, type: 3}
propertyPath: m_LocalPosition.x
value: -8
value: -7
objectReference: {fileID: 0}
- target: {fileID: 2338240775821095493, guid: 1955bdf7dd2940f44aa117fbcf6eb626, type: 3}
propertyPath: m_LocalPosition.y
value: 0.5
value: 0.1
objectReference: {fileID: 0}
- target: {fileID: 2338240775821095493, guid: 1955bdf7dd2940f44aa117fbcf6eb626, type: 3}
propertyPath: m_LocalPosition.z
@@ -1114,6 +1260,63 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 599851509}
m_CullTransparentMesh: 1
--- !u!1001 &613577505
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 7817822323996939414, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_Name
value: Tunnel
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalPosition.x
value: -9
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalPosition.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalRotation.w
value: 0.7071068
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalRotation.z
value: 0.7071068
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 90
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
--- !u!1 &621471626
GameObject:
m_ObjectHideFlags: 0
@@ -1129,6 +1332,8 @@ GameObject:
- component: {fileID: 621471631}
- component: {fileID: 621471635}
- component: {fileID: 621471634}
- component: {fileID: 621471636}
- component: {fileID: 621471637}
m_Layer: 9
m_Name: Player
m_TagString: Player
@@ -1145,7 +1350,7 @@ Transform:
m_GameObject: {fileID: 621471626}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 5, z: 0}
m_LocalPosition: {x: -8, y: 3, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
@@ -1259,6 +1464,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::PlayerMovement
moveSpeed: 5
jumpHeight: 1.5
gravity: -19.62
--- !u!143 &621471635
CharacterController:
@@ -1285,6 +1491,39 @@ CharacterController:
m_SkinWidth: 0.08
m_MinMoveDistance: 0.001
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &621471636
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 621471626}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 736c03e837e6b074ba7f90b813050aed, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::PlayerInteractionController
range: 1
interactableLayer:
serializedVersion: 2
m_Bits: 1024
constructionLayer:
serializedVersion: 2
m_Bits: 256
buildSpeedMultiplier: 2
--- !u!114 &621471637
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 621471626}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d71ce06d133743140877345b807f33ad, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::TunnelTraveler
travelSpeed: 5
--- !u!1 &670724421
GameObject:
m_ObjectHideFlags: 0
@@ -1461,6 +1700,7 @@ Transform:
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 290482132}
- {fileID: 342345821}
- {fileID: 445606026}
- {fileID: 372588680}
- {fileID: 2084947170}
@@ -1601,7 +1841,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 1524868319650946676, guid: 443aa97110814434cb36b26656f1884c, type: 3}
propertyPath: m_LocalPosition.x
value: -11
value: -12
objectReference: {fileID: 0}
- target: {fileID: 1524868319650946676, guid: 443aa97110814434cb36b26656f1884c, type: 3}
propertyPath: m_LocalPosition.y
@@ -1962,11 +2202,11 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 2338240775821095493, guid: 1955bdf7dd2940f44aa117fbcf6eb626, type: 3}
propertyPath: m_LocalPosition.x
value: -3
value: -4
objectReference: {fileID: 0}
- target: {fileID: 2338240775821095493, guid: 1955bdf7dd2940f44aa117fbcf6eb626, type: 3}
propertyPath: m_LocalPosition.y
value: 0.5
value: 0.1
objectReference: {fileID: 0}
- target: {fileID: 2338240775821095493, guid: 1955bdf7dd2940f44aa117fbcf6eb626, type: 3}
propertyPath: m_LocalPosition.z
@@ -2779,6 +3019,63 @@ Transform:
m_CorrespondingSourceObject: {fileID: 2338240775821095493, guid: 1955bdf7dd2940f44aa117fbcf6eb626, type: 3}
m_PrefabInstance: {fileID: 497942047}
m_PrefabAsset: {fileID: 0}
--- !u!1001 &2144751143
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 7817822323996939414, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_Name
value: Tunnel (1)
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalPosition.x
value: -9
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalPosition.y
value: -2.5
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalRotation.w
value: 0.7071068
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalRotation.z
value: 0.7071068
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7892781535212668078, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 90
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 48bf40d31e903d34f9469451d7de06dd, type: 3}
--- !u!1001 &3690888448170635710
PrefabInstance:
m_ObjectHideFlags: 0
@@ -2789,15 +3086,27 @@ PrefabInstance:
m_Modifications:
- target: {fileID: 1908074291664802429, guid: 2b08dd32e48ef5e4aa65a6122099152e, type: 3}
propertyPath: m_LocalPosition.x
value: 3.53023
value: -4.46977
objectReference: {fileID: 0}
- target: {fileID: 1908074291664802429, guid: 2b08dd32e48ef5e4aa65a6122099152e, type: 3}
propertyPath: m_LocalPosition.y
value: 18
value: 6
objectReference: {fileID: 0}
- target: {fileID: 1908074291664802429, guid: 2b08dd32e48ef5e4aa65a6122099152e, type: 3}
propertyPath: m_LocalPosition.z
value: -4.59703
value: -7.59703
objectReference: {fileID: 0}
- target: {fileID: 1908074291664802429, guid: 2b08dd32e48ef5e4aa65a6122099152e, type: 3}
propertyPath: m_LocalRotation.w
value: 0.9659258
objectReference: {fileID: 0}
- target: {fileID: 1908074291664802429, guid: 2b08dd32e48ef5e4aa65a6122099152e, type: 3}
propertyPath: m_LocalRotation.x
value: 0.2588191
objectReference: {fileID: 0}
- target: {fileID: 1908074291664802429, guid: 2b08dd32e48ef5e4aa65a6122099152e, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 30
objectReference: {fileID: 0}
- target: {fileID: 2106659674514999703, guid: 2b08dd32e48ef5e4aa65a6122099152e, type: 3}
propertyPath: m_LocalPosition.x
@@ -2849,15 +3158,31 @@ PrefabInstance:
objectReference: {fileID: 621471627}
- target: {fileID: 4415413950589506134, guid: 2b08dd32e48ef5e4aa65a6122099152e, type: 3}
propertyPath: m_LocalPosition.x
value: 3.53023
value: -4.46977
objectReference: {fileID: 0}
- target: {fileID: 4415413950589506134, guid: 2b08dd32e48ef5e4aa65a6122099152e, type: 3}
propertyPath: m_LocalPosition.y
value: 18
value: 6
objectReference: {fileID: 0}
- target: {fileID: 4415413950589506134, guid: 2b08dd32e48ef5e4aa65a6122099152e, type: 3}
propertyPath: m_LocalPosition.z
value: -4.59703
value: -7.59703
objectReference: {fileID: 0}
- target: {fileID: 4415413950589506134, guid: 2b08dd32e48ef5e4aa65a6122099152e, type: 3}
propertyPath: m_LocalRotation.w
value: 0.9659258
objectReference: {fileID: 0}
- target: {fileID: 4415413950589506134, guid: 2b08dd32e48ef5e4aa65a6122099152e, type: 3}
propertyPath: m_LocalRotation.x
value: 0.2588191
objectReference: {fileID: 0}
- target: {fileID: 5356928211000044894, guid: 2b08dd32e48ef5e4aa65a6122099152e, type: 3}
propertyPath: FollowOffset.y
value: 3
objectReference: {fileID: 0}
- target: {fileID: 5356928211000044894, guid: 2b08dd32e48ef5e4aa65a6122099152e, type: 3}
propertyPath: FollowOffset.z
value: -8
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
@@ -2874,3 +3199,5 @@ SceneRoots:
- {fileID: 621471627}
- {fileID: 1409253547}
- {fileID: 14847856}
- {fileID: 613577505}
- {fileID: 2144751143}

View File

@@ -17,6 +17,8 @@ public class BuildManager : MonoBehaviour
public Vector2Int size; // 점유 칸수
}
public bool IsBuildMode => isBuildMode;
[Header("Settings")]
[SerializeField] private float cellSize = 1f;
[SerializeField] private LayerMask groundLayer;

View File

@@ -0,0 +1,10 @@
using UnityEngine;
public interface IInteractable
{
// 누가 상호작용을 시도했는지 알려주기 위해 GameObject를 인자로 받습니다.
void Interact(GameObject user);
// 선택 사항: 화면에 띄울 메시지를 반환하는 기능 (예: "통로 이용하기 [E]")
string GetInteractionText();
}

View File

@@ -0,0 +1,79 @@
using UnityEngine;
using UnityEngine.InputSystem; // New Input System 네임스페이스
public class PlayerInteraction : MonoBehaviour
{
[Header("Detection Settings")]
[SerializeField] private float interactionRadius = 2.5f;
[SerializeField] private LayerMask interactableLayer;
private PlayerInputActions _inputActions;
void Awake()
{
_inputActions = new PlayerInputActions();
}
void OnEnable()
{
// Interact 액션이 수행되었을 때(버튼을 눌렀을 때) 실행될 함수 연결
_inputActions.Player.Interact.performed += OnInteractPerformed;
_inputActions.Enable();
}
void OnDisable()
{
// 이벤트 연결 해제 및 비활성화
_inputActions.Player.Interact.performed -= OnInteractPerformed;
_inputActions.Disable();
}
// Input Action 콜백 함수
private void OnInteractPerformed(InputAction.CallbackContext context)
{
Debug.Log("E 키 눌림!"); // <-- 이게 콘솔에 찍히나요?
// 건설 모드 중일 때는 상호작용을 막고 싶다면 아래 조건 추가
if (BuildManager.Instance.IsBuildMode) return;
CheckAndInteract();
}
private void CheckAndInteract()
{
Collider[] colliders = Physics.OverlapSphere(transform.position, interactionRadius, interactableLayer);
Debug.Log($"주변에서 {colliders.Length}개의 물체 감지됨"); // 0이 나오면 레이어나 콜라이더 문제
IInteractable nearestInteractable = null;
float minDistance = Mathf.Infinity;
foreach (var col in colliders)
{
// 부모까지 포함하여 IInteractable 인터페이스를 찾음
IInteractable interactable = col.GetComponentInParent<IInteractable>();
if (interactable != null)
{
Debug.Log($"{col.name}에서 인터페이스 발견!");
float distance = Vector3.Distance(transform.position, col.transform.position);
if (distance < minDistance)
{
minDistance = distance;
nearestInteractable = interactable;
}
}
}
if (nearestInteractable != null)
{
nearestInteractable.Interact(gameObject);
Debug.Log($"[Interaction] {nearestInteractable.GetInteractionText()} 실행");
}
}
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, interactionRadius);
}
}

View File

@@ -0,0 +1,91 @@
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerInteractionController : MonoBehaviour
{
[Header("Detection Settings")]
[SerializeField] private float range = 3f;
[SerializeField] private LayerMask interactableLayer; // Tunnel용 레이어
[SerializeField] private LayerMask constructionLayer; // 건설 토대용 레이어
[Header("Build Settings")]
[SerializeField] private float buildSpeedMultiplier = 2f;
private PlayerInputActions _inputActions;
private bool _isHoldingInteract = false;
void Awake()
{
_inputActions = new PlayerInputActions();
// 탭(짧게 누르기) 시점 체크
_inputActions.Player.Interact.performed += OnInteractTap;
// 홀드(꾹 누르기) 시작/종료 체크
_inputActions.Player.Interact.started += ctx => {
_isHoldingInteract = true;
Debug.Log("인터랙션 버튼 누르기 시작 (건설 가속 준비)");
};
_inputActions.Player.Interact.canceled += ctx => {
_isHoldingInteract = false;
Debug.Log("인터랙션 버튼 뗌");
};
}
void OnEnable() => _inputActions.Enable();
void OnDisable() => _inputActions.Disable();
void Update()
{
if (_isHoldingInteract)
{
PerformConstructionSupport();
}
}
private void OnInteractTap(InputAction.CallbackContext context)
{
Debug.Log("E 키 탭 감지! 주변 탐색 시작...");
// 1. 주변 모든 콜라이더 가져오기 (레이어 마스크 없이 먼저 테스트해보고 싶다면 0 대신 ~0 입력)
Collider[] colliders = Physics.OverlapSphere(transform.position, range, interactableLayer);
Debug.Log($"주변 {interactableLayer.value} 레이어에서 {colliders.Length}개의 오브젝트 감지됨");
foreach (var col in colliders)
{
// 2. 인터페이스 찾기 (본인 또는 부모에게서)
IInteractable interactable = col.GetComponentInParent<IInteractable>();
if (interactable != null)
{
Debug.Log($"[성공] {col.name}에서 IInteractable 발견! 터널 진입합니다.");
interactable.Interact(gameObject);
_isHoldingInteract = false; // 이동 중에는 건설 지원 중단
return;
}
else
{
Debug.Log($"[실패] {col.name} 감지되었으나 IInteractable 스크립트가 없음");
}
}
}
private void PerformConstructionSupport()
{
Collider[] targets = Physics.OverlapSphere(transform.position, range, constructionLayer);
foreach (var col in targets)
{
ConstructionSite site = col.GetComponent<ConstructionSite>();
if (site != null)
{
site.AdvanceConstruction(Time.deltaTime * buildSpeedMultiplier);
}
}
}
void OnDrawGizmosSelected()
{
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, range);
}
}

View File

@@ -3,22 +3,25 @@ using UnityEngine.InputSystem;
public class PlayerMovement : MonoBehaviour
{
[SerializeField] private float moveSpeed = 5f;
private Vector2 _moveInput;
[Header("Movement Settings")]
public float moveSpeed = 5f;
public float jumpHeight = 1.5f; // 점프 높이
public float gravity = -19.62f; // 기본 중력보다 약간 무거운 값 추천
private CharacterController _controller;
private PlayerInputActions _inputActions;
private Vector3 _velocity;
public float gravity = -19.62f; // 조금 더 묵직하게 설정
private Vector2 _moveInput;
private Vector3 _velocity; // 수직 속도 (중력용)
private bool _isGrounded;
void Awake()
{
_controller = GetComponent<CharacterController>();
_inputActions = new PlayerInputActions();
// Move 액션 연결 (Vector2 타입으로 설정되어 있어야 함)
_inputActions.Player.Move.performed += ctx => _moveInput = ctx.ReadValue<Vector2>();
_inputActions.Player.Move.canceled += ctx => _moveInput = Vector2.zero;
// 점프 액션 연결
_inputActions.Player.Jump.performed += ctx => OnJump();
}
void OnEnable() => _inputActions.Enable();
@@ -26,29 +29,46 @@ public class PlayerMovement : MonoBehaviour
void Update()
{
// 1. 수직 속도(중력) 계산
if (_controller.isGrounded && _velocity.y < 0)
// [해결책] 터널 이동 중이라면 일반 이동/중력 로직을 모두 중단합니다.
if (GetComponent<TunnelTraveler>().IsTraveling)
{
// 바닥에 닿아있을 때 속도를 아주 작게 유지 (경사로 등에서 안정적)
return;
}
// 1. 바닥 체크 (CharacterController의 기능 활용)
_isGrounded = _controller.isGrounded;
if (_isGrounded && _velocity.y < 0)
{
// 바닥에 닿아있을 때는 아주 작은 하방 힘만 유지 (안정성)
_velocity.y = -2f;
}
// 2. 입력받은 방향으로 평면 이동 계산
Vector3 move = new Vector3(_moveInput.x, 0, _moveInput.y);
// 2. 이동 로직
_moveInput = _inputActions.Player.Move.ReadValue<Vector2>();
Vector3 move = transform.right * _moveInput.x + transform.forward * _moveInput.y;
_controller.Move(move * moveSpeed * Time.deltaTime);
// 수평 이동 실행
_controller.Move(move * Time.deltaTime * moveSpeed);
// 3. 중력 가속도 적용 (v = v + g * t)
// 3. 중력 적용
_velocity.y += gravity * Time.deltaTime;
// 4. 수직 이동(중력) 실행 (s = v * t)
// 4. 최종 수직 이동 적용 (중력/점프 속도)
_controller.Move(_velocity * Time.deltaTime);
}
// 이동 중일 때 바라보는 방향 전환
if (move != Vector3.zero)
private void OnJump()
{
// TunnelTraveler가 이동 중인지 체크 (상태 변수 활용)
if (GetComponent<TunnelTraveler>().IsTraveling) return;
if (_isGrounded)
{
transform.forward = move;
_velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
}
// 터널 이동 등 외부에서 중력을 초기화해야 할 때 사용
public void ResetVelocity()
{
_velocity.y = 0;
}
}

View File

@@ -0,0 +1,42 @@
using UnityEngine;
public class TunnelNode : MonoBehaviour, IInteractable
{
public TunnelNode connectedNode;
public TunnelNode otherEndOfThisSegment;
public float detectionRadius = 0.5f;
public LayerMask tunnelLayer;
// --- IInteractable 구현부 ---
public void Interact(GameObject user)
{
// 상호작용한 플레이어의 TunnelTraveler를 찾아 이동 시작!
TunnelTraveler traveler = user.GetComponent<TunnelTraveler>();
if (traveler != null)
{
traveler.StartTravel(this);
}
}
public string GetInteractionText()
{
return "통로 진입";
}
// ----------------------------
void Start() => FindNeighborNode();
public void FindNeighborNode()
{
Collider[] colliders = Physics.OverlapSphere(transform.position, detectionRadius, tunnelLayer);
foreach (var col in colliders)
{
TunnelNode neighbor = col.GetComponent<TunnelNode>();
if (neighbor != null && neighbor != this && neighbor != otherEndOfThisSegment)
{
connectedNode = neighbor;
break;
}
}
}
}

View File

@@ -0,0 +1,90 @@
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class TunnelTraveler : MonoBehaviour
{
public float travelSpeed = 25f; private bool _isTraveling = false;
// 외부에서 읽기 전용으로 접근할 수 있게 합니다.
public bool IsTraveling => _isTraveling;
private CharacterController _controller;
private Rigidbody _rigidbody;
void Awake()
{
_controller = GetComponent<CharacterController>();
_rigidbody = GetComponent<Rigidbody>();
}
private IEnumerator TravelRoutine(List<Vector3> path, TunnelNode startNode)
{
_isTraveling = true;
if (_controller != null) _controller.enabled = false;
if (_rigidbody != null) _rigidbody.isKinematic = true;
// 1. 캐릭터 높이 보정값 계산
float heightOffset = 0f;
if (_controller != null) heightOffset = _controller.height / 2f;
// 2. [입구 정렬] 시작 노드의 정확한 중앙 위치로 플레이어를 즉시 이동시킵니다.
// 플레이어의 '발바닥' 위치를 노드 중앙보다 heightOffset만큼 아래로 맞춤
Vector3 entryPosition = new Vector3(startNode.transform.position.x,
startNode.transform.position.y - heightOffset,
startNode.transform.position.z);
// 시작 지점으로 순간이동 또는 아주 빠르게 정렬
transform.position = entryPosition;
// 3. 경로 이동 시작
foreach (Vector3 targetPos in path)
{
Vector3 adjustedTarget = new Vector3(targetPos.x, targetPos.y - heightOffset, targetPos.z);
while (Vector3.Distance(transform.position, adjustedTarget) > 0.01f)
{
transform.position = Vector3.MoveTowards(transform.position, adjustedTarget, travelSpeed * Time.deltaTime);
yield return null;
}
transform.position = adjustedTarget;
}
if (_rigidbody != null) _rigidbody.isKinematic = false;
if (_controller != null) _controller.enabled = true;
_isTraveling = false;
}
// StartTravel 함수에서 startNode를 코루틴에 넘겨주도록 수정
public void StartTravel(TunnelNode startNode)
{
if (_isTraveling) return;
List<Vector3> path = GeneratePath(startNode);
if (path.Count > 0)
{
// startNode 정보를 함께 넘김
StartCoroutine(TravelRoutine(path, startNode));
}
}
// GeneratePath 함수는 기존과 동일하게 유지합니다.
private List<Vector3> GeneratePath(TunnelNode startNode)
{
List<Vector3> path = new List<Vector3>();
TunnelNode currentNode = startNode;
HashSet<TunnelNode> visited = new HashSet<TunnelNode>();
while (currentNode != null && !visited.Contains(currentNode))
{
visited.Add(currentNode);
TunnelNode exitNode = currentNode.otherEndOfThisSegment;
if (exitNode == null) break;
path.Add(exitNode.transform.position);
currentNode = exitNode.connectedNode;
}
return path;
}
}

View File

@@ -18,7 +18,7 @@ TagManager:
- Ground
- ConstructionZone
- Player
-
- Interactable
-
-
-