I have a 2D Freeform Blend Tree that I’m using to animate a character that can currently:
- Walk / Sprint Forward
- Walk / Sprint Backward
- Strafe / Sprint Strafe Left
- Strafe / Sprint Strafe Right
- Idle
My goal is to add in rotation, jump, crouch, and “firing when walking” animations.
In just dealing with turning or even jumping for now, I understand how to handle and call the animations in the code, but not sure of how it should be set up in the animator.
Do I transition to rotation/jump animations on the base layer? I’m reserved doing it this way because I lose the ability to blend and take advantage of those transitions.
Can I build it into my current 2D blend tree even though the blend tree is only X and Z axis?

public class twoDControllerMovement : MonoBehaviour
{
Animator animator;
public CharacterController controller;
(SerializeField) private float walkSpeed = 12.0f;
(SerializeField) private float strafeSpeed = 10.0f;
(SerializeField) private float sprintMultipler = 2.0f;
(SerializeField) private float rotationSpeed = 120.0f;
// Start is called before the first frame update
void Start()
{
animator = GetComponent<Animator>();
controller = GetComponent<CharacterController>();
}
// Update is called once per frame
void Update()
{
// handle sprint
float currentWalkSpeed = walkSpeed;
float currentStrafeSpeed = strafeSpeed;
bool runPressed = false;
// handle shift
if (Input.GetKey(KeyCode.LeftShift))
{
currentWalkSpeed = walkSpeed * sprintMultipler;
currentStrafeSpeed = strafeSpeed * sprintMultipler;
runPressed = true;
}
// calculate movement
float strafe = Input.GetAxis("Strafe") * currentStrafeSpeed * Time.deltaTime;
float translation = Input.GetAxis("Vertical") * currentWalkSpeed * Time.deltaTime;
float rotation = Input.GetAxis("Horizontal") * rotationSpeed * Time.deltaTime;
// execute movement
transform.Translate(strafe, 0f, translation);
transform.Rotate(0, rotation, 0f);
// handle movement animations
if (runPressed) {
animator.SetFloat("VelocityZ", Input.GetAxis("Vertical") * sprintMultipler);
animator.SetFloat("VelocityX", Input.GetAxis("Strafe") * sprintMultipler);
} else
{
animator.SetFloat("VelocityZ", Input.GetAxis("Vertical"));
animator.SetFloat("VelocityX", Input.GetAxis("Strafe"));
}
// handle roration animations
if (Input.GetAxis("Horizontal") < 0.1f)
{
//Debug.Log(Input.GetAxis("Horizontal"));
} else if (Input.GetAxis("Horizontal") > 0.1f)
{
//Debug.Log(Input.GetAxis("Horizontal"));
}
}
}
Also open to any feedback on improving the code above, my goal is as small and clean as possible! I do have a slight delay in animations starting when switching directions that I have to work out at some point and would eventually.