UE4 nutzt die CPU, um ViewSize zu erhalten und eine genaue Mausauswahl von Werbetafeln zu implementieren

  • ViewSize abrufen
APlayerController* controller = UGameplayStatics::GetPlayerController(World, 0);
ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(controller->Player);  
FSceneView* View = nullptr;  
FIntPoint ViewSize = LocalPlayer->ViewportClient->Viewport->GetSizeXY();
if (LocalPlayer)  
{  
   // Create a view family for the game viewport  
   FSceneViewFamilyContext ViewFamily(FSceneViewFamily::ConstructionValues(  
         LocalPlayer->ViewportClient->Viewport,  
         GetWorld()->Scene,  
         LocalPlayer->ViewportClient->EngineShowFlags)  
      .SetRealtimeUpdate(true));  
   // Calculate a view where the player is to update the streaming from the players start location  
   FVector ViewLocation;  
   FRotator ViewRotation;  
   View = LocalPlayer->CalcSceneView(&ViewFamily, /*out*/ ViewLocation, /*out*/ ViewRotation, LocalPlayer->ViewportClient->Viewport);  
}
  • Erzielen Sie präzise Mausklicks auf die obersten Karten
FVector2D PickUV()  
{  
   // return FVector2D(0.3,0.2);  
   //获取中心点  
   auto World = GWorld->GetGameInstance()->GetWorld();  
   APlayerController* controller = UGameplayStatics::GetPlayerController(World, 0);  
   APlayerCameraManager* manager = UGameplayStatics::GetPlayerCameraManager(World, 0);  
   if( !controller || !controller->PlayerCameraManager )  
      return FVector2D::ZeroVector;  
     
   //获取鼠标点击位置  
   float mousePositionX, mousePositionY;  
   controller->GetMousePosition(mousePositionX, mousePositionY);  
     
   //part1 zoom size  
   auto keepSize = this->BKeepSize ? 1.0f : 0.0f;  
   auto spritePositionWS = this->GetActorTransform().GetLocation();  
   FVector2D spritePositionSS = FVector2D::ZeroVector;  
   UUnrealUtils::ProjectWorldSpaceToScreenSpace(controller,spritePositionWS,spritePositionSS);  
   auto cameraPositionWS = manager->GetRootComponent()->GetComponentTransform().GetLocation();  
   auto disObjToCam = FVector::Distance(spritePositionWS,cameraPositionWS);  
   auto subObjToCam = spritePositionWS - cameraPositionWS;  
   subObjToCam.Normalize();  
   auto cameraDirectionVector = manager->GetRootComponent()->GetComponentTransform().ToMatrixNoScale().TransformVector(FVector(1, 0, 0));  
   auto dot = FVector::DotProduct(subObjToCam, cameraDirectionVector);  
   auto disObjToCamSize = dot * disObjToCam;  
   auto disSize = FMath::Lerp(this->ScreenSizeScale / 0.0025f / disObjToCamSize, 1.0f, keepSize);  
   //part1 sprite size  
   auto SpriteSize= GetSpriteSize();  
   FVector scale = this->GetTransform().GetScale3D();  
   float maxScaleFactor = FMath::Max3(scale.X, scale.Y, scale.Z);  
   SpriteSize *= maxScaleFactor;  
  
   //获取到左上角的点(0,0)的屏幕坐标位置然后求比例  
   float originX, originY;  
   FVector2D pickLocation = FVector2D::ZeroVector;  
   if (!this->BKeepSize)  
   {  
      auto realScreenResolution = SpriteSize / 2 * disSize;  
      originX = spritePositionSS.X - realScreenResolution.X;  
      originY = spritePositionSS.Y - realScreenResolution.Y;  
      pickLocation.Set((mousePositionX - originX) / (SpriteSize.X * disSize), (mousePositionY - originY) / (SpriteSize.Y * disSize));  
   }  
   else  
   {  
      auto realScreenResolution = SpriteSize / 2 ;  
      originX = spritePositionSS.X - realScreenResolution.X;  
      originY = spritePositionSS.Y - realScreenResolution.Y;  
      pickLocation.Set((mousePositionX - originX) / (SpriteSize.X * disSize), (mousePositionY - originY) / (SpriteSize.Y * disSize));  
   }  
   return pickLocation;//,图片左上角为(0,0),左下角为(1,1),返回的pickLocation中的x和y介于0~1  
}
  • endgültige Wirkung
    Fügen Sie hier eine Bildbeschreibung ein

Supongo que te gusta

Origin blog.csdn.net/zx1091515459/article/details/129465488
Recomendado
Clasificación