使用BoxCast进行地面检测时Unity跳跃动画的问题

问题描述 投票:0回答:1

我正在为 Android 设备开发一款无尽的跑酷平台游戏,但我遇到了问题。我使用 BoxCast 进行地面检测,但动画无法正常工作。有时,在第一次跳跃时,它会跳得比应有的更高。我认为问题在于我在 GroundCheck 函数中停止动画的方式。看起来它立即停止了动画。但我找不到任何其他地方可以停止动画。请你们帮忙解决这个问题吗?动画师也附加到模型上,并且它是玩家游戏对象的子级。 (如果您不喜欢代码,请说出您的意见,我正在努力做得更好)

using UnityEngine;

public class Player : MonoBehaviour
{
    [Header("Move Settings")]
    [SerializeField] float jumpSpeed = 5f;
    [SerializeField] float normalSpeed = .2f;
    [SerializeField] float slowSpeed = .01f;
    [SerializeField] float slowAnimationSpeed = .02f;

    [Header("CastBox Settings")]
    public Vector3 boxsize;
    public float maxDistance;
    public LayerMask layerMask;

    //Cached References
    private Rigidbody playerRigidBody;
    private Animator playerAnimator;

    //Properties
    private bool canDoubleJump = false;
    private Vector3 jumpInput;
    private float moveSpeed;


    private void Awake()
    {
        playerRigidBody = GetComponent<Rigidbody>();
        playerAnimator = GetComponentInChildren<Animator>();

    }

    private void Start()
    {
        moveSpeed = normalSpeed;
        jumpInput = Vector3.up * jumpSpeed;
    }

    private void FixedUpdate()
    {
        GroundCheck();
        Move();
    }

    private void OnJump()
    {
        if (GroundCheck())
        {
            Jump();
            canDoubleJump = true;
            playerAnimator.SetBool("Jump", true);

        }
        else if (!GroundCheck() && canDoubleJump)
        {
            Jump();
            playerAnimator.SetBool("DoubleJump", true);
            canDoubleJump = false;
        }
    }

    private void Jump()
    {
        playerRigidBody.AddForce(jumpInput, ForceMode.Impulse);

    }

    private void Move()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            OnJump();
        }

        if (Input.GetKey(KeyCode.LeftShift) && GroundCheck())
        {
            SlowSpeed();
        }
        else
        {
            NormalSpeed();
        }
        transform.position += Vector3.right * moveSpeed;

    }

    private void SlowSpeed()
    {
        moveSpeed = slowSpeed;
        playerAnimator.speed = slowAnimationSpeed;
    }

    private void NormalSpeed()
    {
        moveSpeed = normalSpeed;
        playerAnimator.speed = 1;
    }

    bool GroundCheck()
    {
        if (Physics.BoxCast(transform.position, boxsize,
            -transform.up, transform.rotation, maxDistance, layerMask))
        {
            playerAnimator.SetBool("Jump", false);
            playerAnimator.SetBool("DoubleJump", false);
            return true;
        }
        else
        {
            return false;
        }

    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawCube(transform.position - transform.up * maxDistance, boxsize);
    }
}

我尝试使用 didJumpStopped bool,但它不起作用或者我用错了。 我尝试在不同的地方将两个动画布尔值设置为 false,但它也不起作用。 在我的第一个原型中,我在道路上带有“Ground”标签的“OncollisionEnter”功能中停止动画,并且它工作正常。但我不喜欢在碰撞检测中使用标签。

c# unity-game-engine animation game-development unityscript
1个回答
0
投票

您的输入阅读器似乎可以捕获多次跳转?这意味着在

Move()
函数中,您可能会读取按下跳跃键的多个帧,并在角色实际离开地面并开始未通过地面检查之前施加多个跳跃力。

我认为你应该在

Update()
期间进行输入检查,而不是
FixedUpdate()
...所以也许这就是导致问题的原因。

OnKeyPress 应该 每个更新帧只发生一次,但同样,您可能会在每个固定更新调用中获得多次......

来自 https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html

“从 Update 函数调用此函数,因为状态每帧都会重置。直到用户释放按键并再次按下它才会返回 true。”

如果这不是问题,您可以验证一下 maxDistance、jumpSpeed 和 boxsize 设置的值吗?

© www.soinside.com 2019 - 2024. All rights reserved.