UE4快速理解pawn、character、controller三者之间的联系

在这里插入图片描述
一 pawn类继承自Actor,在国际象棋中pawn意味着卒、兵,没有生命的一个Actor,在pawn的源码中,相当于一个被控制的角色,这个角色可以是死的,活的,不具有生命特性的,它能够被controller控制,这个controller可以是玩家,也可以是AIcontroller。

二 character类代表角色,继承自pawn,它提供了一个特殊的组件charactermovement,这个组件提供了一个基础的基于胶囊体的角色移动功能,更多的用具有生命属性,移动属性的功能。如果你的功能十分简单不需要移动属性,就不用继承自character。

三 controller类控制器,顾名思义,就是玩家控制角色的一个类,这个类可以是player controller,也可以是AIController,它是控制角色移动,发出命令的核心,有了这个控制器,才能进行绑定输入,转化成对pawn和character的指令。

三者之间,在使用过程中如果需要角色移动属性,就使用character类,如果没有移动属性,就使用pawn,如果说pawn/character是肉体,而controller是操作pawn和character的灵魂。

### UE4 中 PlayerController 的绑定方法及实现方式 在 Unreal Engine 4 (UE4) 中,`APlayerController` 是负责处理玩家输入的核心类之一。它通过与 `APawn` 或其子类(如 `ACharacter`)的关联来控制游戏中的角色行为。以下是关于如何将 `APlayerController` 与特定事件或组件进行绑定的方法及其具体实现。 #### 1. **定义输入事件** 为了使 `APlayerController` 能够响应用户的输入操作,首先需要在项目设置中配置输入映射。这可以通过编辑器完成,也可以直接在代码中动态创建。通常情况下,在项目的 Input Settings 面板中添加自定义的动作(Action) 和轴(Axis),并为其分配键位[^2]。 #### 2. **绑定输入到函数** 一旦设置了输入映射表项,则可以在派生自 `APlayerController` 的类中重写虚函数 `SetupInputComponent()` 来执行实际的绑定逻辑: ```cpp void ACustomPlayerController::SetupInputComponent() { Super::SetupInputComponent(); if (InputComponent) { // 绑定动作事件 InputComponent->BindAction("ExampleAction", IE_Pressed, this, &ACustomPlayerController::OnExampleActionPressed); InputComponent->BindAction("ExampleAction", IE_Released, this, &ACustomPlayerController::OnExampleActionReleased); // 绑定轴事件 InputComponent->BindAxis("MoveForward", this, &ACustomPlayerController::MoveForward); InputComponent->BindAxis("LookUpRate", this, &ACustomPlayerController::LookUpAtRate); } } ``` 上述代码片段展示了如何分别针对按键按下(IE_Pressed)/松开(IE_Released)以及连续变化量(例如鼠标移动速率)的情况来进行回调绑定[^4]。 #### 3. **实现对应的回调函数** 对于每一个绑定好的输入事件都需要提供相应的处理器函数。这些函数会接收来自硬件设备的数据作为参数,并据此更新游戏状态或者触发其他机制: ```cpp // 处理按钮按下的例子 void ACustomPlayerController::OnExampleActionPressed() { GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("Button Pressed!")); } // 控制向前运动的例子 void ACustomPlayerController::MoveForward(float Value) { APawn* ControlledPawn = GetPawn(); if (!ControlledPawn) return; FVector ForwardVector = ControlledPawn->GetActorForwardVector(); ControlledPawn->AddMovementInput(ForwardVector * Value); } ``` 这里需要注意的是,许多时候我们并不直接修改控制器的位置而是影响其所拥有的 Pawn 对象的行为[^3]。 #### 4. **动态绑定 Charactor 到 PlayerController** 当实例化一个新的 Character 并希望由当前活动的 PlayerController 掌控时可以调用 Possess 方法;反之解除这种关系则使用 UnPossess : ```cpp APawn* NewPawn = GetWorld()->SpawnActor<ASomePawnClass>(FVector(), FRotator()); if(NewPawn && IsValid(this)) { this->Possess(NewPawn); } else { this->UnPossess(); } ``` 此过程体现了 Controller-Possession 系统的设计理念——即分离了实体表现层(Pawn)同决策制定方(Controller)。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞起的猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值