Files
Fishing2/Assets/Scripts/ThirdParty/Rope/Examples/01_DynamicAttach/DynamicAttach.cs
2025-11-04 23:11:56 +08:00

90 lines
2.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace NBF.Example
{
public class DynamicAttach : MonoBehaviour
{
public Material ropeMaterial;
public Vector3 attachPoint;
public Transform target;
public Vector3 targetAttachPoint;
public SimpleRopeInteraction ropeInteraction;
protected GameObject ropeObject;
protected Rect guiRect = new Rect(Screen.width - 210, 10, 200, 0);
public void Detach()
{
if (ropeObject)
{
Destroy(ropeObject);
}
ropeObject = null;
if (ropeInteraction)
{
ropeInteraction.ropes.Clear();
}
}
public void Attach()
{
Detach();
ropeObject = new GameObject();
ropeObject.name = "Rope";
var start = transform.TransformPoint(attachPoint);
var end = target.TransformPoint(targetAttachPoint);
var rope = ropeObject.AddComponent<Rope>();
rope.material = ropeMaterial;
rope.spawnPoints.Add(ropeObject.transform.InverseTransformPoint(start));
rope.spawnPoints.Add(ropeObject.transform.InverseTransformPoint(end));
var conn0 = ropeObject.AddComponent<RopeConnection>();
conn0.type = RopeConnectionType.PinRopeToTransform;
conn0.ropeLocation = 0.0f;
conn0.transformSettings.transform = transform;
conn0.localConnectionPoint = attachPoint;
var conn1 = ropeObject.AddComponent<RopeConnection>();
conn1.type = RopeConnectionType.PinRopeToTransform;
conn1.ropeLocation = 1.0f;
conn1.transformSettings.transform = target;
conn1.localConnectionPoint = targetAttachPoint;
if (ropeInteraction)
{
ropeInteraction.ropes.Add(rope);
}
}
protected void Window(int id)
{
if (GUILayout.Button("Attach"))
{
Attach();
}
if (GUILayout.Button("Detach"))
{
Detach();
}
GUI.enabled = false;
GUILayout.Label("Instructions: Use the buttons above to dynamically attach and detach a rope from the scene.");
GUI.enabled = true;
}
public void OnGUI()
{
guiRect = GUILayout.Window(1, guiRect, Window, "Dynamic attach");
}
}
}