개발한 것
TPS 게임에서 조준할때? 보이는 조준점을 구현. (찾아보니 영어로 Crosshair라고 한다.)
참고한 자료
구현
UserWidget을 C++를 사용해서 코드를 작성했다. 전체 코드 보다는 일부 코드만 작성공개.
MainHudWidget.h
더보기
class UBorder;
class GETTOJOB_API UGJ_MainWidget : public UUserWidget
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category = "Crosshair Test")
void SetCrosshairSize(float NewSpread);
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Crosshair")
float CrossSpread = 0.0f;
private:
//crosshair
UPROPERTY(meta = (BindWidget))
UBorder* CrosshairTop;
UPROPERTY(meta = (BindWidget))
UBorder* CrosshairBottom;
UPROPERTY(meta = (BindWidget))
UBorder* CrosshairLeft;
UPROPERTY(meta = (BindWidget))
UBorder* CrosshairRight;
UPROPERTY(Transient, meta = (BindWidgetAnim))
UWidgetAnimation* FireAnim;
//UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Crosshair")
float CrossLength = 10.0f;
//UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Crosshair")
float CrossThickness = 5.0f;
}
MainHudWidget.cpp
더보기
void UGJ_MainWidget::ShowHitAnim()
{
if (HitImage && HitAnim)
{
HitImage->SetVisibility(ESlateVisibility::Visible);
PlayAnimation(HitAnim);
}
}
void UGJ_MainWidget::SetCrosshairSize(float NewSpread)
{
if (!CrosshairTop || !CrosshairBottom || !CrosshairLeft || !CrosshairRight)
return;
CrossSpread = NewSpread;
FVector2D HorizontalSize(CrossLength, CrossThickness); //가로 크기
FVector2D VerticalSize(CrossThickness, CrossLength); //세로 크기
float x, y;
if (UCanvasPanelSlot* BottomSlot = Cast<UCanvasPanelSlot>(CrosshairBottom->Slot))
{
BottomSlot->SetSize(VerticalSize);
x = -(CrossThickness / 2);
y = (CrossLength - 8) + CrossSpread;
BottomSlot->SetPosition(FVector2D(x, y));
}
if (UCanvasPanelSlot* TopSlot = Cast<UCanvasPanelSlot>(CrosshairTop->Slot))
{
TopSlot->SetSize(VerticalSize);
x = -(CrossThickness / 2);
y = -CrossLength - CrossSpread;
TopSlot->SetPosition(FVector2D(x, y));
}
if (UCanvasPanelSlot* LeftSlot = Cast<UCanvasPanelSlot>(CrosshairLeft->Slot))
{
LeftSlot->SetSize(HorizontalSize);
x = -CrossLength - CrossSpread;
y = -(CrossThickness / 2);
LeftSlot->SetPosition(FVector2D(x, y));
}
if (UCanvasPanelSlot* RightSlot = Cast<UCanvasPanelSlot>(CrosshairRight->Slot))
{
RightSlot->SetSize(HorizontalSize);
x = (CrossLength + CrossSpread) - CrossLength;
y = -(CrossThickness / 2);
RightSlot->SetPosition(FVector2D(x, y));
}
}
void UGJ_MainWidget::PlayFireAnim()
{
if (CrosshairTop && CrosshairBottom && CrosshairLeft && CrosshairRight && FireAnim)
{
PlayAnimation(FireAnim);
}
}
'언리얼 > 게임 개발 일지' 카테고리의 다른 글
| 네트워크가 적용된 숫자 야구 게임 (0) | 2025.03.25 |
|---|