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