diff --git a/Assets/Scenes/Ingame.unity b/Assets/Scenes/Ingame.unity
index 0556feb..005fcc1 100644
--- a/Assets/Scenes/Ingame.unity
+++ b/Assets/Scenes/Ingame.unity
@@ -4427,7 +4427,7 @@ PrefabInstance:
- target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_AnchorMax.y
- value: 0
+ value: 1
objectReference: {fileID: 0}
- target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
@@ -4437,27 +4437,27 @@ PrefabInstance:
- target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_AnchorMin.y
- value: 0
+ value: 1
objectReference: {fileID: 0}
- target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_SizeDelta.x
- value: 0
+ value: 480
objectReference: {fileID: 0}
- target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_SizeDelta.y
- value: 0
+ value: 600
objectReference: {fileID: 0}
- target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_AnchoredPosition.x
- value: 0
+ value: 750
objectReference: {fileID: 0}
- target: {fileID: 1561733016117246437, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_AnchoredPosition.y
- value: 0
+ value: -300
objectReference: {fileID: 0}
- target: {fileID: 3550758221024711263, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
@@ -4577,7 +4577,7 @@ PrefabInstance:
- target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_AnchorMax.y
- value: 0
+ value: 1
objectReference: {fileID: 0}
- target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
@@ -4587,27 +4587,27 @@ PrefabInstance:
- target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_AnchorMin.y
- value: 0
+ value: 1
objectReference: {fileID: 0}
- target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_SizeDelta.x
- value: 0
+ value: 480
objectReference: {fileID: 0}
- target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_SizeDelta.y
- value: 0
+ value: 600
objectReference: {fileID: 0}
- target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_AnchoredPosition.x
- value: 0
+ value: 1260
objectReference: {fileID: 0}
- target: {fileID: 6974954132386231314, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_AnchoredPosition.y
- value: 0
+ value: -300
objectReference: {fileID: 0}
- target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
@@ -4617,7 +4617,7 @@ PrefabInstance:
- target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_AnchorMax.y
- value: 0
+ value: 1
objectReference: {fileID: 0}
- target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
@@ -4627,27 +4627,27 @@ PrefabInstance:
- target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_AnchorMin.y
- value: 0
+ value: 1
objectReference: {fileID: 0}
- target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_SizeDelta.x
- value: 0
+ value: 480
objectReference: {fileID: 0}
- target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_SizeDelta.y
- value: 0
+ value: 600
objectReference: {fileID: 0}
- target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_AnchoredPosition.x
- value: 0
+ value: 240
objectReference: {fileID: 0}
- target: {fileID: 9212598073689065413, guid: 9071d6ddb5d4f854185629ee1970af50,
type: 3}
propertyPath: m_AnchoredPosition.y
- value: 0
+ value: -300
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
@@ -135712,7 +135712,6 @@ Transform:
- {fileID: 554302359}
- {fileID: 1377441407}
- {fileID: 671227345}
- - {fileID: 1648360768}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1085714285
@@ -142383,7 +142382,8 @@ Transform:
m_LocalPosition: {x: 0, y: 0.5, z: 10}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
- m_Children: []
+ m_Children:
+ - {fileID: 1648360768}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1251841320
@@ -300096,6 +300096,7 @@ GameObject:
- component: {fileID: 1648360768}
- component: {fileID: 1648360770}
- component: {fileID: 1648360769}
+ - component: {fileID: 1648360771}
m_Layer: 0
m_Name: GameObject
m_TagString: Untagged
@@ -300111,12 +300112,12 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1648360767}
serializedVersion: 2
- m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
- m_LocalPosition: {x: 153, y: -6, z: 0}
- m_LocalScale: {x: 400, y: 1, z: 1}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: -5.1226563, z: -10}
+ m_LocalScale: {x: 100, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
- m_Father: {fileID: 1082779267}
+ m_Father: {fileID: 1251841319}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!61 &1648360769
BoxCollider2D:
@@ -300162,7 +300163,7 @@ BoxCollider2D:
drawMode: 0
adaptiveTiling: 0
m_AutoTiling: 0
- m_Size: {x: 1, y: 1}
+ m_Size: {x: 53.12, y: 1}
m_EdgeRadius: 0
--- !u!50 &1648360770
Rigidbody2D:
@@ -300191,6 +300192,18 @@ Rigidbody2D:
m_SleepingMode: 0
m_CollisionDetection: 0
m_Constraints: 0
+--- !u!114 &1648360771
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1648360767}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f210addf0dc44e246b727396fba0b57d, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::EerieVillage.Background.InfiniteHorizontalGround
--- !u!1 &1649507902
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/Scripts/Background/InfiniteHorizontalGround.cs b/Assets/Scripts/Background/InfiniteHorizontalGround.cs
new file mode 100644
index 0000000..3cd6682
--- /dev/null
+++ b/Assets/Scripts/Background/InfiniteHorizontalGround.cs
@@ -0,0 +1,81 @@
+using UnityEngine;
+
+namespace EerieVillage.Background
+{
+ ///
+ /// 무한 가로 스크롤 지면 collider — BoxCollider 재활용 reposition 패턴.
+ /// PD 지시 (2026-05-10·결정 "(나) 형태로 진행해"): 맵 최하단 이동 가능 길·맵에 맞게 사이즈 자동.
+ /// InfiniteHorizontalBackground 동일 패턴·BoxCollider 영역 적용.
+ ///
+ /// 동작:
+ /// - Start: BoxCollider size.x 측정 + 자식 사본 2개 (Left·Right) BoxCollider 자동 생성.
+ /// 자식 collider는 부모 Static Rb attachedRigidbody 자동 상속 (Unity 2D Physics 표준).
+ /// - LateUpdate: Camera.x 영역 BoxCollider 폭 영역 정수 배수 root reposition.
+ ///
+ /// 효율: BoxCollider 1개 + 자식 2개 = 3개·Camera 영역 항상 collide 정합.
+ ///
+ [RequireComponent(typeof(BoxCollider2D))]
+ public class InfiniteHorizontalGround : MonoBehaviour
+ {
+ Transform _camTr;
+ float _colliderWidth;
+ Transform _leftCopy;
+ Transform _rightCopy;
+
+ void Start()
+ {
+ var cam = Camera.main;
+ if (cam == null)
+ {
+ Debug.LogWarning($"[InfiniteHorizontalGround@{name}] Camera.main NULL — disable.");
+ enabled = false;
+ return;
+ }
+ _camTr = cam.transform;
+
+ var box = GetComponent();
+ // 월드 단위 BoxCollider 폭 (lossyScale 적용)
+ _colliderWidth = box.size.x * transform.lossyScale.x;
+ if (_colliderWidth <= 0.001f)
+ {
+ Debug.LogWarning($"[InfiniteHorizontalGround@{name}] colliderWidth ~0 — disable.");
+ enabled = false;
+ return;
+ }
+
+ // 자식 사본 2개 — Left·Right
+ _leftCopy = CreateCopy("Left", -_colliderWidth, box);
+ _rightCopy = CreateCopy("Right", +_colliderWidth, box);
+ }
+
+ Transform CreateCopy(string copyName, float worldOffsetX, BoxCollider2D src)
+ {
+ var copy = new GameObject(copyName);
+ copy.transform.SetParent(transform, false);
+ copy.layer = gameObject.layer;
+ // localPosition은 parent.lossyScale 영향 — local 단위 변환
+ float localOffsetX = worldOffsetX / transform.lossyScale.x;
+ copy.transform.localPosition = new Vector3(localOffsetX, 0f, 0f);
+ copy.transform.localScale = Vector3.one;
+
+ var box = copy.AddComponent();
+ box.size = src.size;
+ box.offset = src.offset;
+ box.isTrigger = src.isTrigger;
+ box.sharedMaterial = src.sharedMaterial;
+ return copy.transform;
+ }
+
+ void LateUpdate()
+ {
+ if (_camTr == null) return;
+
+ float dx = _camTr.position.x - transform.position.x;
+ if (Mathf.Abs(dx) >= _colliderWidth)
+ {
+ int n = Mathf.RoundToInt(dx / _colliderWidth);
+ transform.position += new Vector3(n * _colliderWidth, 0f, 0f);
+ }
+ }
+ }
+}
diff --git a/Assets/Scripts/Background/InfiniteHorizontalGround.cs.meta b/Assets/Scripts/Background/InfiniteHorizontalGround.cs.meta
new file mode 100644
index 0000000..736113d
--- /dev/null
+++ b/Assets/Scripts/Background/InfiniteHorizontalGround.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: f210addf0dc44e246b727396fba0b57d
\ No newline at end of file