跳至主要內容

c4.3Subsystem|EnhancedInput优先级

Mr.Si大约 1 分钟u++

导读

头像

食用本文建议先了解什么是增强输入系统!直通车

EnhancedInput|Action绑定

头像
前文已经对增强输入系统有了个初步的理解。也知道上下文以及Action如何相辅相成。
	if (const APlayerController* PC = GetOwningPlayer())
	{
		LocalPlayer = PC->GetLocalPlayer();
		if (LocalPlayer)
		{
			if (UEnhancedInputLocalPlayerSubsystem* Subsystem = LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
			{
				// 检查是否已经添加了输入映射上下文
				if (!Subsystem->HasMappingContext(InputMappingContext))
				{
					Subsystem->AddMappingContext(InputMappingContext, 2);	
				}
			}
		}
	}

	// 绑定聊天切换动作
	if (UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(GetOwningPlayer()->InputComponent))
	{
		if (InputAction_ChatToggle)
		{
			EnhancedInputComponent->BindAction(InputAction_ChatToggle, ETriggerEvent::Triggered, this, &UChatWidgetBase::HandleChatAction);
		}
	}

EnhancedInput|Action解绑

头像
现在我们知道怎么绑定Action,怎么解绑Action?
头像
问得好!目前来看根据句柄解绑的方法比较靠谱。但需要手动获取句柄ID
if (UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(GetOwningPlayer()->InputComponent))
	{
		if (InputAction_ChatTab)
		{
			int32 PreviousAction = -1;
			for (int i = 0; i < EnhancedInputComponent->GetNumActionBindings(); i++) {

				if (EnhancedInputComponent->GetActionBinding(i).ActionDelegate.IsBoundToObject(InputAction_ChatTab)) {

					PreviousAction = EnhancedInputComponent->GetActionBinding(i).GetHandle();
					break;
				}

			}
			EnhancedInputComponent->RemoveActionBindingForHandle(PreviousAction);
		}
	}
头像
可是我实际运行后发现解绑后依然起作用啊!

EnhancedInput|切换IMC优先级

头像
你这种情况极大概率是因为IMC的优先级导致的,你是不是之前的IMC配置过相同的按键?
头像
没错!我在默认的IMC中配置过相同的按键给Action!
头像
那就没错了,如果多个IMC配置了同个Action到相同的按键时,IMC Priority优先级高的生效,这种情况只需要 Priority降级就行了。
Subsystem->AddMappingContext(InputMappingContext, 1);