虚幻引擎C++开发学习(三)

虚幻引擎基础入门(C++) — 【数据类型篇 04】 本文仅仅简单介绍了虚幻引擎中的数据类型的使用 阅读详情

这一章,我们要实现一个俯视视角的坦克小游戏,玩家可以操作坦克在地图中移动。敌人是固定的,但是具备一定的AI,可以瞄准玩家,并且在玩家进入攻击范围后,对玩家进行攻击。如果玩家被摧毁,则游戏结束。反之,玩家需要摧毁所有的敌人后,达成游戏胜利的条件。

一、前言介绍

在开始之前,我们先介绍这一章会涉及到的内容:

  • 创建一个坦克,可以在地图中自由移动
  • 解决输入问题(WASD移动,鼠标点击射击,鼠标转动明确攻击方向)
  • 创建一个敌方炮台类
  • 添加开火功能,玩家和炮台都可以开火攻击敌人
  • 添加血条、伤害和破坏效果
  • 添加HUD的胜利和失败界面

关于绑定输入,这里就不多赘述,如下图:

关于素材和地图,这里也不是我们的重点,暂时略过,感兴趣的可以自行寻找。我们直接进入编码步骤。

二、创建BasePawn

1.1 创建BasePawn

由于我们这里会有两个pawn(玩家和敌人),我们可以先创建一个BasePawn类。这将具有坦克和炮塔共享的基本功能。然后我们就可以创建我们的两个子类,炮台和坦克。

我们新建一个C++类:

 但是哪一个才最适合我们想要做的事情?

  • Actor类,可以被放置在世界中,有相应的视觉表现
  • Pawn类,可由控制器拥有,可以处理运动输入
  • Character类,有一些特定于角色的东西,适合双腿的运动模式或类似飞行和游泳运动。

所以,Pawn应该是我们想要的。我们创建对应的C++类即可。

1.2 Component

USceneComponent:

  • has a transform(旋转或位置)
  • supports attachment(这意味着我们可以将其他组件附加到场景组件)
  • no visual representation

UCapsuleComponent:

  • handle collision

UStaticMeshComponent:

  • visual representation

我们讨论组件的目的,是要理清之后的操作思路。我们首先知道我们的Pawn有自己的root component,它的类型是USceneComponent。我们知道他是没有visual representation,是不可见的。

但是我们可以使用其他类型从SceneComponent(场景组件)派生的对象重新assign该根组件。我们知道UCapsuleComponent来自SceneComponent。如果我们创建一个Capsule,我们可以assign这个,作为Root,替换默认的SceneComponent:

RootComponent(UCapsuleComponent) = CapsuleComp(UCapsuleComponent)

具体的思路可以见下图:

在蓝图中,我们创建一个Actor蓝图,然后添加Capsule,接着添加静态网格体组件,并选择车身网格体,同理添加炮台。

 结果:

 在C++中,我们先在.h中定义

private:
	UPROPERTY()
	class UCapsuleComponent*  CapsuleComp;

然后在.cpp中添加头文件,并将其设置为Root

CapsuleComp = CreateDefaultSubobject<UCapsuleComponent>(TEXT("Capsule Collider"));
RootComponent = CapsuleComp;

这样我们将BasePawn拖入场景中时,会有:

 接下来我们要将BaseMesh和TurretMesh,attach到Root上(和之前的操作相同):

UPROPERTY()
UStaticMeshComponent* BaseMesh;

UPROPERTY()
UStaticMeshComponent* TurretMesh;

UPROPERTY()
USceneComponent* ProjectileSpawnPoint;
BaseMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Base Mesh"));
BaseMesh->SetupAttachment(CapsuleComp);

TurretMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Turret Mesh"));
TurretMesh->SetupAttachment(BaseMesh);

ProjectileSpawnPoint = CreateDefaultSubobject<USceneComponent>(TEXT("Spawn Point"));
ProjectileSpawnPoint->SetupAttachment(TurretMesh);

接下来我们可以为BasePawn创建一个基于BasePawn的蓝图类,这样我们进入后,可以看见这样的组件结构:

 然后我们还要创建一个蓝图类作为敌人,命名为BP_PawnTurret。

1.3 UPROPERTY

但是有一点要注意的是,当我们选中左边的组件时,右边的细节面板内容不见了。这是因为 C++ 方面的蓝图没有任何内容。我们可以通过UPROPERTY来对齐进行操作。

UPROPERTY Specifiers:

Defaults Instance Event Graph(l蓝图的事件图表)
Read Only VisibleAnyWhere BluePrintReadOnly
VisibleDefaultsOnly VisibleInstanceOnly
Read/Write(set) EditAnyWhere BluePrintReadWrite
EditDefaultOnly

EditInstanceOnly

关于事件图表,我们在C++中可以使用:

UPROPERTY(VisibleAnyWhere,BluePrintReadWrite)
int32 visibleAnywhere = 12;

这样我们在事件图表中搜索visibleAnywhere,就会有两个节点Set和Get。

其次还有一个需要注意的点是,对于private,会有报错(同样对于BluePrintReadOnly):

BluePrintReadWrite should not be used on private members

对于这种情况,我们仍然可以在事件图表中访问私有变量,我们需要添加:

UPROPERTY(VisibleAnyWhere,BluePrintReadWrite,meta = (AllowPrivateAccess = "true"))

当然我们可以为其添加Category,这个在之前有提到过。

在这一步之后,别忘了给坦克和炮台添加网格体,移动project point位置。

二 Moving Tank

2.1 Component

要实现坦克的移动和玩家输入,炮台的站立,我们要创建新的派生类:

其次,为了实现坦克的移动,我们首先要保证视角跟随,即坦克的身后有一个摄像机——Camera Component(UCameraComponent)和一个固定距离的Spring arm component(USpingArmComponent)。

在蓝图中:

所以我们回到蓝图中,添加弹簧臂组件到Capsule下:

 然后我们选中弹簧臂组件,再添加一个摄像机组件:

但是我们的主要目标是C++。

在C++中:

我们在.h中创建:

public:
	ATank();
private:
	UPROPERTY(VisibleAnyWhere,Category = "Component")
	class UCameraComponent* Camera;

	UPROPERTY(VisibleAnyWhere,Category = "Component")
	class USpringArmComponent* SpringArm;

在.cpp中:

ATank::ATank(){
    SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("Spring Arm"));
    SpringArm->SetupAttachment(RootComponent);

    Camera = CreateDefaultSubobject<U
UE4-碰撞检测SweepMultiByChannel-如何保证玩家被怪物单次攻击不受多次伤害 在怪物攻击玩家时,我们需要保证怪物在一次攻击时,只会产生一次有效伤害,所以这里需要用SweepMultiByChannel函数进行碰撞检测,如何进行一次的伤害而不是多次伤害呢?QP:表示判断询问参数,使用AddIgnoredActor()函数,忽略不需要判断的Actor。用来辅助判断是否已经进行了攻击,如果已经获取了对应的玩家碰撞,就不再二次玩家的伤害。Hits表示碰撞到的元素,存放在TArray中。FQuat(0,0,0,0):表示转4元数。AttLoc:第一个表示开始位置。 阅读详情

相关推荐

UE4 UCLASS有效关键字和Meta

UCLASS 宏的有效关键字 classGroup 此关键字用于在编辑器中设置显示该类的actor组。 Within 声明此类的实例应始终具有指定类的外部。除非被覆盖,否则它由子类继承。 BlueprintType 将此类公开为可用于蓝图中变量的类型。 NotBlueprintType

zzZZ20150101的专栏 2091

虚幻引擎5 C++游戏开发教程

能够运行 Unreal 5 的 64 位 PC(推荐)。或运行最新 MacOS Big Sur 的 Mac。+8GB 内存。四核 CPU,2.5 GHz 或更快。DirectX 11、12 或 Metal 1.2 兼容显卡。大约 50GB 的可用磁盘空间。不需要以前的虚幻或编码经验。

duoshehuan6005的博客 2万+

【UE Slate】 虚幻引擎Slate开发快速入门

创建自定义控件类:继承自或,具体取决于你的控件是否包含子控件。继承自SWidget并添加了一些额外的功能,如支持包含子控件。public:// 使用ChildSlot定义控件的内容ChildSlot"))private:// 按钮点击事件处理函数"));解释构造函数和方法Construct方法用于初始化控件。和宏定义控件的构造参数。ChildSlot"))是按钮点击事件的处理函数。使用表示事件已处理。"));自定义控件的使用。

hhw_hhw的博客 5270

UE4安装教程,虚幻引擎安装教程,UE4的安装

UE4安装教程,虚幻引擎安装教程开始安装(1)打开主页功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 开始安装 虚幻引擎4(UE4)的安装比较简单,如果只做场景的搭建、蓝图的编写以及简单的C++函数插件开发,只需安装引擎即可,不太

weixin_38839543的博客 1万+

虚幻引擎(UE4)中重要的Class类

虚幻引擎4(简称UE4)的GamePlay框架提供了一套强大的类来构建游戏。你的游戏可以是一个射击游戏,农场模拟器游戏,一个深度的RPG游戏,GamePlay框架可以帮助你实现这些复杂的工作。理解这个框架对于成功和高效是至关重要的。 适用群体 对UE4感兴趣,特别是那些正在学习UE4C++,并想了解更多关于虚幻的游戏框架的开发者。这篇文章介绍了您将在游戏框架中使用的核心类,并解释了它们的用法、引擎如何实例化它们以及如何从游戏代码的其他部分访问这些类。提供的大多数信息也适用于蓝图。 GamePlay框架

刀客 3655

【虚幻引擎】带你了解UE4

UE4,全称“Unreal Engine 4 ”翻译成中文为“虚幻引擎4”虚幻4是一套为游戏开发者设计和构建游戏、模拟和可视化的集成工具。(简单来说就是做游戏的软件)

2201_75537871的博客 7030

虚幻引擎(Unreal Engine)深入探索与应用实践

虚幻引擎以其强大的渲染能力、高效的物理引擎和灵活的蓝图系统而闻名。它支持多种编程语言,如C++和Blueprint,使得开发者可以根据项目需求选择合适的开发方式。同时,UE还提供了丰富的资产库和插件生态系统,极大地提升了开发效率。

Xiaoxin的博客 2551

首篇——为什么我要学习虚幻引擎(Unreal Engine)

为什么我要学习虚幻引擎Unreal Engine?UE4有什么优势?

轩玉的博客 9275

LinuxCNC开发实战:从安装到EtherCAT配置全解析

本文详细解析LinuxCNC开发实战,从系统安装到EtherCAT总线配置全流程。涵盖实时内核优化、伺服驱动器PDO映射、HAL配置及自定义运动学开发,帮助开发者快速搭建工业级数控系统,提升运动控制精度与稳定性。

rgv234567的博客 346

保姆级教程:用Zemax 18.9复现单模光纤耦合仿真(附康宁SMF-28e参数)

本文提供了一份详细的Zemax 18.9单模光纤耦合仿真教程,以康宁SMF-28e为例,涵盖从软件设置、材料参数输入到系统构建和优化的全流程。通过光束耦合分析和物理光学传播(POP)技术,帮助用户准确模拟光纤耦合效率,并解决常见问题,适用于光学设计初学者和专业人士。

weixin_27330481的博客 306

从零开始:如何用大语言模型构建你的第一个路径规划智能体

本文详细介绍了如何利用大语言模型(LLM)构建路径规划智能体,从基础概念到实战案例,涵盖TSP和CVRP问题的解决方案。通过选择合适的LLM模型、设计有效的提示工程和实现自我验证,即使没有运筹学背景也能快速上手。文章还提供了部署与优化智能体的实用技巧,帮助读者在物流配送、机器人导航等领域应用这一技术。

weixin_28256233的博客 475

康耐视visionpro-CogCreateSegmentAvgSegsTool操作工具详细说明

康耐视visionpro-CogCreateSegmentAvgSegsTool操作工具详细说明

视觉人机器视觉的博客 1470

fanuc机器人I/O分配

FANUC机器人在和其他外部设备进行通讯时,需要对信号进行配置。 在机器人处于UOP自动分配状态时,系统会自动检索已配对设备,并分配相应的机架号。 当我们需要手动对信号进行分配时,可参考以下机架号进行配置。 不同的通讯协议对应的机架号不同,外部通讯协议常用的机架号参考下表: 序号 机架号 通讯类型 1 0 Process I/O 2 1-15

haier123888的博客 1万+

3、保险行业商业智能解决方案的理解与实施

本文详细探讨了商业智能(BI)在保险行业的应用与实施策略,涵盖了从BI环境开发的关键步骤、自下而上与自上而下的数据仓库开发方法,到决策支持工具的选择与使用。文章还分析了BI系统与互联网、内联网和外联网的结合方式,并讨论了购买与自建方案的优劣比较,最后总结了商业智能成功的关键因素及其对保险行业带来的商业价值。通过实际案例与未来趋势展望,展示了商业智能如何推动保险企业的数字化转型和竞争力提升。

moon9的博客 94

数控系统(CNC)系列:Hurco VMX42SR_(3).控制系统硬件组成部分

控制箱是CNC系统的核心部分,负责处理所有的控制指令和数据。它通常包含主控板、电源模块、接口板等关键组件。伺服驱动器是CNC系统中的关键组件,负责将主控板发出的控制信号转换为电机所需的驱动电流。它通过闭环控制确保电机的精确运动。电机是CNC系统中的执行机构,负责实现主控板发出的运动指令。常见的电机类型包括步进电机和伺服电机。传感器是CNC系统中的重要组件,用于检测和反馈机床的运行状态。常见的传感器类型包括位置传感器、速度传感器、温度传感器等。电源供应系统为CNC系统的所有组件提供电力。主电源。

2401_87715305的博客 1272

SAP_SD模块销售开票计划预收款系统配置及前台操作说明

在 SAP SD 中,开票计划(Billing Plan)是一种允许根据时间节点或里程碑对销售订单进行分期开票的功能。其中最常见的一种应用就是预收款(Down Payment Billing),即在销售订单中直接定义某个百分比或金额作为预收款,系统在开票时自动生成预收账单。大额合同或长期项目型销售(先收 20%,交货前收 30%,交货后收 50%)。分期付款模式(分阶段收款)。必须预收款才能安排生产或交货的业务。后台路径:SPRO—销售与分享—销售—销售凭证—销售凭证项目—定义项目类别。

我小时候很黑的博客 1388

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 事后分析:暴雪的暗黑破坏神 II【翻译】
下一篇: 《游戏设计信条》【笔记】
packdge_black
博客等级 码龄9年 170粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值