0

我有一个混合树的问题,我正在使用它和一个脚本来改变浮动,这样我就可以控制玩家的动画。但是混合树中的参数值在返回 0 时变得疯狂。它开始出现随机数,我知道修复它的唯一方法是手动重置它。

这是击中 0 后发生的情况 --> 发生了 什么.gif

有没有办法我错误地使用混合树或统一的新错误?有任何想法吗??

动画控制器

动画控制器.jpg

第三人称角色控制器

    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;
    }

注意:混合树的参数是“speedPercent”

4

1 回答 1

0

我不确定,但我认为你看到的值非常接近于零,以至于它已经变成指数形式,就像 Unity 总是对较小的值一样参考

这是因为您正在使用平滑过渡SetFloat

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

尝试这个

animator.SetFloat("speedPercent", animationSpeedPercent);

于 2020-07-06T10:08:53.913 回答