之前一篇C++文章中,写了使用C++创建一个背包,并且添加了一个物体可以拾取到背包中。
那么这一篇文章,我们使用枚举定义不同的物品类型,不同物品属性与角色产生不同的互动,初始化角色对象等等内容。知识的积累离不开点点滴滴的努力,望共勉之,和往常一样工程在文章最后。
在本文章中我们要实现的是,基于一个Actor,可以选择这个Actor的属性,一个属性是可拾取物体,一个属性是不可拾取只能使用的物体,然后我们拾取一个物体,将这个物体和另一个属性的物体交互(案例中使用打火机点燃稻草的功能)。
和往常一样,创建一个C++的第三人称模板,然后创建一个Actor的C++类,我们本次只需要在Input中添加一个Action就可以,那就是Pickup,这里其实还可以添加一个展示背包的按键。那代码还和之前的一样,在工程的名字(这里以ES为例)。ESCharacter.h中定义如下内容:
然后再ESCharacter.cpp中的PlayerInputComponent函数添加如下内容:
然后将在头文件中声明的函数写如下实现方法,和前面第一篇文章中一样,3个函数2个用来控制按下和抬起后,开关bool用来检测玩家是否按下了E,然后展示背包,这里很简单就不讲了。
接下来我们主要操作都在Actor的Class中完成,这里我的Actor名字叫ESItem,打开ESItem.h在Public区域添加如下内容:
//用来检测当前触碰对象是否为玩家
bool isTriggerPlayer = false;
//用来检测当前物品是否使用过
bool isUsed = false;
//创建一个ESCharacter类型的空玩家变量
AESCharacter* ESPlayer;
//当前物品名字,公开在编辑器窗口
UPROPERTY(EditAnywhere)
FString itemName;
//当前物品的模型,公开在编辑器窗口
UPROPERTY(EditAnywhere)
UStaticMeshComponent* itemMesh;
//当前Actor中会包含的粒子特效,公开在编辑器窗口
UPROPERTY(EditAnywhere)
UParticleSystemComponent* showParticle;
//创建一个碰撞盒子,用来检测和玩家的碰撞
UBoxComponent* collisionBox;
//创建2个碰撞函数
UFUNCTION()
void TriggerEnter(class UPrimitiveComponent* HitCopp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
UFUNCTION()
void TriggerExit(class UPrim