Need Advice on Rotation Animation with 2D Blendtree
I have a 2D Freeform Blendtree that I'm using to animate a character that can:
-Walk / Sprint Forward
-Walk / Sprint Backward
-Strafe / Sprint Strafe Left
-Strafe / Sprint Strafe Right
-Idle
I am a bit stuck on how to best implement animations for turning or even jumping. 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 animations on the base layer? Can I build it into a 2D blend tree even though the blend tree is only X and Z axis? I also plan on adding Jumping and crouching, though I'm assuming however I handle rotation animations I could use the same method.
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 any advice on improving the code I am open to as well! I do have a slight delay in animations starting when switching directions that I have to work out at some point.
Your answer
Follow this Question
Related Questions
How to make my custom 3rd person character jump? 0 Answers
How do you make sure that when you land on an object, an animation starts? 0 Answers
I draged to far from the animator, how can I come back? 1 Answer
How to set the blend tree threshold value during run time? 0 Answers
How to replace an Animation State in Animator, without rebuilding all the transitions? 1 Answer