02
25

개발한 것

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
COMMENT