using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class RopeRoot : MonoBehaviour { public float RigidbodyMass = 1f; public float ColliderRadius = 0.1f; public float JointSpring = 0.1f; public float JointDamper = 5f; public Vector3 RotationOffset; public Vector3 PositionOffset; protected List CopySource; protected List CopyDestination; protected static GameObject RigidBodyContainer; void Awake() { if(RigidBodyContainer == null) RigidBodyContainer = new GameObject("RopeRigidbodyContainer"); CopySource = new List(); CopyDestination = new List(); //add children AddChildren(transform); } private void AddChildren(Transform parent) { for (int i = 0; i < parent.childCount; i++) { var child = parent.GetChild(i); var representative = new GameObject(child.gameObject.name); representative.transform.parent = RigidBodyContainer.transform; //rigidbody var childRigidbody = representative.gameObject.AddComponent(); childRigidbody.useGravity = true; childRigidbody.isKinematic = false; childRigidbody.freezeRotation = true; childRigidbody.mass = RigidbodyMass; //collider var collider = representative.gameObject.AddComponent(); collider.center = Vector3.zero; collider.radius = ColliderRadius; //DistanceJoint var joint = representative.gameObject.AddComponent(); joint.ConnectedRigidbody = parent; joint.DetermineDistanceOnStart = true; joint.Spring = JointSpring; joint.Damper = JointDamper; joint.DetermineDistanceOnStart = false; joint.Distance = Vector3.Distance(parent.position, child.position); //add copy source CopySource.Add(representative.transform); CopyDestination.Add(child); AddChildren(child); } } public void Update() { for (int i = 0; i < CopySource.Count; i++) { CopyDestination[i].position = CopySource[i].position + PositionOffset; CopyDestination[i].rotation = CopySource[i].rotation * Quaternion.Euler(RotationOffset); } } }