我正在为 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”功能中停止动画,并且它工作正常。但我不喜欢在碰撞检测中使用标签。
您的输入阅读器似乎可以捕获多次跳转?这意味着在
Move()
函数中,您可能会读取按下跳跃键的多个帧,并在角色实际离开地面并开始未通过地面检查之前施加多个跳跃力。
我认为你应该在
Update()
期间进行输入检查,而不是 FixedUpdate()
...所以也许这就是导致问题的原因。
OnKeyPress 应该 每个更新帧只发生一次,但同样,您可能会在每个固定更新调用中获得多次......
来自 https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html:
“从 Update 函数调用此函数,因为状态每帧都会重置。直到用户释放按键并再次按下它才会返回 true。”
如果这不是问题,您可以验证一下 maxDistance、jumpSpeed 和 boxsize 设置的值吗?