欢迎光临散文网 会员登陆 & 注册

TomLooman_ActionRoguelike_AssignmentOne

2023-08-10 08:17 作者:别叫我小红  | 我要投稿

该专栏用于保存对TomLooman的ActionRoguelike项目的学习笔记,学习过程中的思考与记录不一定准确。


教程参考:https://github.com/tomlooman/ActionRoguelike

基于UE5.0的项目实现:https://github.com/CarolBaggins2023/TomLooman_ActionRoguelike_Tutorial


2023_07_28

Assignment 1:爆炸桶,跳跃

 

首先创建C++类。因为爆炸桶不需要被Control,所以不需要继承Pawn及其子类,继承Actor就足够。以下是头文件中声明的爆炸桶组件的成员变量,以及源文件构造函数中对成员变量的实例化和设置。




 

这里声明组件的方式与之前有所不同,比较在Scharacter中声明摄像机组件,与这里声明网格组件,



两者都是指针,但声明CameraComp时用的是C++的原始指针,声明MeshComp时用的是TObjectPtr类。TObjectPtr类模板可用于替换原始指针,用法与其它类模板相同,为TObjectPtr<类名>。

 

在实例化MeshComp时,除了默认实例化和将其作为RootComponent,我们还开启了MeshComp的物理模拟。

需要注意的是,我们在蓝图中对物理模拟打钩后,Component的CollisionPresets会自动变成PhysicsActor。但是当我们在C++中执行SetSimulatePhysics(true)后,Component的CollisionPresets的变化需要显式地进行,否则不会变化。在这里会保持WorldDynamic,因为我们的SMagicProjectile对WorldDynamic的Collision是Overlap的,所以两者无法发生正确的碰撞。

ForceComp所属的URadialForceComponent类(径向力组件)会向径向方向对Physics和Destructible类别的Object施加力。

在实例化ForceComp时,我们设置了该径向力的范围和强度。

其中有一个bImpulseVelChangeBool类型变量,若为true,则该组件发出的径向力忽视Object的重量,否则Object重量越重,径向力对Object的影响越小。

ForceComp->AddCollisionChannelToAffect(ECC_WorldDynamic)和SMagicProjectile中使用过的SphereComp->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap)类似,都是对某个通道设置某种碰撞属性。

可通过ForceComp->SetAutoActivate()函数设置该组件的径向力是否自动开启,若为true,则径向力从该组件所依附的对象被创造时就存在(但是试验中没有效果)。因为我们需要用子弹激活这个径向力来模拟爆炸效果,所以设置为false。

 

在头文件中我们重载了Actor类的PostInitializeComponents函数,该函数是实例化Actor时的一环,

我们在源文件中对该函数的定义如下

Super::PostInitializeComponents();执行父类(Actor类)的同名函数。

OnComponentHit组件将会在击中或被击中时触发。

这里的AddDynamic涉及UE的委托机制,作用大致是将SexplosiveBarrel对象与函数ASExplosiveBarrel::OnActorHit绑定,当触发一些事件时激活(运行)函数ASExplosiveBarrel::OnActorHit。   

 

BindAction进行两个绑定:将外部输入绑定到事件(ProjectSetting中完成),将事件绑定到函数(C++,SetupPlayerInputComponent成员函数中完成)。

因为ACharacter自带跳跃函数,所以实现较为简单。

如果把IE_Pressed换成IE_Release,角色就会在松开空格后起跳,而不是在按下空格时起跳(可以实现类似蓄力跳的效果)。


TomLooman_ActionRoguelike_AssignmentOne的评论 (共 条)

分享到微博请遵守国家法律