using UnityEngine; using System.Collections; public class RagdollUtility { public static void CreateJoints(Transform root) { AddRigidbodies(root); BuildJoints(root); } public static void CleanupJoints(Transform me) { Component[] joints = me.GetComponentsInChildren(typeof(Joint)); foreach (Joint joint in joints) GameObject.DestroyImmediate(joint); Component[] bodies = me.GetComponentsInChildren(typeof(Rigidbody)); foreach (Rigidbody body in bodies) GameObject.DestroyImmediate(body); } /*void OnWizardCreate () { CharacterJoint[] oldJoints = root.GetComponentsInChildren(); for(int i=0; i(); // Setup connection and axis //joint.axis = CalculateDirectionAxis (bone.anchor.InverseTransformDirection(bone.axis)); //joint.secondaryAxis = CalculateDirectionAxis (bone.anchor.InverseTransformDirection(bone.normalAxis)); joint.anchor = oldJoint.anchor; joint.connectedBody = oldJoint.connectedBody; // Setup limits SoftJointLimit limit = new SoftJointLimit (); joint.xMotion = ConfigurableJointMotion.Locked; joint.yMotion = ConfigurableJointMotion.Locked; joint.zMotion = ConfigurableJointMotion.Locked; //joint.angularXMotion = ConfigurableJointMotion.Limited; //joint.angularYMotion = ConfigurableJointMotion.Limited; //joint.angularZMotion = ConfigurableJointMotion.Limited; joint.axis = oldJoint.axis; joint.secondaryAxis = oldJoint.swingAxis; limit.limit = 90; joint.lowAngularXLimit = limit; limit.limit = 90; joint.highAngularXLimit = limit; limit.limit = 90; joint.angularYLimit = limit; limit.limit = 90; joint.angularZLimit = limit; joint.rotationDriveMode = RotationDriveMode.XYAndZ; JointDrive drive = new JointDrive(); drive.mode = JointDriveMode.Position; drive.positionSpring = 1000f; drive.positionDamper = 100f; drive.maximumForce = 1000f; joint.angularXDrive = drive; joint.angularYZDrive = drive; DestroyImmediate(oldJoint); } Debug.Log("DONE"); }*/ public static void AddRigidbodies(Transform root) { foreach(var me in root.gameObject.GetComponentsInChildren()) { me.gameObject.AddComponent(); me.rigidbody.mass=1f; me.rigidbody.drag=1f; me.rigidbody.angularDrag=1f; me.rigidbody.interpolation=RigidbodyInterpolation.Extrapolate; } } public static void BuildJoints(Transform root, Transform me=null) { if(me==null) me=root; if(me.GetComponent()) { Transform parent=me; if(me!=root) { parent=parent.parent; while(parent.gameObject.GetComponent()==null && parent!=root) parent=parent.parent; } if(parent.gameObject.GetComponent()!=null) { CreateCharacterJoint(me, parent); //CreateConfigurableJoint(me, parent); } } foreach (Transform kid in me) { //Debug.Log(kid.name); BuildJoints(root, kid); } } public static void CreateCharacterJoint(Transform me, Transform connectedTransform) { connectedTransform.rigidbody.interpolation=RigidbodyInterpolation.Interpolate; CharacterJoint joint = me.gameObject.AddComponent(); // Setup connection and axis //joint.axis = CalculateDirectionAxis (bone.anchor.InverseTransformDirection(bone.axis)); //joint.secondaryAxis = CalculateDirectionAxis (bone.anchor.InverseTransformDirection(bone.normalAxis)); joint.anchor = Vector3.zero; joint.connectedBody = connectedTransform.rigidbody; } public static void CreateConfigurableJoint(Transform me, Transform connectedTransform) { connectedTransform.rigidbody.interpolation=RigidbodyInterpolation.Interpolate; ConfigurableJoint joint = me.gameObject.AddComponent(); // Setup connection and axis //joint.axis = CalculateDirectionAxis (bone.anchor.InverseTransformDirection(bone.axis)); //joint.secondaryAxis = CalculateDirectionAxis (bone.anchor.InverseTransformDirection(bone.normalAxis)); joint.anchor = Vector3.zero; joint.connectedBody = connectedTransform.rigidbody; // Setup limits SoftJointLimit limit = new SoftJointLimit (); joint.xMotion = ConfigurableJointMotion.Locked; joint.yMotion = ConfigurableJointMotion.Locked; joint.zMotion = ConfigurableJointMotion.Locked; //joint.angularXMotion = ConfigurableJointMotion.Limited; //joint.angularYMotion = ConfigurableJointMotion.Limited; //joint.angularZMotion = ConfigurableJointMotion.Limited; joint.axis = CalculateDirectionAxis(me.position - connectedTransform.position); joint.secondaryAxis = new Vector3(1,0,0); limit.limit = 90; joint.lowAngularXLimit = limit; limit.limit = 90; joint.highAngularXLimit = limit; limit.limit = 90; joint.angularYLimit = limit; limit.limit = 90; joint.angularZLimit = limit; joint.rotationDriveMode = RotationDriveMode.XYAndZ; JointDrive drive = new JointDrive(); //drive.mode = JointDriveMode.Position; drive.mode = JointDriveMode.None; drive.positionSpring = 10f; drive.positionDamper = 1f; drive.maximumForce = 1f; joint.angularXDrive = drive; joint.angularYZDrive = drive; } public static Vector3 CalculateDirectionAxis (Vector3 point) { int direction = 0; float distance; direction = 0; if (Mathf.Abs(point[1]) > Mathf.Abs(point[0])) direction = 1; if (Mathf.Abs(point[2]) >Mathf.Abs(point[direction])) direction = 2; distance = point[direction]; Vector3 axis = Vector3.zero; if (distance > 0) axis[direction] = 1.0F; else axis[direction] = -1.0F; return axis; } }