获取编辑器视口选中了哪些Actors?
USelection* SelectedActors = GEditor->GetSelectedActors();
if (SelectedActors)
{
TArray<UObject*> SelectedActorsArr;
SelectedActors->GetSelectedObjects(AActor::StaticClass(), SelectedActorsArr);
if (SelectedActorsArr.Num() != 1)
{
UE_LOG(LogTemp, Error, TEXT("SelectedActorNum != 1"));
return;
}
FTransform SelectedActorTransform;
UObject* curObj = SelectedActorsArr[0];
AActor* Actor = Cast<AActor>(curObj);
if (Actor)
{
SelectedActorTransform = Actor->GetTransform();
UE_LOG(LogTemp, Warning, TEXT("SelectedActor Transform:%s"), *SelectedActorTransform.ToString());
}
else
{
return;
}
}
编辑器视口中如何生成Actor?
UWorld* World = GCurrentLevelEditingViewportClient ? GCurrentLevelEditingViewportClient->GetWorld() : nullptr;
if (!World)
{
return;
}
//创建可生成的镜头代码参考void FSequencer::CreateCamera()
//void FSequencer::CreateCamera()主要是点击sequencer工具Toolbar上的“Create Camera”执行的。
const FScopedTransaction Transaction(LOCTEXT("CreateCameraFromTemplete", "Create Camera From Templete"));
FActorSpawnParameters SpawnParams;
// Don't bother transacting this object if we're creating a spawnable since it's temporary
SpawnParams.ObjectFlags &= ~RF_Transactional;
// Set new camera to match viewport
ACameraActor* NewCamera = World->SpawnActor<ACameraActor>(cameraClass,SelectedActorTransform,SpawnParams);
if (!NewCamera)
{
UE_LOG(LogTemp,Error,TEXT("Spawn Templete Camera Actor return null."));
return;
}
知道两个世界坐标系下的FTransform,如果计算坐标B对于坐标A的相对坐标? 如果只计算Location,可以通过 A.InverseTransformPosition(B.Location);类似的函数参见InverseTransform*相关函数。 如果计算的是Transform,可以知道:
B = F(相对坐标)*A;
B*Inverse(A) = F(相对坐标)*A*Inverse(A)=F(相对坐标)
所以F(相对坐标) = B*Inverse(A)
如何在游戏运行时动态获得屏幕的截图信息(例如巫师中的存档图片等)? 一开始尝试调用的是GetViewportScreenShot函数,但是发现直接调用这个函数是存在问题,比如打包后运行或者standalone模式运行发现返回的是纯黑的内容,问了下官方人员,官方人员建议我使用FScreenshotRequest::RequestScreenshot,而且不用长时间等待数据。具体如何使用可参考:Engine\Source\Developer\FunctionalTesting\Private\ScreenshotFunctionalTest.cpp,这个调用不仅能生成图片文件,而且还可以通过注册回调函数拿到图片的数据。 如图,如果Idle动画播放了一半切换成了Stand状态,动画会从idle融合到Stand动画,如果这时候再切到Idle状态,stand融合到的是idle一半时候的姿势,我们想融合到Idle最开始的姿势。 解决办法:勾选Blend Poses by int结点的Reset Child on Activation. 蓝图中的And和Or操作没有短路原则。 行为树资源如果出现了循环引用,则会出现REINST的错误,解决办法就是解除循环引用。比如Pawn运行行为树,行为树内部引用了Pawn,导致了循环引用,我的做法是在Pawn的C++层面运行行为树。行为树配置到全局的表格当中。
|