(1)需要重写Pawn对象,因为有鼠标选中事件,用到InputComponent
(2)需要继承自DefaultPawn对象,因为这个Pawn里面包含W/S/A/D等键盘事件
(3)重写里面的virtual函数,需要加上Super::该函数。例如BegainPlay,如果不加上Super::BeginPlay()则W/S/A/D消息失效,因为很多操作初始化都在BeginPlay函数中。
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "GameFramework/DefaultPawn.h"
#include "MyDefaultPawn.generated.h"
/**
*
*/
UCLASS()
class CANVAS_API AMyDefaultPawn : public ADefaultPawn
{
GENERATED_BODY()
public:
virtual void BeginPlay() override;
virtual void SetupPlayerInputComponent(UInputComponent* InInputComponent) override;
void OnMouseDoubleClick();
void DrawLine(FVector& vStart, FVector& vEnd);
void ClearBB();
void DrawBB(const TArray<FVector>& vertices);
public:
TArray<FVector> MakeBBVertices(FVector& vStart, FVector& vEnd);
public:
UPROPERTY()
AActor* m_pSelectedActor;
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "Canvas.h"
#include "MyDefaultPawn.h"
void AMyDefaultPawn::SetupPlayerInputComponent(UInputComponent* InInputComponent)
{
Super::SetupPlayerInputComponent(InputComponent);
FInputActionKeyMapping myDoubleClick("DoubleClick", EKeys::LeftMouseButton, 0, 0, 0, 0);
GetWorld()->GetFirstPlayerController()->PlayerInput->AddActionMapping(myDoubleClick);
InputComponent->BindAction("DoubleClick", IE_DoubleClick, this, &AMyDefaultPawn::OnMouseDoubleClick);
}
void AMyDefaultPawn::BeginPlay()
{
Super::BeginPlay();
m_pSelectedActor = nullptr;
}
void AMyDefaultPawn::DrawLine(FVector& vStart, FVector& vEnd)
{
FBatchedLine batchLine;
batchLine.Start = vStart;
batchLine.End = vEnd;
batchLine.Color = FLinearColor::Green;
ULineBatchComponent* const LineBatcher = GetWorld()->PersistentLineBatcher;
if (LineBatcher != NULL)
{
LineBatcher->DrawLine(vStart, vEnd, FLinearColor::Green, 10, 2);
}
}
void AMyDefaultPawn::ClearBB()
{
ULineBatchComponent* const LineBatcher = GetWorld()->PersistentLineBatcher;
if (LineBatcher != NULL)
{
LineBatcher->Flush();
}
}
void AMyDefaultPawn::DrawBB(const TArray<FVector>& vertices)
{
FVector v0 = vertices[0];
FVector v1 = vertices[1];
FVector v2 = vertices[2];
FVector v3 = vertices[3];
FVector v4 = vertices[4];
FVector v5 = vertices[5];
FVector v6 = vertices[6];
FVector v7 = vertices[7];
//top
DrawLine(v0, v1);
DrawLine(v1, v2);
DrawLine(v2, v3);
DrawLine(v3, v0);
//bottom
DrawLine(v4, v5);
DrawLine(v5, v6);
DrawLine(v6, v7);
DrawLine(v7, v4);
//left
DrawLine(v0, v1);
DrawLine(v1, v5);
DrawLine(v5, v4);
DrawLine(v4, v0);
//right
DrawLine(v3, v2);
DrawLine(v2, v6);
DrawLine(v6, v7);
DrawLine(v7, v3);
//front
DrawLine(v1, v2);
DrawLine(v2, v6);
DrawLine(v6, v5);
DrawLine(v5, v1);
//back
DrawLine(v0, v3);
DrawLine(v3, v7);
DrawLine(v7, v4);
DrawLine(v4, v0);
}
void AMyDefaultPawn::OnMouseDoubleClick()
{
UE_LOG(LogTemp, Warning, TEXT("OnLeftMouseButtonDoubleClick!"));
FHitResult HitResult;
Cast<APlayerController>(Controller)->GetHitResultUnderCursor(ECC_Visibility, false, HitResult);
if (HitResult.bBlockingHit)
{
if (HitResult.Actor != NULL)
{
FString strName = HitResult.GetActor()->GetName();
UE_LOG(LogTemp, Warning, TEXT("%s"), *strName);
AActor* pActor = HitResult.GetActor();
//如果选择对象发生变化,则需要重新绘制
if (pActor != m_pSelectedActor)
{
//重新画之前需要把原来绘制清掉
ClearBB();
FVector vOrigin;
FVector vBoxExtent;
HitResult.Actor->GetActorBounds(true, vOrigin, vBoxExtent);
TArray<FVector> vertices = MakeBBVertices(vOrigin, vBoxExtent);
DrawBB(vertices);
//保存选中对象
m_pSelectedActor = pActor;
}
}
else
{
ClearBB();
}
}
}
TArray<FVector> AMyDefaultPawn::MakeBBVertices(FVector& vOrigin, FVector& vBoxExent)
{
TArray<FVector> result;
FVector v0;
v0.X = vOrigin.X - vBoxExent.X;
v0.Y = vOrigin.Y + vBoxExent.Y;
v0.Z = vOrigin.Z + vBoxExent.Z;
result.Add(v0);
FVector v1;
v1.X = vOrigin.X + vBoxExent.X;
v1.Y = vOrigin.Y + vBoxExent.Y;
v1.Z = vOrigin.Z + vBoxExent.Z;
result.Add(v1);
FVector v2;
v2.X = vOrigin.X + vBoxExent.X;
v2.Y = vOrigin.Y - vBoxExent.Y;
v2.Z = vOrigin.Z + vBoxExent.Z;
result.Add(v2);
FVector v3;
v3.X = vOrigin.X - vBoxExent.X;
v3.Y = vOrigin.Y - vBoxExent.Y;
v3.Z = vOrigin.Z + vBoxExent.Z;
result.Add(v3);
FVector v4;
v4.X = vOrigin.X - vBoxExent.X;
v4.Y = vOrigin.Y + vBoxExent.Y;
v4.Z = vOrigin.Z - vBoxExent.Z;
result.Add(v4);
FVector v5;
v5.X = vOrigin.X + vBoxExent.X;
v5.Y = vOrigin.Y + vBoxExent.Y;
v5.Z = vOrigin.Z - vBoxExent.Z;
result.Add(v5);
FVector v6;
v6.X = vOrigin.X + vBoxExent.X;
v6.Y = vOrigin.Y - vBoxExent.Y;
v6.Z = vOrigin.Z - vBoxExent.Z;
result.Add(v6);
FVector v7;
v7.X = vOrigin.X - vBoxExent.X;
v7.Y = vOrigin.Y - vBoxExent.Y;
v7.Z = vOrigin.Z - vBoxExent.Z;
result.Add(v7);
return result;
}