인터랙션 시스템 및 터널 기능 생성
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
261
Assets/Prefabs/Tunnel.prefab
Normal file
261
Assets/Prefabs/Tunnel.prefab
Normal 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}
|
||||
@@ -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}
|
||||
|
||||
@@ -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;
|
||||
|
||||
10
Assets/Scripts/IInteractable.cs
Normal file
10
Assets/Scripts/IInteractable.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
using UnityEngine;
|
||||
|
||||
public interface IInteractable
|
||||
{
|
||||
// 누가 상호작용을 시도했는지 알려주기 위해 GameObject를 인자로 받습니다.
|
||||
void Interact(GameObject user);
|
||||
|
||||
// 선택 사항: 화면에 띄울 메시지를 반환하는 기능 (예: "통로 이용하기 [E]")
|
||||
string GetInteractionText();
|
||||
}
|
||||
79
Assets/Scripts/Player/PlayerInteraction.cs
Normal file
79
Assets/Scripts/Player/PlayerInteraction.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
91
Assets/Scripts/Player/PlayerInteractionController.cs
Normal file
91
Assets/Scripts/Player/PlayerInteractionController.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
{
|
||||
transform.forward = move;
|
||||
// TunnelTraveler가 이동 중인지 체크 (상태 변수 활용)
|
||||
if (GetComponent<TunnelTraveler>().IsTraveling) return;
|
||||
|
||||
if (_isGrounded)
|
||||
{
|
||||
_velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
|
||||
}
|
||||
}
|
||||
|
||||
// 터널 이동 등 외부에서 중력을 초기화해야 할 때 사용
|
||||
public void ResetVelocity()
|
||||
{
|
||||
_velocity.y = 0;
|
||||
}
|
||||
}
|
||||
42
Assets/Scripts/TunnelNode.cs
Normal file
42
Assets/Scripts/TunnelNode.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
90
Assets/Scripts/TunnelTraveler.cs
Normal file
90
Assets/Scripts/TunnelTraveler.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@ TagManager:
|
||||
- Ground
|
||||
- ConstructionZone
|
||||
- Player
|
||||
-
|
||||
- Interactable
|
||||
-
|
||||
-
|
||||
-
|
||||
|
||||
Reference in New Issue
Block a user