通过 APlayerController 可以让输入设备控制游戏,可以直接在蓝图中设置,不过我比较喜欢折腾c++(逻辑代码都是用c++写)


1、创建一个 AMyPlayerCtrler 继承自 APlayerController,重写一些方法

AMyPlayerCtrler.h

#include "MyPlayerCtrler.generated.h"class UMyInput;
class UMyCameraComp;
class AMySpectator;
class AMyChar;UCLASS()
class AMyPlayerCtrler : public APlayerController
{GENERATED_BODY()public:AMyPlayerCtrler();virtual ~AMyPlayerCtrler();protected:/** True if the controlled character should navigate to the mouse cursor. */uint32 bMoveToMouseCursor : 1;// Begin PlayerController interfacevirtual void PlayerTick(float DeltaTime) override;virtual void SetupInputComponent() override;virtual void ProcessPlayerInput(const float DeltaTime, const bool bGamePaused) override;// End PlayerController interfacevoid OnLeftMousePressed();void OnRightMousePressed();void OnReadAtk();private:TArray<AMyChar*>    mSelectedVec;bool                mIsReadyAtk;

AMyPlayerCtrler.cpp

void AMyPlayerCtrler::SetupInputComponent()
{// set up gameplay key bindingsSuper::SetupInputComponent();//LeftMouse 和 RightMouse 就是等下要在Editor中绑定按键用的,InputComponent->BindAction("LeftMouse", IE_Pressed, this, &AMyPlayerCtrler::OnLeftMousePressed);InputComponent->BindAction("RightMouse", IE_Pressed, this, &AMyPlayerCtrler::OnRightMousePressed);//按A键,准备攻击InputComponent->BindAction("ReadyAtk", IE_Pressed, this, &AMyPlayerCtrler::OnReadAtk);
}//一下几个方法只是部分代码
void AMyPlayerCtrler::OnLeftMousePressed()
{FVector2D pressPos;this->GetMousePosition(pressPos.X, pressPos.Y);UE_LOG(GameLogger, Warning, TEXT("--- AMyPlayerCtrler::OnLeftMousePressed, pos:%s"), *pressPos.ToString());bool isAtk = false;FVector WorldPosition(0.f);AActor* const HitActor = GetClickTarget(pressPos, WorldPosition);AMyChar* tarChar = Cast<AMyChar>(HitActor);if (mSelectedVec.Num() > 0){if (mIsReadyAtk){//如果有人就锁定目标, 没人就移动if (tarChar != nullptr){AtkTarget(tarChar);}else{MoveDestination(WorldPosition);}isAtk = true;mIsReadyAtk = false;}}if (!isAtk){TArray<AMyChar*> dstCharVec;if (tarChar != nullptr){dstCharVec.Add(tarChar);}SetSelected(dstCharVec);}}void AMyPlayerCtrler::OnRightMousePressed()
{FVector2D pressPos;this->GetMousePosition(pressPos.X, pressPos.Y);UE_LOG(GameLogger, Warning, TEXT("--- AMyPlayerCtrler::OnLeftMousePressed, pos:%s"), *pressPos.ToString());FHitResult HitResult;this->GetHitResultAtScreenPosition(pressPos, CurrentClickTraceChannel, true, HitResult);if (HitResult.bBlockingHit){MoveDestination(HitResult.ImpactPoint);}
}void AMyPlayerCtrler::OnReadAtk()
{mIsReadyAtk = true;
}

2、Editor 中绑定按键事件 LeftMouseRightMouse

3、这里是真相

LeftMouse 是选中对象,RightMouse是选中对象奔跑到目的点(gif录制实在太大,只能截图了)



应要求贴部分代码

void AMyPlayerCtrler::MoveDestination(const FVector& DestLocation)
{for (AMyChar* selChar : mSelectedVec){selChar->MoveToDst(nullptr, DestLocation, false);}
}
// class AMyChar : public ACharacter, public IBehavInterface, public IMyInputInterface //继承了输入操作的方法void IMyInputInterface::MoveToDst(AMyChar* _target, const FVector& _loc, bool _isShift /* = false */)
{if (mOwnChar->GetCharacterMovement()->Velocity.Size() > 0.f){mOwnChar->GetController()->StopMovement();}UNavigationSystem* const NavSys = mOwnChar->GetWorld()->GetNavigationSystem();if (NavSys != nullptr){NavSys->SimpleMoveToLocation(mOwnChar->GetController(), _loc);}
}

ue4 玩家控制器APlayerController相关推荐

  1. [UE][UE5]Gameplay框架,Actor,pawn,playerController(玩家控制器),Character(角色)之间的关系

    [UE][UE5]Gameplay框架,actor,pawn,playerController,Character之间的关系 Actor,pawn,playerController(玩家控制器),Ch ...

  2. Unity项目-黑魂复刻(三)玩家控制器(跳跃)

    新增跳落动画 在jump动画播放完后过渡到下落动画,之后再跳回地面动画,需要注意回去的顺序,Exit Time越短就先回去 新增落地侦查器 解决落地之前都是fail动画的问题,而不是fail落地动画播 ...

  3. 黑魂复刻游戏的玩家控制器(基础移动,动画实现及优化)——Unity随手记(2021.3.15)

    文章目录 今天实现的内容: 动画机设计理念 动画机的运用及模型旋转 玩家角色的位移 爬坡测试 跑步 旋转的优化 跑步动画的优化 BUG以及缺陷: 值得注意的: 今天实现的内容: 动画机设计理念 要我说 ...

  4. Unity项目-黑魂复刻(二)玩家控制器(跳跃)

    跳跃信号 要实现跳跃,首先要实现跳跃的输入.跳跃信号是按下的当场触发的一次性触发控制(Trigger Once Signal),这个信号转化为编程语言就是bool值,通过控制真还是假判定是否按下跳跃键 ...

  5. Unity项目-黑魂复刻(四)玩家控制器(翻滚以及跳跃操作改动)

    翻滚以及跳跃操作改动 黑魂游戏中,翻滚的触发条件:1.走路按跳跃键 2.助跑按跳跃键 3.高处掉落 所以之前的跳跃键需要改成翻滚键 翻滚动画以及触发逻辑: 注意:由于翻滚的动画会出现y方向的根tran ...

  6. 黑魂复刻游戏的玩家控制器(翻滚及跳跃的重新设计)——Unity随手记(2021.3.31)

    文章目录 今天实现的内容: 翻滚和跳跃的重新设计 翻滚动画及触发逻辑 翻滚的向前冲量 跳跃并向前翻滚 BUG以及缺陷: 值得注意的: 今天实现的内容: 翻滚和跳跃的重新设计 按照黑魂游戏的设计,跳跃其 ...

  7. UE4/5多人游戏详解(七、自定义委托,实现寻找会话和加入会话的函数,通过Steam进行两台电脑的联机)

    目录 可能出现问题(在六部分的测试可能无法连接的问题[在末尾加上了,怕有人没看见在这里写一下]) 自定义委托 调整位置 创建更多的委托和回调函数给菜单: 多播和动态多播 代码: 委托变量 代码: 回调 ...

  8. UE4 回合游戏项目 15- 生成玩家、控制玩家

    在上一节(UE4 回合游戏项目 14- 添加敌人攻击)基础上继续完成生成玩家.控制玩家的功能 现在战斗地点基本完成,于是就需要制作玩家从外部走到指定地点,从而触发战斗.本节先完成 生成玩家.控制玩家的 ...

  9. UE4 限制玩家摄像机视角旋转角度

    UE4 限制玩家摄像机视角旋转角度 功能:玩家可以用鼠标旋转视角观察角色,但限制旋转的角度 网上找了很多没找到,于是自己实现了一种方式 先在弹簧臂组件里勾上使用pawn控制旋转,这样相机的旋转就跟玩家 ...

最新文章

  1. 体验Windows 7的Superbar
  2. R语言构建xgboost模型:使用xgboost模型训练tweedie回归模型,特征工程(dataframe转化到data.table、独热编码、缺失值删除、DMatrix结构生成)
  3. VMware View是如何帮助企业省钱的
  4. Acwing291. 蒙德里安的梦想:状态压缩dp
  5. debug error怎么解决_我要以血和泪的经历告诉你,这个 bug 太难解决了
  6. win7 安装 Visual Studio 2015 出现 “Failed to install MSI package 等错误”
  7. python 内置_python 内置
  8. Oracle 与 MySql 区别
  9. Servlet 2.4 规范之第四篇:Servlet上下文
  10. 获取cookies的简单代码(总结待续)
  11. unity 手机上获取手指触摸位置_我们到底触摸到了什么?揭秘智能设备触摸屏原理...
  12. 【持续更新】组合博弈题目集合
  13. 陪孩子一起学习python
  14. 小程序汉字转码以及倒计时
  15. Android系统预装Chrome并自定义主页
  16. python爬虫之通用爬虫和聚焦爬虫
  17. linux版高德导航软件下载,高德导航2017
  18. 一起来学自然语言处理----语料库和词汇资源
  19. win10引导安卓x86_手把手给你传授win10系统安卓模拟器使用的处理方法
  20. mysql 两表关联 分组查询

热门文章

  1. android WIFI连接,解决6.0及以上无法连接问题
  2. 全职宝妈卖出去5万多元的保暖袜子 只用这一招截流
  3. 手把手教你将chatGpt接到微信
  4. Linux 系统支持blacklist的kernel版本加载上海域格 CLM920 NC2 mdg 模块的驱动示例
  5. 《老男孩》上映 “娱乐宝”投资电影进入回收期
  6. Linux下yum安装MySQL yum安装MySQL指定版本
  7. 一键装机linux_教你如何使用u盘安装Linux系统
  8. Jetson AGX Xavier刷机+安装opencv+使用TensorRT加速推理yolo全过程+心路历程
  9. javascript es6常用语法
  10. 教你自制五星级大酒店用的调味品