How do I rotate specific joints/bones using a script?
How do I rotate specific joints/bones using a script? I created a basic humanoid character in Blender, and attached a rig to it and created several animations. I created a script and set up the Animator Controller such that my character will do specific animations when I press a key.
Now, I am trying to build on top of this by creating a script that will allow me to manipulate specific joints/bones by pressing a key. I know that bones in Unity are treated as Transform objects, but I do not know the correct syntax for selecting or rotating a specific bone. My end goal is to be able to press a button and have a specific joint (e.g. the left arm) rotate.
For reference, here is my current model.
Here is the current setup I have on the Animator.
And here is the code I have on my script.
using UnityEngine; using System.Collections;
public class GraspScript : MonoBehaviour { private Animator anim; private int grasper;
// Use this for initialization
void Start () {
anim = GetComponent<Animator> ();
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown (KeyCode.Alpha1)) {
grasper = 1;
} else if (Input.GetKeyDown (KeyCode.Alpha2)) {
grasper = 2;
} else if (Input.GetKeyDown (KeyCode.Alpha3)) {
grasper = 3;
} else if (Input.GetKeyDown (KeyCode.Alpha4)) {
grasper = 4;
} else if (Input.GetKeyDown (KeyCode.Space)) {
grasper = 0;
}
anim.SetInteger ("grasp", grasper);
Debug.Log (grasper);
}
} Thank you so much for your help!
Answer by Brodcouille · Mar 17, 2017 at 03:52 PM
All of your joints are considered as GameObject in your rig hierarchy (in the inspector). You can apply a transform to these GameObject :
// You store the transform of your specific gameObject //Rig should be metarig.001 in your case (avoid using "." as name for your gameObjects) Transform jointObj = Rig.transform.FindChild(boneName);
//we set the rotation you want on your joint (we transform the euler angles in quaternion) Vector3 rot = new Vector3(rot.x + 90f, rot.y, rot.z); jointObj.rotation = Quaternion.Euler(rot);
keep in mind that your rotation transform inherit from the parents if you want to change only the local rotation, use --> jointObj.localRotation = Quaternion.Euler(rot);
Your answer
Follow this Question
Related Questions
Animator transitions not working at all 2 Answers
Animation Running Game 0 Answers
Specific Animation not Playing 0 Answers
NEED HELP ANIMATING PLAYER MOVEMENT 0 Answers
How can I create a single Animator Controller for all of my Enemies animations? 0 Answers