public static void fillProtoModel(Transform animRoot) { int undoGroup = Undo.GetCurrentGroup(); Undo.IncrementCurrentGroup(); Undo.RegisterFullObjectHierarchyUndo(animRoot, modelName); Transform protoModel = findProtoModel(animRoot); //update body copier if there is one MoveenTransformCopier copier = animRoot.GetComponent <MoveenTransformCopier>(); if (copier != null) { copier.target = protoModel; } updateProtoModel(animRoot, protoModel, (b, t) => { //bone cube for each bone t.gameObject.removeAllChildrenImmediate(true); GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); Undo.RegisterCreatedObjectUndo(cube, modelName); cube.transform.name = modelName + "-bone-cube"; DestroyImmediate(cube.GetComponent <BoxCollider>()); Undo.SetTransformParent(cube.transform, t, "filling " + modelName); float boneR2 = b.r; cube.transform.localScale = new Vector3(boneR2, boneR2 * 0.1f, boneR2 * 0.1f); //cube.transform.SetPositionAndRotation(b.origin.getPos() + b.origin.getRot().rotate(new Vector3(boneR2 / 2, 0, 0)), b.origin.getRot()); cube.transform.localPosition = new Vector3(boneR2 / 2, 0, 0); cube.transform.localRotation = Quaternion.identity; }); {//body cube Transform bodyForGeo = protoModel.GetChild(0); bodyForGeo.gameObject.removeAllChildrenImmediate(true); GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); Undo.RegisterCreatedObjectUndo(cube, modelName); cube.transform.name = modelName + "-body"; DestroyImmediate(cube.GetComponent <BoxCollider>()); Undo.SetTransformParent(cube.transform, bodyForGeo, "filling " + modelName); float boneR2 = 0.3f; cube.transform.localScale = new Vector3(boneR2, boneR2, boneR2); cube.transform.localPosition = Vector3.zero; cube.transform.localRotation = Quaternion.identity; } Undo.CollapseUndoOperations(undoGroup); }
public void createRagdoll() { foreach (var l in component.stepper.GetComponentsInChildren <MoveenSkelWithBones>()) { l.createRagdoll(); } Transform top = null; if (component.stepper.body != null) { top = component.stepper.body; component.usedByStepper = top.GetComponent <Rigidbody>(); } if (top == null) { MoveenTransformCopier copier = component.stepper.GetComponent <MoveenTransformCopier>(); if (copier != null) { top = copier.target; } //don't need component.toConnect in case of copier } if (top == null) { top = component.transform; //in case everything is in moveen hierarchy component.usedByStepper = top.GetComponent <Rigidbody>(); } MoveenSkelWithBones.createCapsule2(top, 0.3f, 0.3f);//TODO better r Transform hipT = null; component.jointsToConnect = new List <Joint>(); if (component.stepper.hip != null) { MoveenTransformCopier connector = component.stepper.hip.GetComponent <MoveenTransformCopier>(); if (connector != null) { hipT = connector.target; } if (hipT == null) { hipT = component.stepper.hip; } MoveenSkelWithBones.createCapsule(hipT, Quaternion.identity, 1);//TODO better r CharacterJoint joint = MoveenSkelWithBones.connectToParentCharacterJoint(hipT, top); top = hipT; if (component.usedByStepper != null && joint != null) { component.jointsToConnect.Add(joint); } } MoveenSkelWithBones[] steps = component.stepper.GetComponentsInChildren <MoveenSkelWithBones>(); foreach (var limb in steps) { Transform affected = MoveenSkelWithBones.getAffected(limb, 0); if (affected != null) { CharacterJoint joint = MoveenSkelWithBones.connectToParentCharacterJoint(affected, top); if (component.usedByStepper != null && joint != null && hipT == null) { component.jointsToConnect.Add(joint); } } } }