我在游戏中有一个简单的跳跃动作。玩家按下跳跃键,被发射到空中,转换到空中状态,然后再次摔倒在地。通常的东西。
然而,如果玩家降落在地上,并且用户仍然持有跳跃键,则玩家在降落时自动再次跳跃。我不想那样。我希望用户在能够再次跳转之前放开密钥。
这是我的玩家移动代码的简化版本,其中只有必要的东西。
public class GenesisPhysics : MonoBehaviour {
public bool isGrounded = true;
public bool jumpIsPressed;
public IA inputActions; // New input system's Input Action Asset C# class
private void Awake()
{
inputActions = new IA();
// Movement actions stuff...
inputActions.PlayerControls2D.Jump.performed += jumpContext => jumpIsPressed = true;
inputActions.PlayerControls2D.Jump.canceled += jumpContext => jumpIsPressed = false;
}
private void FixedUpdate()
{
if(isGrounded)
{
ExecuteGroundStateLoop()
} else {
ExecuteAirStateLoop()
}
}
private void ExecuteGroundStateLoop()
{
// Do stuff...
if(jumpPressed) {
isGrounded = false;
// Set x and y speeds to be applied in Air state
} else {
// Do some more stuff...
}
}
private void ExecuteAirStateLoop()
{
// Applying gravity, jump force, checking for ground and other stuff...
// If ground is found, set isGrounded to true.
}
void OnEnable()
{
inputActions.Enable()
}
void OnDisable()
{
inputActions.Disable()
}
}
这可能不足以解决问题。如果需要更多,我会更新这篇文章。
创建一个新的bool变量"jumpPressAvailable";并在开始时将其设置为true。如果跳转可用,请使用此新变量进行控制。例如,如果按下跳转按钮,则设置"跳转";jumpPressAvailable";如果跳转按钮被释放或"是";"未按下";,设置";jumpPressAvailable";再次变为真。只有当按下跳转按钮并"跳过"时,才能开始跳转;jumpPressAvailable";是真的。
public bool jumpPressAvailable=true;
在基态环路中添加一些线路:
if(jumpPressed && jumpPressAvailable) {
isGrounded = false;
jumpPressAvailable = false;
// Set x and y speeds to be applied in Air state
} else {
if(jumpPressed == false)
{
jumpPressAvailable = true;
}
// Do some more stuff...
}