UE4选中对象后生成BoundingBox线框

(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;
}



猜你喜欢

转载自blog.csdn.net/luofeixiongsix/article/details/80259499
UE4
今日推荐