0
\$\begingroup\$

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?

enter image description here

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.

\$\endgroup\$
3
  • \$\begingroup\$ Good question, I am terrible with these kinds of animators myself. If I had to guess, I would think you would want to put your rotation animations on a separate layer (since they need to blend with your walking animations). Jump probably needs to be on the base layer since that will probably override every animation, Crouch animations will also probably need to be on your base layer but in a separate blend tree since. That's my guess but I would love to see how someone with more animator experience puts together these kinds of controllers. \$\endgroup\$ Jan 22, 2021 at 1:51
  • \$\begingroup\$ Going that route, wouldn't you have to recreate the walk blend with the rotation layer, and then the walk blend with the crouch later (provided you could walk when crouched). Seems duplicative but would work I think. \$\endgroup\$
    – benbastien
    Jan 22, 2021 at 19:24
  • \$\begingroup\$ Unfortunately you are probably going to have to create some really similar blend trees (almost identical for crouch/walk/run states). As for rotation I think it will probably be a bit difference since you will most likely only have a 1 to 3 turn animations for each direct (lean, turn, extreme turn) but I'm guessing here. I don't know if Unity has a modern example but they used to have a 3rd person animator example for their Ethan character. No idea if it ever got updated or just depreciated. I don't think it used layers just walk while turning animations. \$\endgroup\$ Jan 23, 2021 at 10:06

0

You must log in to answer this question.

Browse other questions tagged .