Search code examples
unity-game-engineanimationanimationcontroller

Problem with blend tree when float return 0 in unity 2019.4.1f1


I have a problem with blend tree which I'm using it and a script to change the float so I can control the player's animation. But the value of the parameter in the blend tree went crazy when it return to 0. It start appearing random numbers and the only way I know to fix it is to reset it manually.

This is what happen after hitting 0 --> what happen.gif

Is it there way I use the blend tree wrong or a new bug in unity?. Any ideas??

AnimationController

animationController.jpg

ThirdPersonCharacterController

    public float walkSpeed = 2;
    public float runSpeed = 6;
    public float gravity = -12;
    public float jumpHeight = 1;
    public float airControlPercent;

    public float turnSmoothTime = 0.2f;
    float turnSmoothVelocity;

    public float speedSmoothTime = 0.1f;
    float speedSmoothVelocity;
    float currentSpeed;
    float velocityY;

    Animator animator;
    Transform cameraT;
    CharacterController controller;

    void Start () {
        animator = GetComponent<Animator> ();
        cameraT = Camera.main.transform;
        controller = GetComponent<CharacterController> ();
    }

    void Update () {
        // input
        Vector2 input = new Vector2 (Input.GetAxisRaw ("Horizontal"), Input.GetAxisRaw ("Vertical"));
        Vector2 inputDir = input.normalized;
        bool running = Input.GetKey (KeyCode.LeftShift);

        Move (inputDir, running);

        if (Input.GetKeyDown (KeyCode.Space)) {
            Jump ();
        }
        // animator
        float animationSpeedPercent = ((running) ? currentSpeed / runSpeed : currentSpeed / walkSpeed * .5f);
        animator.SetFloat ("speedPercent", animationSpeedPercent, speedSmoothTime, Time.deltaTime);

    }

    void Move(Vector2 inputDir, bool running) {
        if (inputDir != Vector2.zero) {
            float targetRotation = Mathf.Atan2 (inputDir.x, inputDir.y) * Mathf.Rad2Deg + cameraT.eulerAngles.y;
            transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref turnSmoothVelocity, GetModifiedSmoothTime(turnSmoothTime));
        }
            
        float targetSpeed = ((running) ? runSpeed : walkSpeed) * inputDir.magnitude;
        currentSpeed = Mathf.SmoothDamp (currentSpeed, targetSpeed, ref speedSmoothVelocity, GetModifiedSmoothTime(speedSmoothTime));

        velocityY += Time.deltaTime * gravity;
        Vector3 velocity = transform.forward * currentSpeed + Vector3.up * velocityY;

        controller.Move (velocity * Time.deltaTime);
        currentSpeed = new Vector2 (controller.velocity.x, controller.velocity.z).magnitude;

        if (controller.isGrounded) {
            velocityY = 0;
        }

    }

    void Jump() {
        if (controller.isGrounded) {
            float jumpVelocity = Mathf.Sqrt (-2 * gravity * jumpHeight);
            velocityY = jumpVelocity;
        }
    }

    float GetModifiedSmoothTime(float smoothTime) {
        if (controller.isGrounded) {
            return smoothTime;
        }

        if (airControlPercent == 0) {
            return float.MaxValue;
        }
        return smoothTime / airControlPercent;
    }

Note: the parameter for the blend tree is "speedPercent"


Solution

  • I am not sure but i think that the value you are seeing is so near to zero that it has gone to exponential form as Unity always does for smaller values like ref

    And this is because you are using smooth transition for SetFloat

    animator.SetFloat ("speedPercent", animationSpeedPercent, speedSmoothTime, Time.deltaTime);

    Try this

    animator.SetFloat ("speedPercent", animationSpeedPercent);