【问题标题】:Problem with blend tree when float return 0 in unity 2019.4.1f1当浮点数在统一 2019.4.1f1 中返回 0 时混合树出现问题
【发布时间】:2020-07-05 14:06:23
【问题描述】:

我在使用混合树和更改浮动的脚本时遇到问题,以便我可以控制播放器的动画。但是混合树中的参数值在返回 0 时变得疯狂。它开始出现随机数,我知道修复它的唯一方法是手动重置它。

这是命中 0 后发生的情况 --> what happen.gif

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

动画控制器

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

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

【问题讨论】:

  • 您能否为这个问题提供一些代码和更多上下文?它将帮助我们了解问题并让我们提供更全面的解决方案。
  • 我已经添加了一些代码和图片。非常感谢。

标签: unity3d animation animationcontroller


【解决方案1】:

我不确定,但我认为您看到的值非常接近于零,以至于它已经变成指数形式,就像 Unity 对较小的值(如 )所做的那样

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

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

试试这个

animator.SetFloat("speedPercent", animationSpeedPercent);

【讨论】:

  • 感谢指出错误!!我会把这篇文章留给和我有同样问题的人。 :D
  • 很高兴为您提供帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多