Unreal Engine09:自定义Pawn运动组件

news2024/11/16 18:40:59

写在前面

这里介绍一下如何为Pawn定制自定义的运动组件。

一、新建一个运动组件C++类

  • 需要在Editor中新建类,不要直接Visual Studio中新建;
  • Pawn的运动组件继承自UPawnMovementComponent,需要勾选显示所有类才能找到;

运动组件父类

  • 初始时,头文件里面是什么都没有的,如下:

头文件

  • USlidePawnMovementComponent的继承结构是:
    • UObject:最基本的类;
    • UActorComponent:最基本的Component类;
    • UMovementComponent:最基本的运动组件类;
    • UNavMovementComponent
    • UPawnMovementComponent
    • USlidePawnMovementComponent

二、实现运动组件的功能

1. 头文件

  • 为了实现自定义的移动方式,这里仅需要重写TickComponent()函数,如下:

头文件

  • 这个函数是在MovementComponent类中定义的,如下:

在父类中的定义

2. cpp实现

  • 为了让Pawn能够产生实时的移动,需要在每一帧中为Pawn更新位置,重写的TickComponent()函数就是执行每一帧中Component施加给Actor的动作,相当于在Actor中的void Tick(float DeltaTime)函数;
  • 因此,在TickComponent()函数中需要把从外部设备输入的信号施加到Pawn上产生作用效果,实现如下:

cpp实现

  • 一些注意的点如下:
    • 如果运动组件没有挂载到某个Pawn上,或者运动组件没有对应施加运动的组件(默认是根组件),则TickComponent()不会进行具体的移动;
    • 这里的输入信号的传递用的是生产者-消费者模型,这是因为输入信号可能是同时发生的,但消费这些信号(也就是实际让Pawn运动起来)则需要一个个执行,因此用生产者-消费者模型而不是Unreal Engine08:Pawn的实现中的简单绑定到CurrentVelocity变量可以实现异步执行,也降低了输入和执行之间的耦合性;
    • 实现Pawn的运动仍然用的是位移 = 速度 * 时间的公式,和之前实现的无异;
    • 为了实现Pawn撞向其他物体时的沿表明滑动效果,这也是该自定义运动组件的核心目的,这里需要调用SlideAlongSurface()函数来实现移动,而不是直接将当前Pawn的位置设置为某个地方;
    • 如果在试算的过程中发生了碰撞,则不会执行真正的移动的;

三、在Pawn中使用自定义运动组件

1. 头文件

  • 首先在头文件中定义运动组件,如下:

定义运动组件

  • 另外要重写GetMovementComponent()函数,因为默认的返回不是自定义的运动组件;

2. cpp实现

  • 首先在构造函数中分配对象,如下:

构造函数

  • 另外要为运动组件初始化它所施加运动的组件;

  • 这里是因为Pawn可以有很多组件,因此运动组件需要选其中一个来控制,也就是施加运动的对象不是Pawn而是另一个组件(组件得是UScenceComponent类型才能被施加运动);

  • 然后是重写GetMovementComponent()函数,如下:

返回组件

  • 最后是运动组件在响应输入的函数中被调用,如下:

响应输入事件

  • 一些注意的地方如下:
    • 由于在TickComponent()函数中已经做了数值截断和与速度相乘计算位移的操作,所以这里直接传数值即可;
    • 调用的是GetActorForwardVector()GetActorRightVector()函数,这样相当于是把GetActorLocation()拆开了三个维度分别控制;
    • AddMovementInput()函数实际上是充当了生产者的作用,负责把对应的输入信号放到队列中供消费者处理,它的实现在Pawn.h中,如下:

函数实现

  • 注意:

    • 这里调用了重写的GetMovementComponent()函数;
    • 也调用了自定义组件的默认生产者函数
  • 这样无需在Pawn中的Tick()函数里面写有关位置的更新,也可以实现Pawn的运动效果;

  • 这当然是推荐的写法,因为即使不实现自定义的运动组件,UE4也已经提供了默认的运动组件供使用;

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

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

相关文章

【PowerQuery】PowerBI 的PowerQuery支持的数据集成

PowerBI中的各个Power组件已经被深度集成到PowerBI中,不再作为像Excel一样的独立组件而存在。在PowerBI的界面中为了快速导入这些常用的数据,也有相应的快速导入界面。PowerBI的快速导入界面位于主页面中,下图就是PowerBI的快速导入界面。 在PowerBI中的数据导入界面相比Exc…

Leetcode.958 二叉树的完全性检验

题目链接 Leetcode.958 二叉树的完全性检验 Rating : 1703 题目描述 给定一个二叉树的 root,确定它是否是一个 完全二叉树 。 在一个 完全二叉树 中,除了最后一个关卡外,所有关卡都是完全被填满的,并且最后一个关卡中的所有节点…

【郭东白架构课 模块一:生存法则】11|法则五:架构师为什么要关注技术体系的外部适应性?

你好, 我是郭东白。 前四条法则分别讲了目标、资源、人性和技术周期,这些都与架构活动的外部环境有关。那么今天我们来讲讲在架构活动内部,也就是在架构师可控的范围内,应该遵守哪些法则。今天这节课,我们就先从技术体…

乡村振兴研究:全网最全指标农村经济面板数据(2000-2021年)

数据来源:国家统计局 时间跨度:2000-2021年 区域范围:全国31省 指标说明: 部分样例数据: 行政区划代码地区年份经度纬度乡镇数(个)乡数(个)镇数(个)村民委员会数(个)乡村户数(万户)乡村人口(万人)乡村从业人员(万人…

通过4个月的自动化学习,现在我也拿到了25K的offer

毕业后的5年,是拉开职场差距的关键时期。有人通过这5年的努力,实现了大厂高薪,有人在这5年里得到贵人的赏识,实现了职级的快速拔升,还有人在这5年里逐渐掉队,成了职场里隐身一族,归于静默。 而…

如何高效远程维护分布在海外的中大型智能设备?

一、行业需求 随着越来越多的企业进行全球化经营,设备制造商和系统集成商的设备分布到全球各地,数量多而且分散,传统的设备运维方式,面临着出差成本高,工作效率低,服务不及时等问题,客户常常因…

华为手表开发:WATCH 3 Pro(8)获取位置服务

华为手表开发:WATCH 3 Pro(8)获取位置服务初环境与设备文件夹:文件新增第二页面geolocation.hmlgeolocation.js修改首页 -> 新建按钮 “ 跳转 ”index.hmlindex.js 引用包:system.router首页效果点击结果按钮跳转后…

【Linux详解】——文件基础(I/O、文件描述符、重定向、缓冲区)

📖 前言:本期介绍文件基础I/O。 目录🕒 1. 文件回顾🕘 1.1 基本概念🕘 1.2 C语言文件操作🕤 1.2.1 概述🕤 1.2.2 实操🕤 1.2.3 OS接口open的使用(比特位标记)…

【Java基础】023 -- 集合进阶(List、Set、泛型、树)

目录 一、集合的体系结构 1、单列集合(Collection) 二、Collection集合 1、Collection常见方法 ①、代码实现: ②、contains方法重写equals方法示例:(idea可自动重写) 2、Collection的遍历方式(…

拂晓·微信机器人

前言 本项目是基于千寻微信框架进行的功能开发,采用SpringBoot青云客机器人进行开发。 千寻初衷是想开源一个框架的写法,并不是为了用来运营,因此功能不全,所以使用和适配前请查看是否与自己需求匹配。 因此本文主要通过千寻客…

JVM详解——类的加载

文章目录类的加载1、Java程序如何运行2、Java字节码文件3、类加载4、类加载的过程5、类加载器6、类的加载方式7、类的加载机制8、双亲委派机制9、破坏双亲委派机制类的加载 1、Java程序如何运行 首先通过Javac命令将.java文件编译生成.class字节码文件。 Javac是Java编译命令&a…

【IOS逆向】frida-trace小计

【IOS逆向】frida-trace小计 当越狱完成之后,可以尝试品尝下frida frida-trace 用于跟踪函数或者 Objective-C 方法的调用,frida-trace -h 能够查看它的帮助,最重要的有下面几个参数: -i 跟踪某个函数,-x 排除某个函…

链表OJ(三) 反转链表合集

目录 反转链表 反转链表 II 链表中的节点每k个一组翻转 描述 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。 数据范围: 0≤n≤10000≤…

开发必备的IDEA 插件!效率提升 50 倍!

日常开发中,面向百度编程的程序员,很多时候,你跟大佬级别的差距,可能不仅仅是知识面的差距,还有就是开发效率的差距。以下是我常用的几个IDEA插件,废话不多说,直接肝干货! 1. Codot…

庄懂的TA笔记(十二)<>

庄懂的TA笔记(十二)<>一、作业展示,答疑:1、作业:2、答疑:二、作业示范,分析:1、文档分析:2、资源分析:3、资源优化:4、光…

Linux下的进程控制

目录 退出码 终止进程 进程等待 进程程序替换 自己实现简易shell命令行 内建命令 退出码 在编写代码时main函数内部我们通常都使用return 0;结尾,以此标识正常退出。这里的return 0就是所谓的退出码,Linux下也是一样: 看这个小程序&…

【Opencv 系列】第1章 图像基础

通过本套课程,可以学到: 1.opencv的基本操作 2.两个案例,目标追踪&人脸识别 对重点内容,我会提示,包括我再准备这套课程过程中遇到的坑点! 最后代码我会放到git上,章节顺序一致:https://github.com/justinge/opencv_tutorial.git 系列文章目录 第1章 Opencv 图像基础 和 …

21基于二阶锥规划的主动配电网最优潮流求解

参考文献:主动配电网多源协同运行优化研究-乔珊主动配电网最优潮流研究及其应用实例-高红均主要内容:CPLEX二阶锥规划考虑WindCBSVGOLTCESS多时段24h,骨灰级注释,一看就懂!!!部分程序&#xff1…

基于注意力的知识蒸馏Attention Transfer原理与代码解析

paper:Paying More Attention to Attention: Improving the Performance of Convolutional Neural Networks via Attention Transfercode:https://github.com/megvii-research/mdistiller/blob/master/mdistiller/distillers/AT.py背景一个流行的假设是存…

SpringCloudAlibaba-Sentinel

一、介绍官网&#xff1a;https://github.com/alibaba/Sentinel/下载jar包,启动,访问http://localhost:8080/创建module添加如下依赖<!--SpringCloud ailibaba sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring…