所以,我在Unity中设置了一个基本脚本来移动2D精灵,它运行得很好,除了偶尔玩家角色在被告知时不会跳跃的事实。它似乎只发生在角色水平移动的同时或之后不久。我真的不知道为什么会这样。希望其他人可以对此有所了解。这是控制器脚本。任何反馈都是有帮助的,即使它与问题无关,我这样做是为了学习练习。
using UnityEngine;
using System.Collections;
public class PlayerControlsCs : MonoBehaviour {
public KeyCode walkLeft;
public KeyCode walkRight;
public KeyCode jumpUp;
public float speed = 5;
public float jumpForce = 750;
public int jumpCapacity = 1;
public int extraJumps = 0;
public bool facingRight = true;
public bool grounded = false;
private Transform groundCheck;
private Animator anim;
void Awake () {
groundCheck = transform.Find("GroundCheck");
anim = GetComponent<Animator>();
}
void Update () {
grounded = Physics2D.Linecast(transform.position, groundCheck.position, 1 << LayerMask.NameToLayer("Terrain"));
if(grounded){
anim.SetTrigger("Grounded");
anim.ResetTrigger("Falling");
extraJumps = jumpCapacity;
}
else {
anim.ResetTrigger("Grounded");
anim.SetTrigger("Falling");
}
}
void FixedUpdate () {
anim.SetFloat("Speed", Mathf.Abs(rigidbody2D.velocity.x));
anim.SetFloat("Ascent", rigidbody2D.velocity.y);
if(Input.GetKey(walkLeft))
{
if(facingRight){
Flip();
}
rigidbody2D.velocity = new Vector2(-speed, rigidbody2D.velocity.y);
}
else if(Input.GetKey(walkRight))
{
if(!facingRight){
Flip();
}
rigidbody2D.velocity = new Vector2(speed, rigidbody2D.velocity.y);
}
else
{
rigidbody2D.velocity = new Vector2(0, rigidbody2D.velocity.y);
}
if(Input.GetKeyDown(jumpUp) && grounded)
{
anim.SetTrigger("Jump");
rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, 0);
rigidbody2D.AddForce(new Vector2(0f, jumpForce));
}
else if(Input.GetKeyDown(jumpUp) && extraJumps > 0)
{
anim.SetTrigger("Jump");
rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, 0);
rigidbody2D.AddForce(new Vector2(0f, jumpForce));
extraJumps -= 1;
}
}
void Flip ()
{
// Switch the way the player is labelled as facing.
facingRight = !facingRight;
// Multiply the player's x local scale by -1.
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}
}
如果它有帮助,这就是我所做的:
答案 0 :(得分:1)
更新和FixedUpdate不保证每次都会发生。我没有碰到这种错误,所以我不能肯定地说,但你可能会遇到你的基础状态不正确的情况。不要将此值保存为字段,而是在每次需要时尝试检查它 - 至少在Update和FixedUpdate中单独检查。
答案 1 :(得分:0)
以Max的回答为基础......
你应该使用FixedUpdate()
作为物理内容,例如对RigidBody
施加一个力,因为它每秒运行50次,无论游戏运行的速度有多快。这使得帧速率无关。
Update()
每帧运行一次,因此依赖于帧速率。在这里,大多数非物理学的东西应该去,例如检查输入。
This video是对差异的一个很好的解释。
评论中的链接也是正确的:
你需要从Update函数调用这个函数,因为 每个帧重置状态
因此,只有当玩家按下跳转时才检查是否接地,因为光线/线路广播的计算成本很高,在FixedUpdate()
中应用物理,并检查Update()
中的输入。
答案 2 :(得分:0)
输入应该在更新中进行处理,因为更新会在每一帧运行,而固定更新不像更新,并且它不会每帧都运行,所以当输入在固定更新中被处理时,它可能会错过输入和它不会跳! 我建议你将固定更新中的所有输入代码剪切并粘贴到更新!