Repository: SWPP-2025SPRING/team-project-for-2025-spring-swpp-team-08
Pull request #15: [TASK-18] [TASK-41] player movement 및 카메라 movement 구현
Author: login: trz-21
Created: 2025-05-05T15:31:34Z | Merged: 2025-05-11T12:24:38Z

아래와 같은 rule을 가지고 player movement를 구현했습니다.

- wasd 조작 / 마우스 조향입니다.
- 기본 조작감은 미리 논의한 느낌 최대한 살리려고 노력했음


1. 평지에서 특정 속력 이상이면서 조작키를 해당 방향으로 누르고 있을 때는 특정 속력으로 천천히 수렴해야 함.
2. 경사면을 이동할 때는 경사면을 기준으로 평지처럼 조작하는 힘 + 중력이 작용해야함. 즉, 올라갈 때는 평지보다 속력이 느려지고, 내려갈 때는 평지보다 속력이 빨라짐
3. 내리막을 통해 특정 속도보다 높은 상태로 평지에 진입하는 경우, 해당 속도가 유지되어야 함.

PlayerSampleScene 에서 직접 체험해보실 수 있습니다. 머지할 때 sample scene은 제거하고 머지할 예정
오르막길 올라갈 때 통통 튀는 에로사항이 있습니다


Diff:
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..009ddc88
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,48 @@
+# .editorconfig
+root = true
+
+[*.cs]
+charset = utf-8
+indent_style = space
+indent_size = 4
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+# using 정렬
+dotnet_sort_system_directives_first = true
+dotnet_separate_import_directive_groups = true
+
+# var 사용
+dotnet_style_var_for_built_in_types = true:suggestion
+dotnet_style_var_when_type_is_apparent = true:suggestion
+dotnet_style_var_elsewhere = true:suggestion
+
+# this. 생략
+dotnet_style_qualification_for_field = false:suggestion
+dotnet_style_qualification_for_property = false:suggestion
+dotnet_style_qualification_for_method = false:suggestion
+dotnet_style_qualification_for_event = false:suggestion
+
+# 중괄호 항상 사용
+csharp_prefer_braces = true:suggestion
+
+# 네이밍 스타일: private 필드 `_camelCase`
+dotnet_naming_rule.private_fields_should_be_camel_case.severity = suggestion
+dotnet_naming_rule.private_fields_should_be_camel_case.symbols = private_fields
+dotnet_naming_rule.private_fields_should_be_camel_case.style = camel_case_with_underscore
+
+dotnet_naming_symbols.private_fields.applicable_accessibilities = private
+dotnet_naming_symbols.private_fields.applicable_kinds = field
+dotnet_naming_symbols.private_fields.required_modifiers = readonly
+
+dotnet_naming_style.camel_case_with_underscore.capitalization = camel_case
+dotnet_naming_style.camel_case_with_underscore.required_prefix = _
+
+# expression-bodied members 사용 안 함
+csharp_style_expression_bodied_methods = false:suggestion
+csharp_style_expression_bodied_properties = false:suggestion
+
+# private fields naming rule (_camelCase)
+dotnet_naming_rule.private_fields_should_be_camel_case.severity = suggestion
+dotnet_naming_rule.private_fields_should_be_camel_case.symbols = private_fields
+dotnet_naming_rule.private_fields_should_be_camel_case.style = camel_case_with_underscore
diff --git a/Assets/Materials.meta b/Assets/Materials.meta
index 7835000e..ea62e1ca 100644
--- a/Assets/Materials.meta
+++ b/Assets/Materials.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: d3e4e14e95f16e546bc44577f148fd43
+guid: d2db614d3e96446b3a454a1b159b19b7
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/Assets/Materials/LowFriction.physicMaterial b/Assets/Materials/LowFriction.physicMaterial
new file mode 100644
index 00000000..7afb4faa
--- /dev/null
+++ b/Assets/Materials/LowFriction.physicMaterial
@@ -0,0 +1,14 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!134 &13400000
+PhysicMaterial:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: LowFriction
+  dynamicFriction: 0
+  staticFriction: 0
+  bounciness: 0
+  frictionCombine: 1
+  bounceCombine: 0
diff --git a/Assets/Materials/LowFriction.physicMaterial.meta b/Assets/Materials/LowFriction.physicMaterial.meta
new file mode 100644
index 00000000..d261ba6f
--- /dev/null
+++ b/Assets/Materials/LowFriction.physicMaterial.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d409125551c0b49728bfb80cee4e8248
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 13400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scenes/PlayerScene.unity.meta b/Assets/Prefabs/Camera.meta
similarity index 67%
rename from Assets/Scenes/PlayerScene.unity.meta
rename to Assets/Prefabs/Camera.meta
index 585298e5..74d7f97a 100644
--- a/Assets/Scenes/PlayerScene.unity.meta
+++ b/Assets/Prefabs/Camera.meta
@@ -1,5 +1,6 @@
 fileFormatVersion: 2
-guid: 32b904c37d071174880b0a676dea6a8b
+guid: 63f4d2bddbe67419e833814d846702dd
+folderAsset: yes
 DefaultImporter:
   externalObjects: {}
   userData: 
diff --git a/Assets/Prefabs/Camera/Main Camera.prefab b/Assets/Prefabs/Camera/Main Camera.prefab
new file mode 100644
index 00000000..8a0a5ede
--- /dev/null
+++ b/Assets/Prefabs/Camera/Main Camera.prefab	
@@ -0,0 +1,93 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &5792159634458106063
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5792159634458106060}
+  - component: {fileID: 5792159634458106061}
+  - component: {fileID: 5792159634458106051}
+  m_Layer: 0
+  m_Name: Main Camera
+  m_TagString: MainCamera
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &5792159634458106060
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5792159634458106063}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!20 &5792159634458106061
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5792159634458106063}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 1
+  m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+  m_projectionMatrixMode: 1
+  m_GateFitMode: 2
+  m_FOVAxisMode: 0
+  m_SensorSize: {x: 36, y: 24}
+  m_LensShift: {x: 0, y: 0}
+  m_FocalLength: 50
+  m_NormalizedViewPortRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  near clip plane: 0.3
+  far clip plane: 1000
+  field of view: 60
+  orthographic: 0
+  orthographic size: 5
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_TargetEye: 3
+  m_HDR: 1
+  m_AllowMSAA: 1
+  m_AllowDynamicResolution: 0
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 1
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+--- !u!114 &5792159634458106051
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5792159634458106063}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: e112a77d7fd59404aaf7867d1ee47604, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  cameraPivot: {fileID: 0}
+  offset: {x: 0, y: 5, z: -8}
+  followSpeed: 10
diff --git a/Assets/Prefabs/Camera/Main Camera.prefab.meta b/Assets/Prefabs/Camera/Main Camera.prefab.meta
new file mode 100644
index 00000000..30fa42cb
--- /dev/null
+++ b/Assets/Prefabs/Camera/Main Camera.prefab.meta	
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 12d0675e0378f4eb09637a77f4c2622a
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Prefabs/Player.meta b/Assets/Prefabs/Player.meta
new file mode 100644
index 00000000..e69df0d1
--- /dev/null
+++ b/Assets/Prefabs/Player.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 949e69195ae8a47d881bbcbaf215b73b
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Prefabs/Player/Player.prefab b/Assets/Prefabs/Player/Player.prefab
new file mode 100644
index 00000000..9fffb860
--- /dev/null
+++ b/Assets/Prefabs/Player/Player.prefab
@@ -0,0 +1,183 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1536914686637357237
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1536914686637357242}
+  - component: {fileID: 1536914686637357243}
+  m_Layer: 0
+  m_Name: CameraPivot
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1536914686637357242
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1536914686637357237}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 2.17, y: 1.03, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1536914687352685702}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1536914686637357243
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1536914686637357237}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 668bbb0029c044708e13d3401b640d7d, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  player: {fileID: 1536914687352685702}
+  mouseSensitivity: 3
+  minPitch: -30
+  maxPitch: 60
+--- !u!1 &1536914687352685757
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1536914687352685702}
+  - component: {fileID: 1536914687352685697}
+  - component: {fileID: 1536914687352685696}
+  - component: {fileID: 1536914687352685698}
+  - component: {fileID: 1536914687352685703}
+  - component: {fileID: 1536914687352685700}
+  m_Layer: 0
+  m_Name: Player
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1536914687352685702
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1536914687352685757}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1.37, z: -8.86}
+  m_LocalScale: {x: 1.1591, y: 1.1591, z: 1.1591}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 1536914686637357242}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &1536914687352685697
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1536914687352685757}
+  m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &1536914687352685696
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1536914687352685757}
+  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_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 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_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!54 &1536914687352685698
+Rigidbody:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1536914687352685757}
+  serializedVersion: 2
+  m_Mass: 10
+  m_Drag: 0
+  m_AngularDrag: 0.05
+  m_UseGravity: 1
+  m_IsKinematic: 0
+  m_Interpolate: 1
+  m_Constraints: 0
+  m_CollisionDetection: 1
+--- !u!114 &1536914687352685703
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1536914687352685757}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d56989e24292c4a819e8e53e7b7e80fc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  moveSpeed: 30
+  acceleration: 100
+  deceleration: 100
+  cameraPivot: {fileID: 0}
+--- !u!136 &1536914687352685700
+CapsuleCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1536914687352685757}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  m_Radius: 0.49999997
+  m_Height: 0.99999994
+  m_Direction: 1
+  m_Center: {x: 0, y: 0, z: 0}
diff --git a/Assets/Prefabs/Player/Player.prefab.meta b/Assets/Prefabs/Player/Player.prefab.meta
new file mode 100644
index 00000000..71cc8b73
--- /dev/null
+++ b/Assets/Prefabs/Player/Player.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 07985d3371a50435282d4836a58154dd
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scenes/PlayerScene.unity b/Assets/Scenes/PlayerScene.unity
deleted file mode 100644
index 43f58f25..00000000
--- a/Assets/Scenes/PlayerScene.unity
+++ /dev/null
@@ -1,359 +0,0 @@
-%YAML 1.1
-%TAG !u! tag:unity3d.com,2011:
---- !u!29 &1
-OcclusionCullingSettings:
-  m_ObjectHideFlags: 0
-  serializedVersion: 2
-  m_OcclusionBakeSettings:
-    smallestOccluder: 5
-    smallestHole: 0.25
-    backfaceThreshold: 100
-  m_SceneGUID: 00000000000000000000000000000000
-  m_OcclusionCullingData: {fileID: 0}
---- !u!104 &2
-RenderSettings:
-  m_ObjectHideFlags: 0
-  serializedVersion: 9
-  m_Fog: 0
-  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
-  m_FogMode: 3
-  m_FogDensity: 0.01
-  m_LinearFogStart: 0
-  m_LinearFogEnd: 300
-  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
-  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
-  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
-  m_AmbientIntensity: 1
-  m_AmbientMode: 0
-  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
-  m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
-  m_HaloStrength: 0.5
-  m_FlareStrength: 1
-  m_FlareFadeSpeed: 3
-  m_HaloTexture: {fileID: 0}
-  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
-  m_DefaultReflectionMode: 0
-  m_DefaultReflectionResolution: 128
-  m_ReflectionBounces: 1
-  m_ReflectionIntensity: 1
-  m_CustomReflection: {fileID: 0}
-  m_Sun: {fileID: 0}
-  m_UseRadianceAmbientProbe: 0
---- !u!157 &3
-LightmapSettings:
-  m_ObjectHideFlags: 0
-  serializedVersion: 12
-  m_GIWorkflowMode: 1
-  m_GISettings:
-    serializedVersion: 2
-    m_BounceScale: 1
-    m_IndirectOutputScale: 1
-    m_AlbedoBoost: 1
-    m_EnvironmentLightingMode: 0
-    m_EnableBakedLightmaps: 1
-    m_EnableRealtimeLightmaps: 0
-  m_LightmapEditorSettings:
-    serializedVersion: 12
-    m_Resolution: 2
-    m_BakeResolution: 40
-    m_AtlasSize: 1024
-    m_AO: 0
-    m_AOMaxDistance: 1
-    m_CompAOExponent: 1
-    m_CompAOExponentDirect: 0
-    m_ExtractAmbientOcclusion: 0
-    m_Padding: 2
-    m_LightmapParameters: {fileID: 0}
-    m_LightmapsBakeMode: 1
-    m_TextureCompression: 1
-    m_FinalGather: 0
-    m_FinalGatherFiltering: 1
-    m_FinalGatherRayCount: 256
-    m_ReflectionCompression: 2
-    m_MixedBakeMode: 2
-    m_BakeBackend: 1
-    m_PVRSampling: 1
-    m_PVRDirectSampleCount: 32
-    m_PVRSampleCount: 512
-    m_PVRBounces: 2
-    m_PVREnvironmentSampleCount: 256
-    m_PVREnvironmentReferencePointCount: 2048
-    m_PVRFilteringMode: 1
-    m_PVRDenoiserTypeDirect: 1
-    m_PVRDenoiserTypeIndirect: 1
-    m_PVRDenoiserTypeAO: 1
-    m_PVRFilterTypeDirect: 0
-    m_PVRFilterTypeIndirect: 0
-    m_PVRFilterTypeAO: 0
-    m_PVREnvironmentMIS: 1
-    m_PVRCulling: 1
-    m_PVRFilteringGaussRadiusDirect: 1
-    m_PVRFilteringGaussRadiusIndirect: 5
-    m_PVRFilteringGaussRadiusAO: 2
-    m_PVRFilteringAtrousPositionSigmaDirect: 0.5
-    m_PVRFilteringAtrousPositionSigmaIndirect: 2
-    m_PVRFilteringAtrousPositionSigmaAO: 1
-    m_ExportTrainingData: 0
-    m_TrainingDataDestination: TrainingData
-    m_LightProbeSampleCountMultiplier: 4
-  m_LightingDataAsset: {fileID: 0}
-  m_LightingSettings: {fileID: 0}
---- !u!196 &4
-NavMeshSettings:
-  serializedVersion: 2
-  m_ObjectHideFlags: 0
-  m_BuildSettings:
-    serializedVersion: 2
-    agentTypeID: 0
-    agentRadius: 0.5
-    agentHeight: 2
-    agentSlope: 45
-    agentClimb: 0.4
-    ledgeDropHeight: 0
-    maxJumpAcrossDistance: 0
-    minRegionArea: 2
-    manualCellSize: 0
-    cellSize: 0.16666667
-    manualTileSize: 0
-    tileSize: 256
-    accuratePlacement: 0
-    maxJobWorkers: 0
-    preserveTilesOutsideBounds: 0
-    debug:
-      m_Flags: 0
-  m_NavMeshData: {fileID: 0}
---- !u!1 &242496116
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 242496119}
-  - component: {fileID: 242496118}
-  - component: {fileID: 242496117}
-  m_Layer: 0
-  m_Name: Main Camera
-  m_TagString: MainCamera
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!81 &242496117
-AudioListener:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 242496116}
-  m_Enabled: 1
---- !u!20 &242496118
-Camera:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 242496116}
-  m_Enabled: 1
-  serializedVersion: 2
-  m_ClearFlags: 1
-  m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
-  m_projectionMatrixMode: 1
-  m_GateFitMode: 2
-  m_FOVAxisMode: 0
-  m_SensorSize: {x: 36, y: 24}
-  m_LensShift: {x: 0, y: 0}
-  m_FocalLength: 50
-  m_NormalizedViewPortRect:
-    serializedVersion: 2
-    x: 0
-    y: 0
-    width: 1
-    height: 1
-  near clip plane: 0.3
-  far clip plane: 1000
-  field of view: 60
-  orthographic: 0
-  orthographic size: 5
-  m_Depth: -1
-  m_CullingMask:
-    serializedVersion: 2
-    m_Bits: 4294967295
-  m_RenderingPath: -1
-  m_TargetTexture: {fileID: 0}
-  m_TargetDisplay: 0
-  m_TargetEye: 3
-  m_HDR: 1
-  m_AllowMSAA: 1
-  m_AllowDynamicResolution: 0
-  m_ForceIntoRT: 0
-  m_OcclusionCulling: 1
-  m_StereoConvergence: 10
-  m_StereoSeparation: 0.022
---- !u!4 &242496119
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 242496116}
-  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
-  m_LocalPosition: {x: 0, y: 1, z: -10}
-  m_LocalScale: {x: 1, y: 1, z: 1}
-  m_ConstrainProportionsScale: 0
-  m_Children: []
-  m_Father: {fileID: 0}
-  m_RootOrder: 0
-  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!1 &674162174
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 674162176}
-  - component: {fileID: 674162175}
-  m_Layer: 0
-  m_Name: Directional Light
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!108 &674162175
-Light:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 674162174}
-  m_Enabled: 1
-  serializedVersion: 10
-  m_Type: 1
-  m_Shape: 0
-  m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
-  m_Intensity: 1
-  m_Range: 10
-  m_SpotAngle: 30
-  m_InnerSpotAngle: 21.80208
-  m_CookieSize: 10
-  m_Shadows:
-    m_Type: 2
-    m_Resolution: -1
-    m_CustomResolution: -1
-    m_Strength: 1
-    m_Bias: 0.05
-    m_NormalBias: 0.4
-    m_NearPlane: 0.2
-    m_CullingMatrixOverride:
-      e00: 1
-      e01: 0
-      e02: 0
-      e03: 0
-      e10: 0
-      e11: 1
-      e12: 0
-      e13: 0
-      e20: 0
-      e21: 0
-      e22: 1
-      e23: 0
-      e30: 0
-      e31: 0
-      e32: 0
-      e33: 1
-    m_UseCullingMatrixOverride: 0
-  m_Cookie: {fileID: 0}
-  m_DrawHalo: 0
-  m_Flare: {fileID: 0}
-  m_RenderMode: 0
-  m_CullingMask:
-    serializedVersion: 2
-    m_Bits: 4294967295
-  m_RenderingLayerMask: 1
-  m_Lightmapping: 4
-  m_LightShadowCasterMode: 0
-  m_AreaSize: {x: 1, y: 1}
-  m_BounceIntensity: 1
-  m_ColorTemperature: 6570
-  m_UseColorTemperature: 0
-  m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
-  m_UseBoundingSphereOverride: 0
-  m_UseViewFrustumForShadowCasterCull: 1
-  m_ShadowRadius: 0
-  m_ShadowAngle: 0
---- !u!4 &674162176
-Transform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 674162174}
-  m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
-  m_LocalPosition: {x: 0, y: 3, z: 0}
-  m_LocalScale: {x: 1, y: 1, z: 1}
-  m_ConstrainProportionsScale: 0
-  m_Children: []
-  m_Father: {fileID: 0}
-  m_RootOrder: 2
-  m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
---- !u!1001 &1728708861
-PrefabInstance:
-  m_ObjectHideFlags: 0
-  serializedVersion: 2
-  m_Modification:
-    m_TransformParent: {fileID: 0}
-    m_Modifications:
-    - target: {fileID: -8679921383154817045, guid: cb16d6b9d5cf65d458edfe902850c04f, type: 3}
-      propertyPath: m_RootOrder
-      value: 1
-      objectReference: {fileID: 0}
-    - target: {fileID: -8679921383154817045, guid: cb16d6b9d5cf65d458edfe902850c04f, type: 3}
-      propertyPath: m_LocalPosition.x
-      value: 1225.9802
-      objectReference: {fileID: 0}
-    - target: {fileID: -8679921383154817045, guid: cb16d6b9d5cf65d458edfe902850c04f, type: 3}
-      propertyPath: m_LocalPosition.y
-      value: -334.79788
-      objectReference: {fileID: 0}
-    - target: {fileID: -8679921383154817045, guid: cb16d6b9d5cf65d458edfe902850c04f, type: 3}
-      propertyPath: m_LocalPosition.z
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: -8679921383154817045, guid: cb16d6b9d5cf65d458edfe902850c04f, type: 3}
-      propertyPath: m_LocalRotation.w
-      value: 0.97954375
-      objectReference: {fileID: 0}
-    - target: {fileID: -8679921383154817045, guid: cb16d6b9d5cf65d458edfe902850c04f, type: 3}
-      propertyPath: m_LocalRotation.x
-      value: -0.20123151
-      objectReference: {fileID: 0}
-    - target: {fileID: -8679921383154817045, guid: cb16d6b9d5cf65d458edfe902850c04f, type: 3}
-      propertyPath: m_LocalRotation.y
-      value: -0
-      objectReference: {fileID: 0}
-    - target: {fileID: -8679921383154817045, guid: cb16d6b9d5cf65d458edfe902850c04f, type: 3}
-      propertyPath: m_LocalRotation.z
-      value: -0
-      objectReference: {fileID: 0}
-    - target: {fileID: -8679921383154817045, guid: cb16d6b9d5cf65d458edfe902850c04f, type: 3}
-      propertyPath: m_LocalEulerAnglesHint.x
-      value: -23.218
-      objectReference: {fileID: 0}
-    - target: {fileID: -8679921383154817045, guid: cb16d6b9d5cf65d458edfe902850c04f, type: 3}
-      propertyPath: m_LocalEulerAnglesHint.y
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: -8679921383154817045, guid: cb16d6b9d5cf65d458edfe902850c04f, type: 3}
-      propertyPath: m_LocalEulerAnglesHint.z
-      value: 0
-      objectReference: {fileID: 0}
-    - target: {fileID: 919132149155446097, guid: cb16d6b9d5cf65d458edfe902850c04f, type: 3}
-      propertyPath: m_Name
-      value: player_backpack
-      objectReference: {fileID: 0}
-    m_RemovedComponents: []
-  m_SourcePrefab: {fileID: 100100000, guid: cb16d6b9d5cf65d458edfe902850c04f, type: 3}
diff --git a/Assets/Scripts/Camera.meta b/Assets/Scripts/Camera.meta
new file mode 100644
index 00000000..152cbce3
--- /dev/null
+++ b/Assets/Scripts/Camera.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: cf2ef8b8e89f4441a69b25f2223822d1
+timeCreated: 1746453906
\ No newline at end of file
diff --git a/Assets/Scripts/Camera/CameraFollow.cs b/Assets/Scripts/Camera/CameraFollow.cs
new file mode 100644
index 00000000..c21666dc
--- /dev/null
+++ b/Assets/Scripts/Camera/CameraFollow.cs
@@ -0,0 +1,15 @@
+using UnityEngine;
+
+public class CameraFollow : MonoBehaviour
+{
+    public Transform cameraPivot;
+    public Vector3 offset = new Vector3(0f, 2f, -6f);
+    public float followSpeed = 10f;
+
+    private void LateUpdate()
+    {
+        Vector3 targetPos = cameraPivot.position + cameraPivot.rotation * offset;
+        transform.position = Vector3.Lerp(transform.position, targetPos, followSpeed * Time.deltaTime);
+        transform.LookAt(cameraPivot);
+    }
+}
diff --git a/Assets/Scripts/Camera/CameraFollow.cs.meta b/Assets/Scripts/Camera/CameraFollow.cs.meta
new file mode 100644
index 00000000..ab39c9c8
--- /dev/null
+++ b/Assets/Scripts/Camera/CameraFollow.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e112a77d7fd59404aaf7867d1ee47604
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Camera/CameraPivotController.cs b/Assets/Scripts/Camera/CameraPivotController.cs
new file mode 100644
index 00000000..55ff7677
--- /dev/null
+++ b/Assets/Scripts/Camera/CameraPivotController.cs
@@ -0,0 +1,31 @@
+using UnityEngine;
+
+public class CameraPivotController : MonoBehaviour
+{
+    public Transform player;
+    public float mouseSensitivity = 3f;
+    public float minPitch = -30f;
+    public float maxPitch = 60f;
+
+    private float _yaw = 0f;
+    private float _pitch = 20f; // 기본 각도
+
+    private void Start()
+    {
+        _yaw = transform.eulerAngles.y;
+        _pitch = transform.eulerAngles.x;
+    }
+
+    private void LateUpdate()
+    {
+        float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity;
+        float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity;
+
+        _yaw += mouseX;
+        _pitch -= mouseY;
+        _pitch = Mathf.Clamp(_pitch, minPitch, maxPitch);
+
+        transform.position = player.position;
+        transform.rotation = Quaternion.Euler(_pitch, _yaw, 0f);
+    }
+}
diff --git a/Assets/Scripts/Camera/CameraPivotController.cs.meta b/Assets/Scripts/Camera/CameraPivotController.cs.meta
new file mode 100644
index 00000000..152408e4
--- /dev/null
+++ b/Assets/Scripts/Camera/CameraPivotController.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 668bbb0029c044708e13d3401b640d7d
+timeCreated: 1746453919
\ No newline at end of file
diff --git a/Assets/Scripts/Managers/GameManager.cs b/Assets/Scripts/Managers/GameManager.cs
index 750f8387..264dad52 100644
--- a/Assets/Scripts/Managers/GameManager.cs
+++ b/Assets/Scripts/Managers/GameManager.cs
@@ -23,6 +23,7 @@ private void Awake()
     private void Start()
     {
         Initialize();
+        Physics.gravity = new Vector3(0, -30f, 0);
     }
 
     public void Initialize()
diff --git a/Assets/Scripts/Player.meta b/Assets/Scripts/Player.meta
new file mode 100644
index 00000000..d2261d83
--- /dev/null
+++ b/Assets/Scripts/Player.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ff732a41544db4b6890811e0a9c59cbf
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Player/PlayerController.cs b/Assets/Scripts/Player/PlayerController.cs
new file mode 100644
index 00000000..ed658fd2
--- /dev/null
+++ b/Assets/Scripts/Player/PlayerController.cs
@@ -0,0 +1,148 @@
+using UnityEngine;
+
+public class PlayerController : MonoBehaviour
+{
+    public float moveSpeed = 30f;
+    public float acceleration = 100f;
+    public float deceleration = 100f;
+    public Transform cameraPivot;
+
+    private Rigidbody _rb;
+    private Vector3 _inputDirection;
+
+    private void Start()
+    {
+        _rb = GetComponent<Rigidbody>();
+        Cursor.lockState = CursorLockMode.Locked;
+    }
+
+    private void Update()
+    {
+        float h = Input.GetAxisRaw("Horizontal");
+        float v = Input.GetAxisRaw("Vertical");
+        _inputDirection = new Vector3(h, 0, v).normalized;
+    }
+
+    private void FixedUpdate()
+    {
+        Vector3 camForward = cameraPivot.forward;
+        Vector3 camRight = cameraPivot.right;
+        camForward.y = 0;
+        camRight.y = 0;
+        camForward.Normalize();
+        camRight.Normalize();
+
+        Vector3 inputDir = _inputDirection.normalized;
+        Vector3 moveDir = (camForward * inputDir.z + camRight * inputDir.x).normalized;
+        Vector3 currentVelocity = _rb.velocity;
+        Vector3 horizontalVelocity = new Vector3(currentVelocity.x, 0f, currentVelocity.z);
+        float horizontalSpeed = horizontalVelocity.magnitude;
+
+        bool grounded = IsGrounded();
+        bool isSliding = ApplySlopeSlide();
+
+        RaycastHit hit;
+        bool onSlope = false;
+        Vector3 slopeNormal = Vector3.up;
+
+        if (grounded && Physics.Raycast(transform.position, Vector3.down, out hit, 1.1f))
+        {
+            slopeNormal = hit.normal;
+            float slopeAngle = Vector3.Angle(slopeNormal, Vector3.up);
+            if (slopeAngle > 5f)
+            {
+                onSlope = true;
+                moveDir = Vector3.ProjectOnPlane(moveDir, slopeNormal).normalized;
+            }
+        }
+
+        if (_inputDirection.magnitude > 0 && grounded)
+        {
+            float alignment = Vector3.Dot(horizontalVelocity.normalized, moveDir);
+            float slopeFactor = onSlope ? 0.5f : 1f;
+
+            // 일반적인 경우 빠르게 가속
+            if (horizontalSpeed < moveSpeed - 0.5f)
+            {
+                Vector3 desiredVelocity = moveDir * moveSpeed;
+                Vector3 velocityDelta = desiredVelocity - horizontalVelocity;
+                Vector3 force = Vector3.ClampMagnitude(velocityDelta * acceleration * slopeFactor, acceleration);
+                _rb.AddForce(force, ForceMode.Acceleration);
+            }
+            // 경사면 이동 등으로 인해 최대 속도를 초과한 상태에서 input이 있다면, 최대 속도에 천천히 수렴
+            else if (alignment > 0.9f && horizontalSpeed > moveSpeed + 0.5f)
+            {
+                float excess = horizontalSpeed - moveSpeed;
+                float dampingStrength = 0.003f;
+                Vector3 decel = -horizontalVelocity.normalized * (excess * dampingStrength);
+                _rb.AddForce(decel, ForceMode.Acceleration);
+            }
+            // 최대 속도를 초과한 상태에서 반대방향 키를 누르면 빠르게 멈춤
+            else
+            {
+                Vector3 steer = (moveDir - horizontalVelocity.normalized) * acceleration * 0.5f * slopeFactor;
+                _rb.AddForce(steer, ForceMode.Acceleration);
+            }
+        }
+
+        // 평지에서 입력 없으면 감속
+        if (!isSliding && grounded)
+        {
+            bool inputExists = _inputDirection.magnitude > 0;
+            bool oppositeDir = inputExists && Vector3.Dot(horizontalVelocity, moveDir) < 0;
+
+            if (!inputExists || oppositeDir)
+            {
+                if (horizontalSpeed > moveSpeed)
+                {
+                    // 평지에서 고속 + 무입력 → 빠르게 감속
+                    Vector3 decel = -horizontalVelocity.normalized * deceleration * 0.5f;
+                    _rb.AddForce(decel, ForceMode.Acceleration);
+                }
+                else if (horizontalSpeed > 0.1f)
+                {
+                    // 중속 → 일반 감속
+                    Vector3 decel = -horizontalVelocity.normalized * deceleration;
+                    _rb.AddForce(decel, ForceMode.Acceleration);
+                }
+                else
+                {
+                    // 저속 → 확실히 멈춤
+                    Vector3 stop = -horizontalVelocity.normalized * deceleration * 2f;
+                    _rb.AddForce(stop, ForceMode.Acceleration);
+                }
+            }
+        }
+
+        // 공중 -> 미세 조정만 가능
+        if (_inputDirection.magnitude > 0 && !grounded)
+        {
+            Vector3 desiredVelocity = moveDir * moveSpeed;
+            Vector3 velocityDelta = desiredVelocity - horizontalVelocity;
+            Vector3 force = Vector3.ClampMagnitude(velocityDelta * 0.2f, 1f);
+            _rb.AddForce(force, ForceMode.Acceleration);
+        }
+
+        // Debug.Log($"|v|: {_rb.velocity.magnitude:F2}, horizontal: {horizontalSpeed:F2}, onSlope: {onSlope}, grounded: {grounded}");
+    }
+
+    private bool IsGrounded()
+    {
+        return Physics.Raycast(transform.position, Vector3.down, out _, 1.2f);
+    }
+
+    private bool ApplySlopeSlide()
+    {
+        if (Physics.Raycast(transform.position, Vector3.down, out RaycastHit hit, 1.1f))
+        {
+            float angle = Vector3.Angle(hit.normal, Vector3.up);
+            if (angle > 10f && _inputDirection.magnitude < 0.1f)
+            {
+                Vector3 slideDir = Vector3.ProjectOnPlane(Vector3.down, hit.normal).normalized;
+                _rb.AddForce(slideDir * 30f, ForceMode.Acceleration);
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/Assets/Scripts/Player/PlayerController.cs.meta b/Assets/Scripts/Player/PlayerController.cs.meta
new file mode 100644
index 00000000..3d66786a
--- /dev/null
+++ b/Assets/Scripts/Player/PlayerController.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d56989e24292c4a819e8e53e7b7e80fc
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 


Reviews:
user: login: trz-21
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T14:27:33Z
user: login: Dancookie
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-07T00:59:22Z
user: login: Dancookie
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-07T02:28:42Z
user: login: trz-21
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T19:47:02Z
user: login: trz-21
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T19:47:51Z
user: login: Dancookie
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-09T14:50:17Z
user: login: Dancookie
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-09T14:51:59Z
user: login: trz-21
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-10T05:51:12Z
user: login: Dancookie
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-10T06:01:15Z
user: login: trz-21
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-10T06:13:28Z
user: login: dabetai
body: 조와용 ~ 수고 많으셨습니다 ㅎㅎ
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-10T15:07:45Z
user: login: Mathshyun
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-11T06:29:27Z
user: login: trz-21
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-11T06:31:06Z
user: login: Mathshyun
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-11T06:31:45Z
user: login: trz-21
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-11T06:46:20Z
user: login: trz-21
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-11T07:47:50Z

Review comments:
path: .editorconfig
user: login: trz-21
body: > 이거 해봤는데 무빙 되게 재밌고 깔끔한 거 같아요 그런데 카메라 각도를 설정하신 건가요? 사진처럼 너무 카메라가 바닥만 보는데 저는 전방 ~ 전방에서 30도 정도 아래를 생각했어서 조금 시야 부분에서 불편함이 있었어서 의견 드려봅니다...! 앞의 맵을 보고 어떻게 갈지 정해야 하는데 앞이 잘 안 보이네요 ㅜㅜ

(스레드로 트래킹하고싶어서 댓글 옮겨왔어요)
@Dancookie 마우스로 조정 불가능하신가요?? 위아래도 조향 가능하게 만들어놨었는데 잘 안되시면 일단 Player에 딸린 camera pivot 위치를 수정하면 아마 각도를 좀 수정하실 수 있을거에요
created_at: 2025-05-06T14:27:33Z
author_association: CONTRIBUTOR
path: .editorconfig
user: login: Dancookie
body: 앗 아뇨 잘 됩니다! 다시 생각해 보니 전에 조작법 관련 메세지를 올려주셨던 거 같은데 이 pr창에 없어서 제가 까먹은 거 같아요 ㅠㅠ
created_at: 2025-05-07T00:59:22Z
author_association: CONTRIBUTOR
path: .editorconfig
user: login: Dancookie
body: 다시 해본 후기: 정말 재밌고 조작방식 (wasd + 마우스) 굉장히 좋은 것 같습니다 + 저희 무빙에 중력감? drag? 그런 게 없고 굉장히 미끄러지듯 스무스한데 이 부분 방향성은 추후 다듬을때 같이 정하면 좋을 것 같아요
created_at: 2025-05-07T02:28:42Z
author_association: CONTRIBUTOR
path: Assets/Materials/LowFriction.physicMaterial
user: login: trz-21
body: 이걸 안넣으면 마찰로 인해 경사면에서 평지로 이동(평지에 충돌) 시 속도 유지가 안됨
created_at: 2025-05-08T19:47:02Z
author_association: CONTRIBUTOR
diff_hunk: @@ -29,4 +29,9 @@ public static void LoadScene(string sceneName = null)
         sceneName ??= SceneManager.GetActiveScene().name;
         SceneManager.LoadScene(sceneName);
     }
+
+    void Start()
+    {
+        Physics.gravity = new Vector3(0, -30f, 0);
path: Assets/Scripts/Managers/GameManager.cs
user: login: trz-21
body: 유니티 자체 중력이 너무 약해서 공중에서 떨어질 때 느낌이 너무 안살아가지고 중력 조정했습니다 이것도 의견 받음
created_at: 2025-05-08T19:47:51Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,15 @@
+using UnityEngine;
+
+public class CameraFollow : MonoBehaviour
+{
+    public Transform cameraPivot;
+    public Vector3 offset = new Vector3(0f, 2f, -6f);
+    public float followSpeed = 10f;
+
+    void LateUpdate()
path: Assets/Scripts/Camera/CameraFollow.cs
user: login: Dancookie
body: camera moving에 latency가 있는데 혹시 이 부분 때문일 수도 있을 거 같네요
Update를 사용했을 때 나아질지는 모르겠지만 원인일 수도...?

+ 전에 어떤 분이 object에 카메라를 child로 붙이면 1인칭 된다고 말해주신 거 같은데 확실은 x
created_at: 2025-05-09T14:50:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,31 @@
+using UnityEngine;
+
+public class CameraPivotController : MonoBehaviour
+{
+    public Transform player;
+    public float mouseSensitivity = 3f;
+
+    private float yaw = 0f;
+    private float pitch = 20f; // 기본 각도
path: Assets/Scripts/Camera/CameraPivotController.cs
user: login: Dancookie
body: private면 변수명 앞에 _ 붙여야 되는거같아요!
created_at: 2025-05-09T14:51:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,15 @@
+using UnityEngine;
+
+public class CameraFollow : MonoBehaviour
+{
+    public Transform cameraPivot;
+    public Vector3 offset = new Vector3(0f, 2f, -6f);
+    public float followSpeed = 10f;
+
+    void LateUpdate()
path: Assets/Scripts/Camera/CameraFollow.cs
user: login: trz-21
body: 저 이거 제 컴에서는 스무스하게 돌아가는데 혹시 환경 차이일까요 영상도 슬랙으로 공유해주실 수 있나요?
created_at: 2025-05-10T05:51:12Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,15 @@
+using UnityEngine;
+
+public class CameraFollow : MonoBehaviour
+{
+    public Transform cameraPivot;
+    public Vector3 offset = new Vector3(0f, 2f, -6f);
+    public float followSpeed = 10f;
+
+    void LateUpdate()
path: Assets/Scripts/Camera/CameraFollow.cs
user: login: Dancookie
body: 완료했습니당
created_at: 2025-05-10T06:01:15Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,31 @@
+using UnityEngine;
+
+public class CameraPivotController : MonoBehaviour
+{
+    public Transform player;
+    public float mouseSensitivity = 3f;
+
+    private float yaw = 0f;
+    private float pitch = 20f; // 기본 각도
path: Assets/Scripts/Camera/CameraPivotController.cs
user: login: trz-21
body: [d3f6c03](https://github.com/SWPP-2025SPRING/team-project-for-2025-spring-swpp-team-08/pull/15/commits/d3f6c03931cb7b143f52abb7be666fe6a8db89e2)
created_at: 2025-05-10T06:13:28Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,148 @@
+using UnityEngine;
+
+public class PlayerController : MonoBehaviour
+{
+    public float moveSpeed = 30f;
+    public float acceleration = 100f;
+    public float deceleration = 100f;
+    public Transform cameraPivot;
+
+    private Rigidbody _rb;
+    private Vector3 _inputDirection;
+
+    void Start()
path: Assets/Scripts/Player/PlayerController.cs
user: login: Mathshyun
body: 그리고 메서드들 모두 access modifier (`private`, `public`) 등이 표시 안 되어 있는데
기본으로 `private`로 지정해주긴 하지만 명시적으로 써 놓는 것이 좋을 것 같습니다
created_at: 2025-05-11T06:29:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,148 @@
+using UnityEngine;
+
+public class PlayerController : MonoBehaviour
+{
+    public float moveSpeed = 30f;
+    public float acceleration = 100f;
+    public float deceleration = 100f;
+    public Transform cameraPivot;
+
+    private Rigidbody _rb;
+    private Vector3 _inputDirection;
+
+    void Start()
path: Assets/Scripts/Player/PlayerController.cs
user: login: trz-21
body: [8685657](https://github.com/SWPP-2025SPRING/team-project-for-2025-spring-swpp-team-08/pull/15/commits/8685657ce6a26e06873bf3dd505ae3adef99d460)
created_at: 2025-05-11T06:31:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -29,4 +29,9 @@ public static void LoadScene(string sceneName = null)
         sceneName ??= SceneManager.GetActiveScene().name;
         SceneManager.LoadScene(sceneName);
     }
+
+    void Start()
path: Assets/Scripts/Managers/GameManager.cs
user: login: Mathshyun
body: 여기도...
created_at: 2025-05-11T06:31:45Z
author_association: CONTRIBUTOR
diff_hunk: @@ -29,4 +29,9 @@ public static void LoadScene(string sceneName = null)
         sceneName ??= SceneManager.GetActiveScene().name;
         SceneManager.LoadScene(sceneName);
     }
+
+    void Start()
path: Assets/Scripts/Managers/GameManager.cs
user: login: trz-21
body: 혹시 private / public 메소드 region 서순도 컨벤션 있나요?
created_at: 2025-05-11T06:46:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -29,4 +29,9 @@ public static void LoadScene(string sceneName = null)
         sceneName ??= SceneManager.GetActiveScene().name;
         SceneManager.LoadScene(sceneName);
     }
+
+    void Start()
path: Assets/Scripts/Managers/GameManager.cs
user: login: trz-21
body: [e2e4292](https://github.com/SWPP-2025SPRING/team-project-for-2025-spring-swpp-team-08/pull/15/commits/e2e42929a0905b1a7d5066f999d12bffa11e17bd)
Start Awake 같은 메소드지만 보통 위에 있다는거 감안하면 따로 서순 convention은 없다고 생각해서 그냥 접근제어자만 업데이트 했어요

어차피 pr이니까 커밋 합쳐서 포스푸시함
created_at: 2025-05-11T07:47:50Z
author_association: CONTRIBUTOR

PR comments:
user: login: notion-workspace[bot]
created_at: 2025-05-05T15:31:38Z
body: <a href="https://www.notion.so/Player-movement-script-1e2819936bfc8045b7f0ca0d7d04f16a?pvs=8&n=github_linkback">Player movement 구현(script)</a>
author_association: NONE
user: login: Dancookie
created_at: 2025-05-06T13:10:28Z
body: 이거 해봤는데 무빙 되게 재밌고 깔끔한 거 같아요 그런데 카메라 각도를 설정하신 건가요? 사진처럼 너무 카메라가 바닥만 보는데 저는 전방 ~ 전방에서 30도 정도 아래를 생각했어서 조금 시야 부분에서 불편함이 있었어서 의견 드려봅니다...! 앞의 맵을 보고 어떻게 갈지 정해야 하는데 앞이 잘 안 보이네요 ㅜㅜ 
![image](https://github.com/user-attachments/assets/9aa1d072-10a7-42d5-a512-00330aeae982)

author_association: CONTRIBUTOR
user: login: notion-workspace[bot]
created_at: 2025-05-10T05:39:12Z
body: <a href="https://www.notion.so/camera-1e3819936bfc80558330c9c600a54c47?pvs=8&n=github_linkback">camera</a>
author_association: NONE
user: login: Mathshyun
created_at: 2025-05-11T06:28:28Z
body: 경사면 올라갈 때 통통 튀면서 올라가는 거 같은데 좀 고민해봐야 할 것 같아요
author_association: CONTRIBUTOR
user: login: trz-21
created_at: 2025-05-11T06:29:14Z
body: > 경사면 올라갈 때 통통 튀면서 올라가는 거 같은데 좀 고민해봐야 할 것 같아요

@Mathshyun 그거 저도 인지하고 있고 고쳐보려고 노력을 해봤는데 잘 안되더라고요.. 일단 이대로 사용하고 추후 디테일 보충해도 좋을 것 같아서 일단 올려봤어요
author_association: CONTRIBUTOR
user: login: trz-21
created_at: 2025-05-11T06:29:20Z
body: 또는 좋은 아이디어 있으신가요
author_association: CONTRIBUTOR