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);
        }
Пример #2
0
        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);
                    }
                }
            }
        }