UE4 取消按键状态的办法

问题描述在角色行走的过程中(由方向键控制),触发了某些机制,角色不再受玩家控制(比如触发了简单的对话,需要设置下角色位置然后站立等)等在对话完成返回后,发现角色一直在行走,即使你没有按任何的按键。

问题原因触发某些机制后,输入控制转交给了UI系统或者其他系统,角色本身的输入系统没有收到原来的KeyReleased的消息,等到控制权回到角色的时候,由于行走的按钮状态仍然处于KeyDown的状态,所以仍然会行走。

解决方案触发机制前调用APlayerController::FlushPressedKeys函数,该函数会调用内部的UPlayerInput::FlushPressedKeys,该函数会向所有状态为Down的按键模拟发送一次Released的事件,通知这些按键已经释放了。

void UPlayerInput::FlushPressedKeys()
{
	APlayerController* PlayerController = GetOuterAPlayerController();
	ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(PlayerController->Player);
	if ( LocalPlayer != NULL )
	{
		TArray<FKey> PressedKeys;

		for (TMap<FKey,FKeyState>::TIterator It(KeyStateMap); It; ++It)
		{
			const FKeyState& KeyState = It.Value();
			if (KeyState.bDown)
			{
				PressedKeys.Add(It.Key());
			}
		}

		// we may have gotten here as a result of executing an input bind.  in order to ensure that the simulated IE_Released events
		// we're about to fire are actually propagated to the game, we need to clear the bExecutingBindCommand flag
		if ( PressedKeys.Num() > 0 )
		{
			bExecutingBindCommand = false;

			for ( int32 KeyIndex = 0; KeyIndex < PressedKeys.Num(); KeyIndex++ )
			{
				FKey& Key = PressedKeys[KeyIndex];
				InputKey(Key, IE_Released, 0, Key.IsGamepadKey());
			}
		}
	}
//......
}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值