1. 程式人生 > >【UE4】【C++】藍圖新增UI(準心……)、獲得準心對準的方向(進行旋轉……)

【UE4】【C++】藍圖新增UI(準心……)、獲得準心對準的方向(進行旋轉……)

藍圖新增UI:

1、建立UI


2、

新增Image

3、新增對應的圖片以及調整瞄點的位置以及瞄位(相對於圖片的位置)

位置(直接移動白色的❀到30,50)

瞄位(設定0.5,0.5的Alignment即可將瞄點瞄到圖片中心)

4、在PlayerController中加入UI


Create Widget(先創建出UI)--->Add to Viewport(加入到螢幕中)

獲得準心對準的方向:(C++)

已提供的方法:

GetViewPortSize(int32& SizeX, int32& SizeY)

//這兩個值(SizeX,SizeY)被賦予了值:螢幕的XY(PlayerController內的方法)

//準心的位置(SizeX*X對應的瞄位Alignment(藍圖中設定的),SizeY*Y對應的瞄位Alignment)

DeprojectScreenPositionToWorld(float ScreenX, float ScreenY, FVector& WorldLocation, FVector& WorldDirection)

//由螢幕上的準心位置(返回準心的世界座標WorldLocation和瞄準的方向WorldDirection)

PlayerCameraManager->GetCameraLocation()

//PlayerController下的方法,獲得攝像機的位置,作為StartLocation(射線起點)

GetWorld()->LineTraceSingelByChannel(    //返回布林值(撞到為true)

struct FHitResult& OutHit,        //返回出射線射到的目標

const FVector& Start,            //射線起點

const FVector& End,        //射線終點

ECollisionChannel TraceChannel,    //設定射到的目標是哪種型別(ECC_Visibility)

const FCollisionQueryParams& Params /* = FCollisionQueryParams::DefaultQueryParam */,     //有預設值

const FCollisionResponseParams& ResponseParam /* = FCollisionResponseParams::DefaultResponseParam *//有預設值

)

void ATankPlayerController::Tick(float DeltaTime) {
//Move to AimLocation 移動視線
AimToTarget();//不停的尋找我們要撞擊哪一個點
}
void ATankPlayerController::AimToTarget() {
	FVector HitLocation;
	if (GetSightRayLocation(HitLocation)) {
		//移動炮臺
	}
}

bool ATankPlayerController::GetSightRayLocation(FVector &OutHitLocation) {
	int32 ViewportSizeX, ViewportSizeY;
	GetViewportSize(ViewportSizeX, ViewportSizeY);//這兩個值被賦予了螢幕的大小(PlayerController內的方法)
	FVector2D ScreenLocation = FVector2D(ViewportSizeX*CrosshairXLocation, ViewportSizeY*CrosshairYLocation);//準心在螢幕的位置
	
	FVector WorldLocation;
	FVector WorldDirection;	//LookDirection
	if (DeprojectScreenPositionToWorld(ScreenLocation.X, ScreenLocation.Y, WorldLocation, WorldDirection)) {	//返回一個bool值以確定找到沒有
		GetLookVectorHitLocation(WorldDirection, OutHitLocation);

		return true;
	};
	return false;
}

//返回一個射線撞擊點
bool ATankPlayerController::GetLookVectorHitLocation(FVector LookLocation, FVector & OutHitLocation)
{
	//建立射線 (起點、終點)
	FVector StartLocation = PlayerCameraManager->GetCameraLocation();//PlayerController下的方法(獲得攝像機的位置)
	FVector EndLocation = StartLocation + LookLocation * LineTraceRange;

	FHitResult HitResult;
	if (GetWorld()->LineTraceSingleByChannel(
		HitResult,
		StartLocation,
		EndLocation,
		ECollisionChannel::ECC_Visibility
	)) {
		OutHitLocation = HitResult.Location;//傳出具體的撞擊點位置
		return true;
	}
	OutHitLocation = FVector(0.0f);//沒找到也要對傳出的值賦予一個預設值
	return true;
}