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

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>(thisTEXT("Mesh"));

RootComponent = Mesh;

//創建武器碰撞盒子

ProxBox = PCIP.CreateDefaultSubobject<UBoxComponent>(thisTEXT("ProxBox"));

//當有物體進入盒碰撞時觸發Prox函數

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

ProxBox->AttachTo(RootComponent);

 

}

 

 

void AMeleeWeapon::Prox_Implementation(AActor * otherActorUPrimitiveComponentothrCompint32 OtherBodyIndexbool bFromSweepconst FHitResult & SweepResult)

{

//若碰撞物體沒有根組件,返回

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

{

return;

}

//揮劍、碰撞到的人物不是自身 不能攻擊一個人物多次

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

{

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

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);

}

}

}

 

最終效果

 

 

本質上就是將武器綁定到了人物身上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章