您的位置:首页 > 编程语言 > C语言/C++

【UE4】【C++】蓝图添加UI(准心……)、获得准心对准的方向(进行旋转……)

2018-03-04 02:29 736 查看
蓝图添加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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  准心