您的位置:首页 > 编程语言 > C语言/C++

Learning C++ by Creating Games With UE4(15.05.21)(Chapter 11-2)Monster

2015-05-21 01:00 405 查看
Chapter11-2

近战攻击

在字典中定义近战这个词是表示一群混乱的人。近战攻击就是在很近的范围内做出的行为。要做近战攻击这样一个效果,你首先需要一个近战攻击的动画,那么你需要在UE4的动画编辑里面实现它。

在C++中编写一个近战武器

我们将会定义一个新的类,MeleeWeapon 是有actor类衍生出来的,那么下面我们来看这样一个类的代码:

#pragma once

#include "GameFramework/Actor.h"

#include "MeleeWeapon.generated.h"

class AMonster;

UCLASS()

class CPLUSLEARN_API AMeleeWeapon : public AActor

{

GENERATED_UCLASS_BODY()

public:

AMeleeWeapon();

//用这个武器造成伤害的大小

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = MeleeWeapon)

float AttackDamage;

//用这个列表来存储这个武器触碰到的物体,确保每一次攻击只对碰到物体造成一次伤害

TArray<AActor*> ThingsHit;

//保证没有挥动武器的时候不造成伤害

bool Swinging;

//使用武器的人物

AMonster *WeaponHolder;

//盒装碰撞器决定了该武器攻击到的范围

UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = MeleeWeapon)

UBoxComponent* ProxBox;

//武器样式

UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = MeleeWeapon)

UStaticMeshComponent* Mesh;

//碰撞函数

UFUNCTION(BlueprintNativeEvent, Category = "Collision")

void Prox(AActor* otherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult);

//挥动武器

void Swing();

//重置

void Reset();

};

.cpp文件

#include "CplusLearn.h"

#include "MeleeWeapon.h"

#include "Monster.h"

// Sets default values

AMeleeWeapon::AMeleeWeapon(const class FObjectInitializer & PCIP) :Super(PCIP)

{

AttackDamage = 1;

Swinging = false;

WeaponHolder = NULL;

//创建武器外形作为跟物体

Mesh = PCIP.CreateDefaultSubobject<UStaticMeshComponent>(this, TEXT("Mesh"));

RootComponent = Mesh;

//创建武器碰撞盒子

ProxBox = PCIP.CreateDefaultSubobject<UBoxComponent>(this, TEXT("ProxBox"));

//当有物体进入盒碰撞时触发Prox函数

ProxBox->OnComponentBeginOverlap.AddDynamic(this,&AMeleeWeapon::Prox);

ProxBox->AttachTo(RootComponent);

}

void AMeleeWeapon::Prox_Implementation(AActor * otherActor, UPrimitiveComponent* othrComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)

{

//若碰撞物体没有根组件,返回

if (othrComp != otherActor->GetRootComponent())

{

return;

}

//挥剑、碰撞到的人物不是自身 不能攻击一个人物多次

if (Swinging &&otherActor!=WeaponHolder&&!ThingsHit.Contains(otherActor))

{

otherActor->TakeDamage(AttackDamage + WeaponHolder->BaseAttackDamage, FDamageEvent(), NULL, this);

ThingsHit.Add(otherActor);

}

}

void AMeleeWeapon::Swing()

{

ThingsHit.Empty();

Swinging = true;

}

void AMeleeWeapon::Reset()

{

ThingsHit.Empty();

Swinging = false;

}

在完成基本武器的代码编写之后,我们可以从 http://tf3dm.com/3d-model/sword-95782.html 下载免费的剑的模型。

在场景中创建蓝图继承武器类,将武器的mesh选好并添加好碰撞之后

插座

插座在UE4中是一个放置物品在一套骨骼中显示另一个物体。你可以替换插座在任何的骨骼中。在你正确放置后,你可以通过其他的Actor找到插座的东西的UE4的编码中。

创建一个骨骼上插座在怪物的手里

首先找到怪物的模型,在他的手的位置加上Socket

最终加好剑后的效果



那么下面我们要通过编写代码让玩家有一把剑

我们需要打开怪物的头文件

//初始化组件

virtual void PostInitializeComponents()override;

。Cpp文件中添加

void AMonster::PostInitializeComponents()

{

Super::PostInitializeComponents();

//若武器存在

if (BPMeleeWeapon)

{

//获取武器

MeleeWeapon = GetWorld()->SpawnActor<AMeleeWeapon>(BPMeleeWeapon, FVector(), FRotator());

//有武器

if (MeleeWeapon)

{

//绑定到模型的手上

const USkeletalMeshSocket * socket = Mesh->GetSocketByName("Sword");

socket->AttachActor(MeleeWeapon, Mesh);

}

}

}

最终效果



本质上就是将武器绑定到了人物身上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: