From 9f841c4828960a80413c2c1e6fe75311dc55fe02 Mon Sep 17 00:00:00 2001 From: jsy2026 Date: Sun, 1 Feb 2026 14:47:27 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AC=BC=EC=9B=85=EB=8D=A9=EC=9D=B4,=20?= =?UTF-8?q?=EB=B0=A7=EC=A4=84=20=EC=9B=80=EC=A7=81=EC=9E=84=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scenes/TestScene.unity | 100 ++++++++++++++++++ Assets/Scripts/Prop/Rope.meta | 8 ++ Assets/Scripts/Prop/Rope/Rope2D.cs | 62 +++++++++++ Assets/Scripts/Prop/Rope/Rope2D.cs.meta | 2 + Assets/Scripts/Prop/Rope/RopeRenderer.cs | 28 +++++ Assets/Scripts/Prop/Rope/RopeRenderer.cs.meta | 2 + 6 files changed, 202 insertions(+) create mode 100644 Assets/Scripts/Prop/Rope.meta create mode 100644 Assets/Scripts/Prop/Rope/Rope2D.cs create mode 100644 Assets/Scripts/Prop/Rope/Rope2D.cs.meta create mode 100644 Assets/Scripts/Prop/Rope/RopeRenderer.cs create mode 100644 Assets/Scripts/Prop/Rope/RopeRenderer.cs.meta diff --git a/Assets/Scenes/TestScene.unity b/Assets/Scenes/TestScene.unity index 414d34c..5dc0363 100644 --- a/Assets/Scenes/TestScene.unity +++ b/Assets/Scenes/TestScene.unity @@ -3508,6 +3508,105 @@ Transform: m_CorrespondingSourceObject: {fileID: 7588602306031819191, guid: dd314a3f767a46446b652103ace62042, type: 3} m_PrefabInstance: {fileID: 590924598} m_PrefabAsset: {fileID: 0} +--- !u!1 &1177009317 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1177009320} + - component: {fileID: 1177009319} + - component: {fileID: 1177009321} + m_Layer: 0 + m_Name: GameObject (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!61 &1177009319 +BoxCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1177009317} + m_Enabled: 1 + serializedVersion: 3 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 1 + m_UsedByEffector: 1 + m_CompositeOperation: 0 + m_CompositeOrder: 0 + m_Offset: {x: 0, y: 0} + m_SpriteTilingProperty: + border: {x: 0, y: 0, z: 0, w: 0} + pivot: {x: 0, y: 0} + oldSize: {x: 0, y: 0} + newSize: {x: 0, y: 0} + adaptiveTilingThreshold: 0 + drawMode: 0 + adaptiveTiling: 0 + m_AutoTiling: 0 + m_Size: {x: 1, y: 5} + m_EdgeRadius: 0 +--- !u!4 &1177009320 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1177009317} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.72, y: -5.7, z: 0} + m_LocalScale: {x: 2.03, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!253 &1177009321 +BuoyancyEffector2D: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1177009317} + m_Enabled: 1 + m_UseColliderMask: 1 + m_ColliderMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_SurfaceLevel: 2.4 + m_Density: 0 + m_LinearDamping: 20 + m_AngularDamping: 10 + m_FlowAngle: 0 + m_FlowMagnitude: 0 + m_FlowVariation: 0 --- !u!1 &1190488655 GameObject: m_ObjectHideFlags: 0 @@ -5069,3 +5168,4 @@ SceneRoots: - {fileID: 1478180731} - {fileID: 1995838084} - {fileID: 2026865174} + - {fileID: 1177009320} diff --git a/Assets/Scripts/Prop/Rope.meta b/Assets/Scripts/Prop/Rope.meta new file mode 100644 index 0000000..998cb7b --- /dev/null +++ b/Assets/Scripts/Prop/Rope.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 48a39c9b49fa6a441a9b788f5209c16e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Prop/Rope/Rope2D.cs b/Assets/Scripts/Prop/Rope/Rope2D.cs new file mode 100644 index 0000000..63075e5 --- /dev/null +++ b/Assets/Scripts/Prop/Rope/Rope2D.cs @@ -0,0 +1,62 @@ +using UnityEngine; +using System.Collections.Generic; + +public class Rope2D : MonoBehaviour +{ + [SerializeField] private Transform startPoint; + [SerializeField] private Transform endPoint; + [SerializeField] private GameObject ropeSegmentPrefab; + [SerializeField] private int segmentCount = 10; + + [HideInInspector] public List ropeSegments = new List(); + + [ContextMenu("Generate Rope")] + private void GenerateRope() + { + RemoveRope(); + + Vector3 startPos = startPoint.position; + Vector3 endPos = endPoint.position; + Rigidbody2D previousRigidbody = null; + + for (int i = 0; i < segmentCount; i++) + { + float t = (float)i / (segmentCount - 1); + Vector3 spawnPos = Vector3.Lerp(startPos, endPos, t); + GameObject segment = Instantiate(ropeSegmentPrefab, spawnPos, Quaternion.identity, transform); + ropeSegments.Add(segment); + HingeJoint2D joint = segment.GetComponent(); + + if (i == 0) + { + segment.GetComponent().bodyType = RigidbodyType2D.Static; + } + else + { + joint.connectedBody = previousRigidbody; + } + + previousRigidbody = segment.GetComponent(); + } + } + + private void RemoveRope() + { + foreach (GameObject segment in ropeSegments) + { + DestroyImmediate(segment); + } + ropeSegments.Clear(); + } + + private void OnDrawGizmos() + { + Gizmos.color = Color.yellow; + for (int i = 0; i < segmentCount; i++) + { + float t = (float)i / (segmentCount - 1); + Vector3 pos = Vector3.Lerp(startPoint.position, endPoint.position, t); + Gizmos.DrawSphere(pos, 0.1f); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Prop/Rope/Rope2D.cs.meta b/Assets/Scripts/Prop/Rope/Rope2D.cs.meta new file mode 100644 index 0000000..838da96 --- /dev/null +++ b/Assets/Scripts/Prop/Rope/Rope2D.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1cee6270fbd1842429e1ec4d6350bbc4 \ No newline at end of file diff --git a/Assets/Scripts/Prop/Rope/RopeRenderer.cs b/Assets/Scripts/Prop/Rope/RopeRenderer.cs new file mode 100644 index 0000000..57905da --- /dev/null +++ b/Assets/Scripts/Prop/Rope/RopeRenderer.cs @@ -0,0 +1,28 @@ +using UnityEngine; + +[RequireComponent(typeof(LineRenderer))] +public class RopeRenderer : MonoBehaviour +{ + [SerializeField] private Rope2D ropeCreator; + private LineRenderer lineRenderer; + + private void Start() + { + lineRenderer = GetComponent(); + } + + private void Update() + { + if (ropeCreator == null || ropeCreator.ropeSegments.Count == 0) + { + return; + } + + lineRenderer.positionCount = ropeCreator.ropeSegments.Count; + + for (int i = 0; i < ropeCreator.ropeSegments.Count; i++) + { + lineRenderer.SetPosition(i, ropeCreator.ropeSegments[i].transform.position); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Prop/Rope/RopeRenderer.cs.meta b/Assets/Scripts/Prop/Rope/RopeRenderer.cs.meta new file mode 100644 index 0000000..66542bf --- /dev/null +++ b/Assets/Scripts/Prop/Rope/RopeRenderer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e418e743fe84926449be9bd03e646603 \ No newline at end of file