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);
}
}
}
最終效果
本質上就是將武器綁定到了人物身上