(1)FairyGUI 创建血条控件
(2) //角色血条
UGComponent* m_pCharHp; .h文件声明变量
(3)
UWorld* kWorld = GetWorld();
m_pCharHp = UUIPackage::CreateObject(TEXT("FightGame"), TEXT("charHp"), (UObject*)kWorld)->As<UGComponent>();
if (m_pCharHp != nullptr)
{
m_pCharHp->SetParentToRoot();
m_pCharHp->MakeFullScreen(true);
UGObject* CharHpWin = m_pCharHp->GetChild("CharHp");
float modelWidth = GetCapsuleComponent()->GetUnscaledCapsuleRadius()/50.0f * 160.0f;
CharHpWin->SetWidth(modelWidth);
}
(4)设置位置
UWorld* kWorld = GetWorld();
FConstPlayerControllerIterator playerIterator = kWorld->GetPlayerControllerIterator();
FVector2D sreenPos;
tempCurrentPos.Z = tempCurrentPos.Z + 150.0f;
UGameplayStatics::ProjectWorldToScreen(playerIterator->Get(), tempCurrentPos, sreenPos);
FVector2D resPos = m_pCharHp->GetUIRoot()->GlobalToLocal(sreenPos);
m_pCharHp->SetPosition(sreenPos);
本文在Tick中调用
注意:位置设置一次时,在BeginPlay中调用ProjectWorldToScreen会失败,要延迟调用才对
效果移动地图血条相对角色的位置会变,没有Unity正交相机血条的效果
(5)将UGameplayStatics::ProjectWorldToScreen 换成 UWidgetLayoutLibrary::ProjectWorldLocationToWidgetPosition(playerIterator->Get(), tempCurrentPos, sreenPos,false);血条的效果就对了