// .h 文件
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "GameFramework/Actor.h"
#include "Avatar.h"
#include "MyHUD.h"
#include "PickupItem.generated.h"
UCLASS()
class HOWTO_CPPPLAYERINPUT_API APickupItem : public AActor
{
GENERATED_BODY()
public:
// The name of the item we are getting
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Item)
FString Name;
// How much you are getting
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Item)
int32 Quantity;
// the sphere you collide with to pick item up
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = Item)
USphereComponent* ProxSphere;
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = Item)
UStaticMeshComponent * Mesh;
// The icon that represents the object in UI/canvas
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Item)
UTexture2D* Icon;
// When something comes inside ProxSphere, this function runs
UFUNCTION(BlueprintNativeEvent, Category = Collision)
void Prox( UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult );
// Sets default values for this actor's properties
APickupItem();
// Called when the game starts or when spawned
virtual void BeginPlay() override;
// Called every frame
virtual void Tick( float DeltaSeconds ) override;
};
// .cpp文件
// Fill out your copyright notice in the Description page of Project Settings.
#include "HowTo_CppPlayerInput.h"
#include "PickupItem.h"
// Sets default values
APickupItem::APickupItem()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
Name = "UNKNOWN ITEM";
Quantity = 0;
ProxSphere = CreateDefaultSubobject<USphereComponent>(TEXT("ProxSphere"), false);
Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"), false);
// make the root object the Mesh
RootComponent = Mesh;
ProxSphere->AttachToComponent( Mesh, FAttachmentTransformRules::KeepRelativeTransform );
Mesh->SetSimulatePhysics(true);
// Code to make APickupItem::Prox() run when this
// object's proximity sphere overlaps another actor.
ProxSphere->OnComponentBeginOverlap.AddDynamic(this, &APickupItem::Prox); // very important!
}
void APickupItem::Prox_Implementation(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)
{
// if the overlapped actor is NOT the player,
// you simply should return
if( Cast<AAvatar>( OtherActor ) == nullptr )
{
return;
}
// Get a reference to the player avatar, to give him
// the item
AAvatar *avatar = Cast<AAvatar>( UGameplayStatics::GetPlayerPawn(GetWorld(), 0 ) );
// Let the player pick up item
// Notice use of keyword this!
// That is how _this_ Pickup can refer to itself.
avatar->Pickup( this );
// Get a reference to the controller
APlayerController* PController = GetWorld()->GetFirstPlayerController();
// Get a reference to the HUD from the controller
AMyHUD* hud = Cast<AMyHUD>( PController->GetHUD() );
hud->addMessage( Message( Icon, FString("Picked up ") + FString::FromInt(Quantity) + FString(" ") + Name, 5.f, FColor::White) );
Destroy();
}
// Called when the game starts or when spawned
void APickupItem::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void APickupItem::Tick( float DeltaTime )
{
Super::Tick( DeltaTime );
}