Unreal Engine08:Pawn的实现

news2024/11/20 15:18:51

写在前面

Pawn继承于Actor,增加了一些用于控制和提供玩家视角的功能,这里主要是介绍一下Pawn类的实现。

一、创建一个Pawn的C++类

  • 创建的C++类也是放在Source文件夹中的Public和Private文件夹中;
  • 选择Pawn作为继承的父类;
  • 头文件中除了Actor的函数外,仅额外增加了一个负责设置玩家输入组件的函数SetupPlayerInputComponent(),如下:

头文件

  • .cpp文件中也默认实现了SetupPlayerInputComponent()函数,如下:

cpp文件

二、增加摄像机组件

  • 摄像机相当于是提供了一个玩家视角
  • 它绑定在Pawn上之后,玩家视角就能随着Pawn移动而移动;
  • 头文件实现如下:

增加一个摄像机组件

  • 并在.cpp文件中把摄像机组件挂载到根组件上,实现如下:

cpp实现

  • 一些补充如下:

1. StaticMesh的网格体形状可以预先设置

  • 代码实现如下:

预先设置网格体形状

  • 一些注意的点如下:
    • 首先要用MeshComponentAsset变量尝试加载资源;
    • 如果能加载,则将资源赋予网格体;
    • 资源的路径可以通过右键资源->复制引用获得,如下:

找资源所在路径

2. 摄像机组件可以和弹簧臂组件组合使用

  • 当然直接将摄像机固定在Pawn的某个位置也是可以的,但这样视角移动就会很生硬,在启动和停止时没有过渡动画的效果,实现就是上面那样;
  • 但如果使用弹簧臂连接摄像机和Pawn,则视角移动更为自然,这也是常用的做法;
  • 首先在头文件中增加弹簧臂组件,如下:

弹簧臂组件

  • 然后在构造函数中设置弹簧臂,并将摄像机挂载到弹簧臂上,如下:

使用弹簧臂

  • 一些注意的点如下:
    • 弹簧臂是挂载在根组件上;
    • 摄像机是挂载在弹簧臂的预设插槽(Socket)上;
    • 弹簧臂的倾斜角度和长度取决于摄像机想要放置的位置;

3. 可以用某个组件代替默认的根组件

  • 默认的根组件只是用于占位,本身并没有作用,因此可以用别的有实际作用的组件替换掉;
  • 这里用一个隐藏的更大的球形组件(注意不是球型静态网格组件)替换根组件,并设置为不可见;
  • 头文件实现如下:

头文件

  • 构造函数中实现如下:

设置根组件

三、创建一个Pawn的蓝图类

  • Pawn类和Actor类不同,它的很多功能需要用蓝图类辅助实现(当然完全用C++也可以,但会很麻烦,而且不直观,相当于是用文字描述图片了),所以一般是要新建一个和Pawn类对应的蓝图类作进一步开发;
  • 由C++创建的蓝图类相当于是继承了C++类;

1. 由C++类创建蓝图类的方法

  • (1) 右键C++类,选择创建基于xxx的蓝图类

创建蓝图类

  • (2) 在内容文件夹下放置蓝图类的路径下,右键->创建基础资源->选择蓝图类,然后在所有类中搜索对应的C++类创建即可;

创建蓝图类

2. 挂载组件的对应关系

  • 在C++类的构造函数中,RootComponent下挂载了两个组件,一个静态网格组件,一个是摄像机组件,而且这两个组件处于同一层;
  • 在蓝图类中的组件面板可以清楚的看到它们之间的挂载结构;
  • 按照刚刚的设置,如果不使用弹簧臂,则如下:

组件挂载结构

  • 如果使用弹簧臂,则结构如下:

组件挂载结构

  • 当然,组件也可以在蓝图中继续挂载或者修改;

3. 摄像机组件和Pawn之间的关系

  • 摄像机组件实际上是Pawn的一部分;
  • 但是它从位置上来说应该有两种情况:
    • 第一人称游戏:摄像机组件的位置在Pawn的眼睛位置;
    • 第三人称游戏:摄像机组件的位置在Pawn的后上方位置;
  • 通常会用另外一个网格组件(这里暂时是用StaticMeshComponent)作为Pawn的本体,也就是充当Pawn生物的外形;
  • 按照刚刚在C++类构造函数中的设置,如果不使用弹簧臂组件,则摄像机和静态网格组件之间的位置关系如下图:

位置关系

  • 如果使用弹簧臂组件,则摄像机和静态网格组件之间的位置关系如下图:

位置关系

四、在地图上以Pawn开始游戏

  • Pawn因为可以作为玩家的控制的视角,所以我们需要在开始游戏之后获得某个Pawn的视角,并且能够控制Pawn的运动

1. 获得Pawn视角

  • 如果什么都不设置,默认开始游戏是将视角放到PlayerStart上的,并对准前向(红色箭头),如下:

PlayStart视角

1.1 在PlayerStart处生成一个Pawn

  • 通过设置游戏模式(GameMode),可以在PlayerStart处生成一个Pawn,这样就可以顺理成章地获得它的视角了;
  • 通过默认生成的游戏模式C++类(这个是创建C++项目的时候就自动创建了的,里面没有内容,仅继承了AGameModeBase类)派生一个游戏模式蓝图类BP_CreatureGameMode,如下:

新建游戏模式蓝图类

  • 打开BP_CreatureGameMode,修改默认Pawn类BP_CreaturePawn,就可以修改开始游戏时在PlayerStart处生成的Pawn;

修改默认Pawn类

  • 之后,还需要在世界中应用新的游戏模式
  • 在主面板上打开世界场景设置面板,修改其中的游戏模式覆盖为刚刚创建的游戏模式蓝图类即可;
  • 此时用选中的视口播放游戏,就可以在PlayerStart处生成我们选定的Pawn,而且视角是在Pawn绑定的摄像机组件上;

设置新的游戏模式

1.2 将某个Pawn赋予玩家视角

  • 如果是在PlayerStart处生成一个Pawn,是有一些不足的:
    • 没有办法赋予它一些预设的实例参数,因为它是一个新生成的实例,完全依赖于C++类或者蓝图类中的默认设置;
    • 也没有办法在不同的Pawn之间切换视角,只能一直在PlayerStart视角;
  • 这里介绍如何为某个Pawn赋予玩家视角;
  • C++实现
    • 只需要在构造函数中设置AutoProssessPlayer变量即可:

为Pawn赋予玩家视角

  • Editor实现
    • 在细节面板中选中Pawn->自动控制玩家,修改值为玩家0即可:

为Pawn赋予玩家视角

2. 绑定玩家输入控制

2.1 创建轴映射

  • 在Editor中点击编辑->项目设置

项目设置

  • 引擎->输入->Bindings里面新增轴映射,如下:

和键盘输入绑定

  • 输入的映射方式主要有两种:
    • 轴映射:输入的设备可提供输入程度的变化范围,输入的是一个连续值,该值会乘以设定的缩放值,然后传给后续响应事件函数中的float类型参数Value
    • 操作映射:输入的设备仅提供是否输入的信号,即离散0/1,后续有两个响应事件函数,一个响应按下按钮事件,一个响应释放按钮事件;
    • 可以参考博文:UE4中轴映射;

2.2 绑定到响应事件函数

  • 在Pawn默认构建的SetupPlayerInputComponent()函数中可以绑定映射对应的响应事件函数,实现如下:

绑定响应事件函数

  • 注意BindAxis()函数中的字符串参数就是刚刚在项目设置中创建的轴映射事件名称,必须要相互对应;

3. 实现玩家控制的影响

  • 前面只是将玩家输入绑定到Pawn某个成员变量上,并没有对Pawn产生实际的影响;
  • 这里将实现对Pawn的影响,也就是令Pawn产生位移,实现如下:

产生位移

  • 上面的代码里面有两种实现,推荐是用第二种类型的;

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

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

相关文章

实现博客系统

目录 一、博客系统简介 二、准备工作 三、设计实现数据库 四、封装数据库 创建User类和Blog类 使用JDBC连接数据库 创建BlogDAO类操作数据库中的Blog表 创建UserDAO类操作数据库中的user表 五、实现具体功能 1、实现博客列表页 约定前后端交互接口 服务器端 …

安全运维之mysql基线检查

版本加固 选择稳定版本并及时更新、打补丁。 稳定版本:发行6-12个月以内的偶数版本。 检查方法: 使用sql语句:select version(); 检查结果: 存在问题:当前数据库版本较老需要更新 解决方案:前往http://www.mysql…

2023备战金三银四,Python自动化软件测试面试宝典合集(十四)

15.8 App 的性能测试 内容要点:指标:cpu,内存,电量,流量,FPS,怎么测? cpu,内存,流量 android studiocpu 不能超过 10-20% 普通业务要求在 10%左右,核心的业务…

链表:反转链表、快慢指针、删除链表【零神基础精讲】

来源0x3f:https://space.bilibili.com/206214 文章目录反转链表[206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/)[92. 反转链表 II](https://leetcode.cn/problems/reverse-linked-list-ii/)[25. K 个一组翻转链表](https://leetcode.cn/proble…

新生儿住月子中心20天患败血症 什么是败血症?有哪些危害

12月7日,四川眉山市民唐先生说,他刚出生的儿子在妇产医院分娩中心住了20天后感染了败血症。据唐先生介绍,哈子出院时各项指标正常。他在分娩中心住了半个月左右,孩子喝牛奶异常易怒,第二天开始发烧。当天,在…

(十一)、用户中心页面【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1,个人中心页面 1.1 新建个人中心页面 1.2 纯净版个人中心页面代码&#xff1a; <template><view class"user"><view class"top"><view class"group"><view class"userinfo"><!-- 顶部 左侧 头像 …

Unreal Engine07:Actor的物理特性

写在前面 UE4作为物理引擎&#xff0c;其中一大功能就是能够赋予物体以物理特性。这里将简单介绍一下Actor常用的一些物理特性设置。 一、基本操作 这里介绍一些UE4的Editor基本操作&#xff1b; 1. Actor的变换 将Actor类拖动到地图中&#xff0c;生成实例&#xff1b;鼠…

408强化(二)线性表纯享版

目录 一、顺序表&#xff08;数组&#xff09;和链表总览 二、考情分析 2.1 从历年考情可以看出&#xff0c;如果一个方法出现了第2次&#xff0c;一般是以下情况&#xff1a; 2.2 没有考过的地方 三、 共同操作或考法 3.1 多指针后移 3.2 逆置 3.3 空间换时间的操作 3.…

一分钟了解微信公众号服务器配置自动回复

1、建一个web服务工程 2、开放任意一个接口&#xff0c; 比如 /aaa/bbb/ccc 把接口路径配置在这里&#xff0c;ip为公网ip或域名&#xff0c;其他的参数默认&#xff0c;对入门选手没啥用 3、该接口允许get和post两种方式访问&#xff0c;接口需要对于访问方式编写两套逻辑…

ubuntu下如何使用wireshark抓包,保姆级教程

Wireshark&#xff08;前称Ethereal&#xff09;是一个网络封包分析软件。网络封包分析软件的功能是截取网络封包&#xff0c;并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口&#xff0c;直接与网卡进行数据报文交换。 一、安装wireshark 打开终端&…

教育行业如何高效使用知识库?

在线知识库的有效性在商业世界中是众所周知的。知识库通常用于客户支持&#xff0c;或管理员工的内部知识。在教育系统中&#xff0c;知识库的优势鲜为人知。知识库是可用于各种应用程序的多功能软件。特别是考虑到当前网络影响我们所有人生活的环境&#xff0c;教育越来越多地…

数据结构<堆>

&#x1f387;&#x1f387;&#x1f387;作者&#xff1a; 小鱼不会骑车 &#x1f386;&#x1f386;&#x1f386;专栏&#xff1a; 《数据结构》 &#x1f393;&#x1f393;&#x1f393;个人简介&#xff1a; 一名专科大一在读的小比特&#xff0c;努力学习编程是我唯一…

字符串匹配 - 模式预处理:朴素算法(Naive)(暴力破解)

朴素的字符串匹配算法又称为暴力匹配算法&#xff08;Brute Force Algorithm&#xff09;&#xff0c;最为简单的字符串匹配算法。算法简介朴素的字符串匹配算法又称为暴力匹配算法&#xff08;Brute Force Algorithm&#xff09;&#xff0c;它的主要特点是&#xff1a;没有预…

功率放大器科普知识(晶体管功率放大器的注意事项)

虽然功率放大器是电子实验室的常用仪器&#xff0c;但是很多人对于它却没有清晰的认识&#xff0c;下面就让安泰电子来为大家介绍功率放大器的科普内容以及使用注意事项&#xff0c;希望大家可以对功率放大器有清晰的认识。功率放大器可以把输入信号的功率放大&#xff0c;以满…

NFT Insider #86:A16z 领投,YGG 获得 1380 万美元融资,The Sandbox与《北斗神拳》合作

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#…

智能小车红外循迹原理

循迹电路循迹电路由收发一体的红外收发管P1&#xff0c;P2&#xff1b;电位器R18&#xff0c;R29&#xff1b;发光二极管D6&#xff0c;D7和芯片LM324等组成。一共有两路&#xff0c;对应的红外电位器用于调节灵敏度。LM234用于信号的比较&#xff0c;并产生比较结果输出给单片…

MySQL8.0 optimizer_switch变化

Optimizer_switch变量是支持对优化器行为的控制。是一组值标志&#xff0c;每个标志都有一个on或off的值&#xff0c;以指示是否启用或禁用相应的行为。 MySQL8.0里除了熟悉的hash join重大变化之外&#xff0c;其他方面也有优化。 mysql> SHOW VARIABLES LIKE OPTIMIZER_…

14 基数排序(桶排序)

文章目录1 基数排序基本思想2 基数排序的代码实现2.1 java2.2 scala3 基数排序总结1 基数排序基本思想 1) 基数排序&#xff08;radix sort&#xff09;属于“分配式排序”&#xff08;distribution sort&#xff09;&#xff0c;又称“桶子法”&#xff08;bucket sort&#…

【Python】循环语句(while,for)、运算符、字符串格式化

一、while循环Python 编程中 while 语句用于循环执行程序&#xff0c;即在某条件下&#xff0c;循环执行某段程序&#xff0c;以处理需要重复处理的相同任务。其基本形式为&#xff1a;while 判断条件(condition)&#xff1a;执行语句(statements)执行语句可以是单个语句或语句…

Git、小乌龟、Gitee的概述与安装应用超详细(组长与组员多人开发版本)

目录 一、概述 1.什么是Git&#xff1f; 2.Git历史来源 3.Git的优点? 4.什么是版本控制&#xff1f; 5.版本控制工具种类&#xff1f; 6.Git工作机制 7.Git、小乌龟、Gitee、凭据管理器的简单介绍 二、Git下载安装 下载Git 安装Git 安装完成后查看版本 三、下载小…