Skip to content

Commit

Permalink
new
Browse files Browse the repository at this point in the history
  • Loading branch information
RenderTool committed Aug 6, 2024
1 parent c56082d commit de49245
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 81 deletions.
99 changes: 99 additions & 0 deletions src/unreal/core[核心]/4.3-EnhancedInput.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
---
title: c4.3Subsystem|EnhancedInput优先级
order : 403
category:
- u++
---
### 导读

<chatmessage avatar="../../assets/emoji/bqb (2).png" :avatarWidth="40" alignLeft>

食用本文建议先了解什么是增强输入系统![直通车](4.2-EnhancedInput)

</chatmessage>

## EnhancedInput|Action绑定

<chatmessage avatar="../../assets/emoji/hx.png" :avatarWidth="40">
前文已经对增强输入系统有了个初步的理解。也知道上下文以及Action如何相辅相成。
</chatmessage>

```cpp
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解绑
<chatmessage avatar="../../assets/emoji/hx.png" :avatarWidth="40">
现在我们知道怎么绑定Action,怎么解绑Action?
</chatmessage>
<chatmessage avatar="../../assets/emoji/dsyj.png" :avatarWidth="40" alignLeft>
问得好!目前来看根据句柄解绑的方法比较靠谱。但需要手动获取句柄ID
</chatmessage>
```cpp
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);
}
}
```

<chatmessage avatar="../../assets/emoji/hx.png" :avatarWidth="40">
可是我实际运行后发现解绑后依然起作用啊!
</chatmessage>

## EnhancedInput|切换IMC优先级

<chatmessage avatar="../../assets/emoji/dsyj.png" :avatarWidth="40" alignLeft>
你这种情况极大概率是因为IMC的优先级导致的,你是不是之前的IMC配置过相同的按键?
</chatmessage>

<chatmessage avatar="../../assets/emoji/hx.png" :avatarWidth="40">
没错!我在默认的IMC中配置过相同的按键给Action!
</chatmessage>

<chatmessage avatar="../../assets/emoji/dsyj.png" :avatarWidth="40" alignLeft>
那就没错了,如果多个IMC配置了同个Action到相同的按键时,IMC Priority优先级高的生效,这种情况只需要 Priority降级就行了。
</chatmessage>



```cpp
Subsystem->AddMappingContext(InputMappingContext, 1);
```
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
---
title: LY2.Inputmode的封装。
order : 2
title: c4.4Subsystem|EnhancedInput利用路由显示鼠标
order : 404
category:
- unreal
- u++
---
## 导读

<chatmessage avatar="../../assets/emoji/dsyj.png" :avatarWidth="40">
官方文档介绍CommonUI虽然提供了InputMode函数:UCommonActivatableWidget::GetDesiredInputConfig却没有给出对应的蓝图节点已经属性操作。
本章节从Lyra的InputConfig出发,观察理解LyraInputmode实现细节。
</chatmessage>

## 前置条件

>安装插件CommonUI
## 实践

>日常心血来潮,想给我的游戏菜单背景加一个角色查看功能,即:可以操作UI的同时控制游戏模型(比如旋转、缩放等)。
<chatmessage avatar="../../assets/emoji/blzt.png" :avatarWidth="40">
Expand Down Expand Up @@ -172,13 +167,21 @@ enum class EMouseCaptureMode : uint8

例如:我想配置一个全局的输、鼠标交互模式。

![](..%2Fassets%2FUCommonInputActionDomain.jpg)
![](..%2Fassets%2FUCommonInputActionDomain.jpg)

* Display in ActionBar :简单来说就是对应的按键UI显示在指定的动作栏中。类似下面的效果:

![](..%2Fassets%2Faction%20bar.jpg)
![](..%2Fassets%2Faction%20bar.jpg)
<chatmessage avatar="../../assets/emoji/hx.png" :avatarWidth="40">
使用CommonUI后原本的输入模式就失效了。
</chatmessage>

![checkout.jpg](..%2Fassets%2Fcheckout.jpg)

## 源码剖析

### 源码剖析

![](..%2Fassets%2Fcommonuiroot.jpg)

`ActivatableWidget.h`

Expand Down Expand Up @@ -298,81 +301,22 @@ void UExorcistActivatableWidget::ValidateCompiledWidgetTree(const UWidgetTree& B
```

<chatmessage avatar="../../assets/emoji/bqb (6).png" :avatarWidth="40">
打住打住!你管这叫源码剖析?
</chatmessage>

## 回顾
## Route|输入路由子系统

<chatmessage avatar="../../assets/emoji/dsyj.png" :avatarWidth="40" alignLeft>
很好!我们从头分析!我们先来重新复习一下CommonUI有哪些现成的Widget类
<chatmessage avatar="../../assets/emoji/hx.png" :avatarWidth="40">
上方得知,我们配置的核心其实就是FUIInputConfig,而在CommonUI中可以使用Router子系统来管理配置我们要显示的UI
</chatmessage>

![](..%2Fassets%2Fcommonuiroot.jpg)

## 扩展

怎么通过蓝图节点进行输入模式的切换设置呢。

简单!将 `EditDefaultsOnly` 修改为 `EditAnywhere`,这样就可以在蓝图中任何地方编辑该属性了。就ok了!
> UCommonUIActionRouterBase : public ULocalPlayerSubsystem
```cpp
// ExorcistActivatableWidget.h
protected:
/** 激活此 UI 时要使用的所需输入模式,例如您是否希望按键仍然传递到游戏/玩家控制器? */
UPROPERTY(EditAnywhere, Category = Input)
EExorcistWidgetInputMode InputConfig = EExorcistWidgetInputMode::Default; // 输入模式
```
### 流程
首先,我们在头文件中添加新的声明:
```cpp
// ExorcistActivatableWidget.h
#pragma once
#include "CoreMinimal.h"
#include "UI/ExorcistActivatableWidget.h"
#include "ExorcistBlueprintFunctionLibrary.generated.h"
/**
*
*/
UCLASS()
class YOURPROJECT_API UExorcistBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category = "Exorcist")
static void SetExorcistInputMode(UExorcistActivatableWidget* ActivatableWidget, EExorcistWidgetInputMode InputMode);
};
```

现在,你可以在蓝图中调用 `SetInputMode` 来设置输入模式了。

同样的:将 `EMouseCaptureMode` 的设置也封装成一个函数,以便在其他地方调用。

首先,在 `UExorcistActivatableWidget` 类中添加一个新的函数用于设置鼠标捕获模式:

```cpp
// ExorcistActivatableWidget.h

public:
// 设置鼠标捕获模式
UFUNCTION(BlueprintCallable, Category = "Exorcist")
void SetMouseCaptureMode(EMouseCaptureMode NewCaptureMode);
```
在源文件中实现这个函数:
```cpp
// ExorcistActivatableWidget.cpp
void UExorcistActivatableWidget::SetMouseCaptureMode(EMouseCaptureMode NewCaptureMode)
if (UCommonUIActionRouterBase* ActionRouter = LocalPlayer->GetSubsystem<UCommonUIActionRouterBase>())
{
GameMouseCaptureMode = NewCaptureMode;
if (bIsChatModeActive)
{
ActionRouter->SetActiveUIInputConfig(FUIInputConfig(ECommonInputMode::Game, EMouseCaptureMode::CapturePermanently));
UnbindChatTabKey();
}
}
```

0 comments on commit de49245

Please sign in to comment.