unreal engine 增强输入的使用分析

news2024/12/28 3:04:32

由于ue5以前的输入 系统已经提示被弃用了,因此建议使用新版本

首先
分别新建输入操作
新建映射情景

image.png

打开新建的输入操作
根据下图可以得出结论,此东西用于描述 是何种类型映射,以及是否消耗事件 不传递

image.png
image.png

打开情景上下文MappingConext
新建映射选中刚刚创建的,

image.png

然后进行展开发现这里同样可以定义触发器和修改器
这里改成已按下。

image.png

新建pawn设置自动控制 为玩家0
打开蓝图在事件开始运行时执行
用代码表达

var 增强系统=获取玩家控制器().GetInputLocalPlayerSubsystem();
增强系统.添加映射上下文(mappingConext=刚刚新建的上下文,priority=优先级)
image.png

蓝图如下

image.png

再右键新建选择明明的Lozn_jump

image.png

运行后按空格键屏幕成功打印文字

image.png

上面是操作映射,也就是bool类型, 新建输入操作可以指定三维向量

最后来看看 官方完整的

移动的实现

首先新建move 增强事件 指定为2维向量

在上下文中分别新建awsd ,和前后左右方向键
d:默认
a:修改器选择反向(否定)
w:修改器选择拌合输入轴
s:修改器选择拌合输入轴 和否定
如下图所示

image.png

pawn对于IA_Move的使用

image.png

伪代码

onMove(isTragged,isStarted,float actionValuex, float actionValueY){
if(!isTragged){return;}
//控制向右
this.获取向右向量().z=this.获取控制旋转().z;//yaw 偏航
this.获取向右向量().x=this.获取控制旋转().x;//roll 翻滚 //理论上这句话不应该写的,在c++源码中是没有定义的
var worldDirection=this.获取向右向量();
this.添加移动输入(wordDirection,scaleValue:x)

//控制向前
var 向前向量=this.获取向前向量();
向前向量.z=this.获取控制旋转().z;//yaw 偏航

this.添加移动输入(wordDirection:向前向量,scaleValue:y)
}

旋转的实现

同样新建Look增加输入
然后在上下文中 指定为鼠标 XY 2D轴

修改器指定为否定

image.png

蓝图的定义

image.png

伪代码

onLook(isTragged,isStarted,float actionValuex, float actionValueY){
if(!isTragged){return;}


this.添加控制器Yaw输入(val:actionValuex);//偏航角度 
//实际上应该围绕z,但是这里是鼠标 2维,所以是围绕y而不是z   鼠标x水平的移动控制左右的移动
this.添加控制器Pitch输入(val:actionValueY);
//围绕y旋转 俯仰角 但是这里是鼠标y,也就是鼠标前后移动的数值Y来控制人物的俯仰
}

跳跃

image.png

在触发是调用跳跃
在完成时候调用停止跳跃

c++的实现使用

ACppDigitalTwnCharacter : public ACharacter
在构造方法中

GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f);
        
    //控制器转动时不旋转。让这只影响到相机
    bUseControllerRotationPitch = false;
    bUseControllerRotationYaw = false;
    bUseControllerRotationRoll = false;

    // 配置角色移动
    GetCharacterMovement()->bOrientRotationToMovement = true; // Character moves in the direction of input...   
    GetCharacterMovement()->RotationRate = FRotator(0.0f, 500.0f, 0.0f); // ...at this rotation rate


    GetCharacterMovement()->JumpZVelocity = 700.f;
    GetCharacterMovement()->AirControl = 0.35f;
    GetCharacterMovement()->MaxWalkSpeed = 500.f;
    GetCharacterMovement()->MinAnalogWalkSpeed = 20.f;
    GetCharacterMovement()->BrakingDecelerationWalking = 2000.f;

    // 创建一个弹簧臂
    CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
    CameraBoom->SetupAttachment(RootComponent);
    CameraBoom->TargetArmLength = 400.0f; // The camera follows at this distance behind the character   
    CameraBoom->bUsePawnControlRotation = true; // Rotate the arm based on the controller

    // 创建跟随相机
    FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
    FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); // Attach the camera to the end of the boom and let the boom adjust to match the controller orientation
    FollowCamera->bUsePawnControlRotation = false; // Camera does not rotate relative to arm

在事件开始运行 也就是BegainPlay 中绑定事件上下文

void ACppDigitalTwnCharacter::BeginPlay()
{

    Super::BeginPlay();
    //添加输入映射上下文
    if (APlayerController* PlayerController = Cast<APlayerController>(Controller))
    {
        if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer()))
        {
            Subsystem->AddMappingContext(DefaultMappingContext, 0);
        }
    }
}

上面的成员变量如DefaultMappingContext由c++子类蓝图中设置

image.png

定义

/** MappingContext */
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
    class UInputMappingContext* DefaultMappingContext;

    /** Jump Input Action */
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
    class UInputAction* JumpAction;

    /** Move Input Action */
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
    class UInputAction* MoveAction;

    /** Look Input Action */
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
    class UInputAction* LookAction;

重写SetupPlayerInputComponent方法完成事件绑定

void ACppDigitalTwnCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{
    // Set up action bindings
    if (UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent)) {
        
        //Jumping
        EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &ACharacter::Jump);
        EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping);

        //Moving
        EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &ACppDigitalTwnCharacter::Move);

        //Looking
        EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &ACppDigitalTwnCharacter::Look);

    }

}

旋转和移动的实现

void ACppDigitalTwnCharacter::Move(const FInputActionValue& Value)
{
    // 转为2d向量
    FVector2D MovementVector = Value.Get<FVector2D>();

    if (Controller != nullptr)
    {
        // 找出是哪个方向向前 获取控制旋转
        const FRotator Rotation = Controller->GetControlRotation();
        const FRotator YawRotation(0, Rotation.Yaw, 0);//inPich和inRoll都为0但是yaw 也就是方向取控制旋转的方向
//ue坐标系 前面 是x 垂直是z水平 是y
        // 获取向前向量
        const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);

    
        //获取向右向量
        const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);

        // add movement 
        AddMovementInput(ForwardDirection, MovementVector.Y);
        AddMovementInput(RightDirection, MovementVector.X);
    }
}

void ACppDigitalTwnCharacter::Look(const FInputActionValue& Value)
{
    // input is a Vector2D
    FVector2D LookAxisVector = Value.Get<FVector2D>();

    if (Controller != nullptr)
    {
        // add yaw and pitch input to controller
        AddControllerYawInput(LookAxisVector.X);//围绕x轴 [ue-x代表向前的水平线]偏航叫 控制左右旋转 z代表高度垂直线
        AddControllerPitchInput(LookAxisVector.Y);//围绕y轴 [ue是水平线]俯仰角 roll  在unreal中,pitch 对应于y轴,yaw对应于z轴,roll对应于x轴。
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126049.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用Python绘制一朵玫瑰花,送给特别的她

前言 哈喽哈喽&#xff0c;跨年倒计时三天九小时 上次发了烟花的文章&#xff0c;看来还是蛮多人需要代码的 今天就来搞一朵唯一的花吧~&#xff08;送给你喜欢的那个她&#xff09; 效果 话不多说 咱先直接看看效果&#xff0c;毕竟搞的不好看我也拿不出手 提前先说 我尽…

CANopen3.0-数据格式

一、CAN消息 一帧CAN消息的通信协议如下: 其中, id: CAN消息的标识符,通常是11bits rtr: 0–消息帧,普通消息;1–远程帧,远程传输请求消息,这种类型的消息不能包含数据帧; dn: 数据帧,一帧普通CAN消息包括0~8bytes数据 在CANOpen中需要自己实现CAN发送消息接口,类似…

小型水库水雨情监测预警自动测报平台 辅助水利在线监测水库水位+雨量

平升电子小型水库水雨情监测预警自动测报平台辅助水利管理部门实现水库雨水情信息“全要素、全量程、全覆盖”自动测报。系统具备水库水位、雨量、现场图像/视频等水文信息采集、传输、处理及预警广播等功能&#xff0c;有效提升了雨水情信息的时效性和准确度&#xff0c;为保障…

网络常见配置及Nmcli配置使用

1.查看网络配置 /etc/services 可以查看协议的tcp/udp端口 IP common ip addr show #查看设备或IP信息也可以通过ifconfig查询。 ip -s link show eno16777734 #可以发送或接收包的状态ip route #查看路由信息ping 测试通讯连接&#xff0c;用ctrlc结束 Meth : ping [opting]…

中间件:SpringBoot-JAVA整合MQTT通信

1、环境Win10&#xff1b; 2、JDK 1.8&#xff1b; 3、SpringBoot 2.7.5; 4、MQTTV3 1.2.5 5、EMQX服务器本地安装使用参考&#xff1a;MQTT学习记录&#xff08;一、Windows&#xff09;_我也不清楚的博客-CSDN博客_mqtt默认密码 6、MQTTX 官方客户端可视化工具安装参考&#…

Ae:段落面板

◆ ◆ ◆段落面板Ae菜单&#xff1a;窗口/段落Window/Paragraph快捷键&#xff1a;Ctrl 7对于点文本&#xff0c;默认一行为一个段落。每按一次回车键&#xff0c;就多出一个段落。对于段落文本&#xff0c;一段可能有多行&#xff0c;具体取决于定界框的尺寸。末尾有回车符…

路由基础:

1、路由中包含以下信息&#xff1a; 目的网络 掩码 出接口 下一跳 对路由条目的管理实际上就是路由器管理、维护路由信息的具体实现&#xff0c;路由表中只会保存“最优”路由。 2、路由获取方式&#xff1a; 直连 静态 动态 * 直连&a…

RHCSA 第四天笔记

文本内容在命令行的操作 文本过滤&#xff1a;grep 文本三剑客&#xff1a; gerp sed awk grep 选项 关键的字符串 文件 grep root /etc/passwd 查找root(交集查找&#xff09; ^ 以……为开头 $ 以……为结尾 Grep ^root /etc/passwd …

MATLAB | MATLAB不会画图?官方团队来教你

让我看看是哪个小傻瓜还没用过MATLAB官方gallery&#xff0c;常见的图直接MATHWORKS搜索一下就能找到&#xff0c;一些有意思的组合图&#xff0c;以及一些特殊属性的设置MATHWORKS官方是有专门去整理的&#xff0c;虽然一些很特殊的图还是没有(哈哈哈弦图小提琴图啥的官方没有…

第004课 - 项目微服务架构图

文章目录 项目架构图项目架构图 外网部署就是面向公众访问的,部署前端项目。 可以有手机app,也可以有web网站。 内网部署后端系统。 客户端发送请求,请求是先来到我们的nginx集群。 nginx将请求转交给我们的后台服务。 nginx是先将请求转交给api网关。 api网关我们使用…

论文浅尝 | 通过依赖掩码语法引导预训练提升关系抽取

笔记整理&#xff1a;王大壮链接: https://aclanthology.org/2022.findings-acl.147v1.pdf动机关系抽取是一项重要的自然语言处理任务&#xff0c;旨在预测给定文本中两个给定实体之间的关系。其中&#xff0c;对文本上下文信息的良好理解对于实现出色的模型性能至关重要。在不…

CMMI之项目规划

项目规划&#xff08;Project Planning&#xff09;的目的是为项目的研发和管理工作制定合理的行动纲领&#xff08;即《项目计划》&#xff09;&#xff0c;以便所有相关人员按照该计划有条不紊地开展工作。 为了避免词义混淆&#xff0c;这里把动词Planning译为规划&#xf…

用 Python 写一个经典飞机大战

当年微信 5.0 发布时&#xff0c;首页被设置成了一款新推出的小游戏&#xff0c;它就是微信版飞机大战&#xff0c;游戏一经推出便是火爆异常&#xff0c;铅笔画风格的游戏界面也受到了很多人的喜欢。 最近重温了一下这款小游戏&#xff0c;尽管时隔多年&#xff0c;但无论是游…

双向循环神经网络(隐马尔可夫模型)

在双向循环神经网络中&#xff0c;每个时间步的隐状态由当前时间步的前后数据同时决定。 双向循环神经网络与概率图模型中的“前向-后向”算法具有相似性。 双向循环神经网络主要用于序列编码和给定双向上下文的观测估计。 由于梯度链更长&#xff0c;因此双向循环神经网络的…

网站Nginx服务安装https免费证书配置一条龙流程

搜索小程序 成语典故查询 Let’s Encrypt 安装https免费证书配置 1.http 是一个传输网页内容的协议,比如你看到的 http 开头的网站 www.163.com&#xff0c;其网页上的文字、图片、 CSS 、 JS 等文件都是通过 http 协议传输到我们的浏览器&#xff0c;然后被我们看到。 而 …

生物药、创新药、仿制药新项目立项调研、评估的重要手段

当前,随着我国制药行业与国际的高速接轨,研发和产业环境也迎来了崭新的局面。制药企业的核心竞争力是研发&#xff0c;而研发中的立项是直接影响新药开发成功与否的关键因素&#xff0c;那么如何有效的规避开发的风险&#xff0c;立项论证显得极其重要&#xff0c;也是每个医药…

车道线标注案例分析

车道线标注属性细分规则确认点 常见车道线的标注分类属性包括5个维度&#xff1a;颜色、线型、线数、车道、职能 颜色标签&#xff1a;如白色、黄色、蓝色、橙色、黄白色等 线型标签&#xff1a;如实线、虚线、锯齿线等 线数标签&#xff1a;单线、双线&#xff0c;特殊情况…

【高阶数据结构】二叉树的非递归遍历

&#x1f308;欢迎来到数据结构专栏~~二叉树的非递归遍历 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自…

大型家政服务平台带小程序端源码 家政服务小程序源码

1. 开发语言&#xff1a;PHP 2. 数据库&#xff1a;MySQL 3.小程序端&#xff1a;Uniapp 4. 带调试视频 5. 可付费调试运行服务 后台功能&#xff1a; 首页、服务管理、商品管理、订单管理、社区管理、城市代理/运营、 营销活动、会员管理、师傅管理、商家/门店、财务管理、合…

警惕!不要让自己的基本功丢失

写这篇文章的缘由是来自己最近我作为面试官的一场面试&#xff0c;我司是。Net stack&#xff0c;这场面试的岗位是后端高级开发。候选人是一个 12 年工作经验的候选人&#xff0c;简历看起来很 nice&#xff0c;国内某 TOP 高校 cs 专业本科毕业&#xff0c;有在大厂甲方外企的…