一.切换镜头
镜头切换,在一个Pawn里的多个镜头。可以使用UE中World Settings里的玩家控制器中,默认的控制器行为会对当前开启的Camera组件进行激活处理。
谁激活谁就是主相机。
Cast<UCameraComponent>(m_childComponentMap[it.CameraName])->SetAutoActivate(false);Cast<UCameraComponent>(m_childComponentMap[it.CameraName])->SetActive(false);
激活处理。
但是如果是两个Pawn之间切换,就要用Poccess 掌控。蓝图如下:
1.我用这两个都行,前提是这个是在世界里的物体。
APlayerController* tmpPC = UGameplayStatics::GetPlayerController(GetWorld(), 0);
APlayerController* tmpPC = UGameplayStatics::GetPlayerController(Cast<UObject>(this), 0);
APlayerController* PC1 = GetWorld()->GetFirstLocalPlayerFromController()->GetPlayerController(GetWorld());APlayerController* PC2 = GetWorld()->GetFirstPlayerController();APlayerController* PC3 = GEngine->GetFirstLocalPlayerController(GetWorld());APlayerController* PC4 = UGameplayStatics::GetPlayerController(GetWorld(), 0);
这里我是让每个Pawn自己抢夺,控制权。将Controller安在自己身上。实现不同Pawn之间的是视角切换。
tmpPC->SetViewTargetWithBlend(Cast<AActor>(this));tmpPC->Possess(this);
二. 全球视角 有点像卫星,绕着地球转。
1.这个主要讲思路因为实现,算是比较好实现了。
将控制拿到。
APlayerController* tmpPC = UGameplayStatics::GetPlayerController(Cast<UObject>(this), 0);if (tmpPC){tmpPC->SetViewTargetWithBlend(Cast<AActor>(this));tmpPC->Possess(this);/*m_childComponentMap[cameraName]->SetActive(true);usingCamera = Cast<UCameraComponent>(m_childComponentMap[cameraName]);*/}
2.通过GlobeAnchor位移,鼠标导致经纬移动,有插值和映射,离地球越远越快。
void AWorldCameraPawn::MoveX(float value)
{if (globeAnchor != nullptr){FVector curLLH = globeAnchor->GetLongitudeLatitudeHeight();double height = curLLH.Z;double change;change= UKismetMathLibrary::MapRangeClamped(height, 100, 100000, 0.001, 0.3);FVector toLLH = FVector(curLLH.X + value * change, curLLH.Y, curLLH.Z);FVector finalLLH = FVector(FMath::Lerp(curLLH.X, toLLH.X, 0.1), curLLH.Y, curLLH.Z);globeAnchor->MoveToLongitudeLatitudeHeight(finalLLH);globeAnchor->SetEastSouthUpRotation(FRotator(-90, 0 - 90, 0).Quaternion());}
}
3.滚轮 导致高度变化
void AWorldCameraPawn::MoveUp()
{if (globeAnchor != nullptr){FVector curLLH = globeAnchor->GetLongitudeLatitudeHeight();double height = curLLH.Z;double changeAltitude;double toAltitude;if (height > 10000){changeAltitude = UKismetMathLibrary::MapRangeClamped(height, 100, 100000, 10, 200000);toAltitude = curLLH.Z + changeAltitude; }else{changeAltitude = UKismetMathLibrary::MapRangeClamped(height, 100, 10000, 10, 1000);toAltitude = curLLH.Z + changeAltitude;}if (toAltitude < 300){toAltitude = 300;}FVector toLLH = FVector(curLLH.X, curLLH.Y, toAltitude);globeAnchor->MoveToLongitudeLatitudeHeight(toLLH);globeAnchor->SetEastSouthUpRotation(FRotator(-90, 0 - 90, 0).Quaternion());}
}
三.处理输入,最好在Controller里,为什么因为你的Pawn换了,你也能逻辑清晰,不必重写。
同一个输入,可以将不同的Pawn对应不同的功能,可能相同也可能不同。这里WorldPawn就是升高高度。而MyCameraPawn是伸缩弹簧臂。
void PlayerController::WheelUpFunction()
{if (GetPawn()) {AAirForce* MyCameraPawn = Cast<AAirForce>(GetPawn());if (MyCameraPawn) {MyCameraPawn->Zoom(0, 10);}AWorldCameraPawn* WorldCameraPawn = Cast<AWorldCameraPawn>(GetPawn());if (WorldCameraPawn){WorldCameraPawn->MoveDown();}}
}