当前位置: 首页 > news >正文

Unity开发者快速认识Unreal 的C++(四)Pawn和Actor

Pawn是代表世界中的存在的单位,或者说是个体,Actor是Pawn的基类,也可以代表世界中的实体。那我们在开发Unity时最直接的就是,场景中创建一个GameObject,然后就是挂载组件,挂载组件,挂载组件,然后拖到资源窗口做成预制体,很简单,如果要是换成Unreal的话,该怎样操作和实现?到底是创建Pawn的C++子类或者蓝图类?,还是创建Actor的C++子类或者蓝图类?同样都是场景中的对象,该怎样操作?为了方便理解下面贴上Actor和Pawn的部分代码解析说明

1.Actor

功能大概分为两种,左图是常量函数,基本上处理一些类型引用,,一种是功能函数,主要处理actor的自身属性,比如系统在调用actor时创建的SceneComponent,用来控制actor世界中的变换,这些功能函数就是对SceneComponent组件进行设置和修改(具体看逻辑实现)

1.Pawn

具有Actor一些通用的功能,比如SceneComponent,Pawn也是具有的,此外Pawn还拓展了一个组件InputComponent,Pawn对象创建时自动创建输入组件,然后并没有查找到相关的输入设置,

在创建输入组件的时候,有一步是设置玩家输入组件的函数(SetupPlayerComponent)调用,然后查看该函数的定义是虚函数,包括CreatePlayerInputComponent函数也是虚函数,也就是说,子类可以重新定义,输入组件的创建和设置

Pawn还拓展了一个移动功能,引用UPawnMovementComponent组件定义物体移动相关的虚函数

DefaultPawn:是Pawn的子类,是默认的GameMode的默认生成单位,下图是所有函数定义

看了下函数逻辑主要分为两部分:一部分是重写了输入组件的设置函数(SetupPlayerInputComponent),Pawn中只是声明了SetupPlayerInputComponent虚函数,子类DefaultPawn中进行了重写,代码就是进行了键位和回调函数之间进行了绑定,第二部分就是输入组件键位回调函数的具体逻辑实现。至此DefaultPawn的前世今生基本上就了解了,然后我们给GameMode创建一个Pawn替换DefaultPawn,运行程序,自动生成的Pawn没有输入上的反馈,这就需要打开脚本或者蓝图子类,进行SetupPlayerInputComponent函数的重写和逻辑实现

第二部分功能就是UMovementComponent组件,使用该组件进行实际上的空间变换控制,对SceneComponent组件的设置,这个地方有点难理解,查看UMovementComponent组件的继承顺序,

UActorComponent <-- UMovementComponent <-- UNavMovementComponent <--  UPawnMovementComponent

注:最左边的是所有组件的基类,Pawn持有的是UPawnMovementComponent,DefaultPawn持有的是UMovementComponent ,可以看出来这块是多态的,”父类引用子类对象“

总结:Pawn和Actor之间最大的区别就是InputComponent组件

1.如果需要一个能交互的物体时,可以创建一个Pawn子类

2.如果物体不需要键鼠交互,那创建一个Actor就可以

3.如果非要创建Actor然后添加交互组件,实现键位绑定也行

4.尽可能的创建Pawn,不需要输入系统,那就不去重写SetupInputComponent

5.单位的移动可以使用UMovementComponent 组件,也可以自定义逻辑进行移动(获取SceneComponent组件进行变换设置)

http://www.xdnf.cn/news/1246447.html

相关文章:

  • 智慧城市SaaS平台|市容环卫管理系统
  • Spring-rabbit使用实战六
  • Could not load the Qt platform plugin “xcb“ in “无法调试与显示Opencv
  • 类内部方法调用,自注入避免AOP失效
  • RK3568 Linux驱动学习——字符设备驱动开发
  • 森赛睿科技成为机器视觉产业联盟会员单位
  • C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(六)
  • Vue.js 教程
  • css3属性总结和浏览器私有属性
  • Matplotlib(六)- 坐标轴定制
  • 【视觉识别】Ubuntu 22.04 上安装和配置 TigerVNC 鲁班猫V5
  • 技术与情感交织的一生 (十一)
  • 漏洞分析:90分钟安全革命
  • 原型模式在C++中的实现与面向对象设计原则
  • vue3 计算属性
  • 前端实现Excel文件的在线预览效果
  • 10-红黑树
  • LINUX 85 SHElL if else 前瞻 实例
  • Goby 漏洞安全通告| NestJS DevTools /inspector/graph/interact 命令执行漏洞(CVE-2025-54782)
  • 国内办公安全平台新标杆:iOA一体化办公安全解决方案
  • 机械学习--决策树(实战案例)
  • Linux和mysql练习题2
  • Electron-updater + Electron-builder + IIS + NSIS + Blockmap 完整增量更新方案
  • HTML 媒体元素概述
  • LeetCode 71~90题解
  • MongoDB 从3.4.0升级到4.0.0完整指南实战-优雅草蜻蜓I即时通讯水银版成功升级-卓伊凡|bigniu
  • Redis内存耗尽时的应对策略
  • # 【Java + EasyExcel 实战】动态列 + 公式备注 Excel 模板导出全流程(附完整代码)
  • 分布式文件系统06-分布式中间件弹性扩容与rebalance冲平衡
  • PromptPilot搭配Doubao-seed-1.6:定制你需要的AI提示prompt