ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [UE5 RPG] 4. ๊ฑท๊ธฐ, ์ ํ”„ ์ด๋™ ์กฐ์ž‘ : GameplayAbilities, ์ ํ”„ Animation Blueprint
    UnrealEngine/SomedayProject 2025. 11. 1. 14:21

     

    ๐Ÿ“Œ Someday Proejct ๊ฐœ๋ฐœ์ผ์ง€ ์‹œ๋ฆฌ์ฆˆ

    ๋”๋ณด๊ธฐ
     

     


     

    ์• ๋‹ˆ๋ฉ”์ด์…˜์— Ablitiy ๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ์“ด๋‹ค๋Š”๋“ฏํ•˜๋‹ค

    ๋‚˜์ค‘์„ ์œ„ํ•ด ๋ฏธ๋ฆฌ ์„ธํŒ…ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ

    โœ๏ธ GameplayAbilities ๋ฅผ ์“ฐ๋ ค๋ฉด

    • SomedayProject.Build.cs ์— PublicDependencyModuleNames ์— ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ์ธ์‹๋จ
    • PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput", "GameplayAbilities" });

    EXEC : warning : D:\UEProject\SomedayProject\SomedayProject.uproject does not list plugin 'GameplayAbilities' as a dependency, but module 'SomedayProject' depends on 'GameplayAbilities'. ์—๋Ÿฌ๊ฐ€ ๋œจ๊ธดํ•˜๋Š”๋ฐ. ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์ง์ ‘ ๋„ฃ์–ด์ค˜์•ผํ•˜๋Š”๋“ฏ ์‹คํ–‰๋„ ์•ˆ๋จ

    • Plugin ์„ ๋จผ์ € ์—๋””ํ„ฐ์—์„œ ๋„ฃ์–ด์ฃผ๊ณ  ์‹คํ–‰ํ•ด์•ผํ• ๋“ฏ → ์•ˆํ•˜๊ณ  .uproject ์•ˆ์— ๋„ฃ์œผ๋ฉด ๋œ๋‹ค
    "Plugins": [
        {
            "Name": "GameplayAbilities",
            "Enabled": true
        },
    ]

    AbilityTags ๋ฅผ ํ™œ์šฉํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ์–ด

    • Map ์•ˆ์— bool ๋ณ€์ˆ˜๋ฅผ Tag๋ž‘ ๋งค์นญํ•ด์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ œ์–ดํ•˜๋„๋ก ํ•˜์ž

    Project Setting ์—์„œ GameplayTags ์— Movement ๊ด€๋ จ๋œ ํƒœ๊ทธ๋“ค์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค

     

     

    ๊ทธ๋Ÿผ ์ด๋Ÿฐ์‹์œผ๋กœ ๋งค์นญํ•  ์ˆ˜ ์žˆ์Œ

     

    if (UCharacterMovementComponent* TempComp = Cast< UCharacterMovementComponent>(OwningActor->GetComponentByClass(MoveComp->GetClass())))
    {
        MoveComp = TempComp;
    }

    ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งฐ๋”๋‹ˆ ์—๋””ํ„ฐ ์ผœ์ž๋งˆ์ž MoveComp ์—†๋‹ค๊ณ  ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ธฐ์‹œ์ž‘

    → MoveComp

    NativeInitializeAnimation ์˜ ํ˜ธ์ถœ์‹œ๊ธฐ๋Š” ๋น ๋ฅด๋‹ค..

    AnimInstance::InitializeAnimation ์—์„œ ํ˜ธ์ถœ๋˜๋Š”๋ฐ ์–˜๋Š” ๋˜ ๋ˆ„๊ฐ€๋ถ€๋ฅด๋‚˜..

     

    @TODO NativeInintialize ์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๊ธฐ.. ์—๋””ํ„ฐ๋ฅผ ์ผค๋•Œ ์‹œ์ž‘๋˜๋Š”๊ฒƒ๊ฐ™๊ธดํ•˜์ง€๋งŒ ์ •ํ™•ํ•˜๊ฒŒ ๋ชจ๋ฅด๋Š”๋“ฏ

     


    ๐Ÿšถ‍โ™€๏ธ‍โžก๏ธ๊ฑท๊ธฐ๋ถ€ํ„ฐ ๋งŒ๋“ค๊ธฐ

    ์ผ๋‹จ ๊ฐ„๋‹จํ•˜๊ฒŒ Velocity์— ๋Œ€ํ•ด์„œ๋งŒ ์›€์ง์ด๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์—ฐ๋™ํ•ด๋ณด๊ธฐ

    void UHeroAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
    {
        Super::NativeUpdateAnimation(DeltaSeconds);
    
        if (MoveComp)
        {
            Velocity = MoveComp->Velocity.Length();
            bHasAcceleratrion = MoveComp->GetCurrentAcceleration().Length() > 0;
    
            bWalking = Velocity > 0 && bHasAcceleratrion;
            bFalling = MoveComp->IsFalling();
        }
    }

    ์†๋„์™€ ๊ฐ€์†๋„๊นŒ์ง€ ํ™•์ธํ•ด์„œ Walking bool ๊ฐ’์„ ์ œ์–ดํ•œ๋‹ค

     

     

    ABP ์—์„œ transition ์— Walking ๋งŒ ๊ฑธ์–ด์ฃผ๋ฉด ๋จ

     

    @TODO ๋ฌ˜ํ•˜๊ฒŒ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋– ์žˆ๋‹ค.

    @TODO ๋งจ์ฒ˜์Œ์— ๋กœ๋”ฉํ•  ๋•Œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋”œ๋ ˆ์ด ์žˆ์Œ. ํ•œ๋ฒˆ์— ๋กœ๋”ฉํ•ด๋†“์œผ๋ฉด ๋ฌธ์ œ ์—†์„๋“ฏํ•จ (๋กœ๋”ฉ์”ฌ์ด ํ•„์š”ํ•œ ์ด์œ )

     

     


     

    ๐Ÿคธ ๋‹ค์Œ์€ ์ ํ”„

    ์‚ฌ์‹ค ๊ฐ€์žฅ ์–ด๋ ค์šธ ์ ํ”„

    ์ ํ”„ํ–ˆ์„ ๋•Œ์˜ ์ƒํƒœ์™€ ๋„์ฐฉํ–ˆ์„ ๋•Œ์˜ ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์”ฉ ๋‚˜๋ˆ„๋Š”๊ฒŒ ์ค‘์š”ํ• ๋“ฏํ•œ๋ฐ

     

    ์ผ๋‹จ ABP๋Š” ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑํ•˜๊ณ 

    1. JumpStart → JumpLoop๋Š” Jump ํŠธ๋ฆฌ๊ฑฐ ํ›„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹คํ–‰ ์‹œ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋ฐฉ๋ฒ•
    2. ๋›ฐ๋Š” ๋ชจ์…˜๊ณผ ์ฐฉ์ง€ ๋ชจ์…˜์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—”, Apex ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋–จ์–ด์ง€๋Š” ์ˆœ๊ฐ„์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ „ํ™˜ํ•œ๋‹ค (๋ชจ์…˜์ด ๊ฐ™์•„์„œ ํŒจ์Šค)
      1. Velocity, Gravity๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •์ ์— ๋‹ค๋‹ค๋ฅธ ๊ฒฝ์šฐ (Time ์ด 0.4๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ) Falling ์œผ๋กœ ์ „ํ™˜
    3. ์ ํ”„๊ฐ€ ๋๋‚œ ์ƒํ™ฉ์—์„œ ๊ฑท๋Š” ์ค‘์ด์—ˆ์œผ๋ฉด ๊ฑท๊ธฐ๋กœ, ๋ฉˆ์ถฐ์žˆ์—ˆ์œผ๋ฉด ๊ธฐ๋ณธ ์ƒํƒœ ๋Œ์•„๊ฐ€์•ผ ํ•˜๋ฏ€๋กœ 2๊ฐœ์˜ ํŠธ๋žœ์ง€์…˜์„ ๊ฑด๋‹ค

     

    ์• ๋‹ˆ๋ฉ”์ด์…˜๋“ค์˜ Loop ๊บผ์ฃผ๋Š”๊ฒƒ ์žŠ์ง€๋ง๊ธฐ

     

    โžก๏ธJumpSelector→ JumpStart

    ์ ํ”„ ์‹œ์ž‘์€ Falling์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค

     

    โžก๏ธJumpStart→ JumpLoop

    Jump ํŠธ๋ฆฌ๊ฑฐ ํ›„ ์ผ์ • ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹คํ–‰ ์‹œ๊ฐ„ ๊ธฐ์ค€

     

    โžก๏ธ JumpFalling → JumpEnd ํŒ๋‹จํ•˜๊ธฐ

    End ๊ฐ€ ๋์„ ๋•Œ๋งŒ ์ฐฉ์ง€ ๋ชจ์…˜์„ ํ‘œ์‹œํ•˜๊ณ  ๊ทธ ์ดํ›„์— ์ด๋™์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ

    ์ง€๊ธˆ ์ƒํƒœ๋กœ๋Š” ๊ฐ‘์ž๊ธฐ ๊ณต์ค‘์—์„œ Walk ์ƒํƒœ๋กœ ๋„˜์–ด๊ฐ€๊ณ  ๊ทธ๋Ÿฐ๋‹ค

     

     

    Jumping ์ด ๋๋‚œ ๋‹ค์Œ์—, z ๊ฐ€์†๋„๊ฐ€ ์—†์„ ๋•Œ ์ ํ”„๊ฐ€ ์ข…๋ฃŒ๋œ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•˜๊ธฐ๋กœ ํ•จ

     

    โžก๏ธ JumpEnd → JumpEndSelector

    ์ฐฉ์ง€ ๋ชจ์…˜์„ ๋„์šฐ๊ณ  ๊ทธ ๋‹ค์Œ์— ์–ด๋–ค ์ƒํƒœ๋กœ ๊ฐ€์•ผํ•˜๋Š”์ง€๋„ ํŒ๋‹จํ•ด์•ผ ํ•˜๋Š”๋ฐ (๋ฐ”๋กœ Walking ์œผ๋กœ ๊ฐˆ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ๊นŒ)

    ์ฐฉ์ง€๋ชจ์…˜์ด ๋๋‚œ ๋‹ค์Œ์— ํŒ๋‹จํ•˜๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•˜๋ฏ€๋กœ

     

     

    ์ฐฉ์ง€ ๋ชจ์…˜ ์‹คํ–‰ ratio ๊ฐ€ ๋๋‚ฌ์„ ๋•Œ ํŒ๋‹จํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค

     

     

     

    ์ฐฉ์ง€๊นŒ์ง€ ์ž˜ ๋˜๊ณ  ์ดํ›„ ๊ฑท๋Š”๊ฒƒ๊นŒ์ง€ ๋œ๋‹ค

    ๊ทผ๋ฐ ๊ณต์ค‘์—์„œ ๋ฌ˜ํ•˜๊ฒŒ ํ•œ๋ฒˆ ๋” ๋›ฐ๋Š” ๋™์ž‘์„ ํ•œ๋‹ค

     

    ๊ทธ๋ฆฌ๊ณ  ์ ํ”„ ์‹œ์ž‘ํ• ๋•Œ๋„ ๋А๋ฆฌ๊ณ 

    ์ฐฉ์ง€ํ•˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ• ๋•Œ๋„ ๋А๋ฆฌ๋‹ค.. ๋ญ๊ฐ€ ๋ฌธ์ œ์ผ๊นŒ?

    ์ฐฉ์ง€ ๋ชจ์…˜ ๋‚˜์˜ค๋Š”๊ฒŒ ๋А๋ ค์„œ ์ ํ”„ ์‹œ์ž‘๋„ ๋А๋ฆฌ๊ฒŒ ๋А๊ปด์ง€๋Š”๋“ฏํ•˜๋‹ค

     

     

    ๐ŸŽฏ ๋‹ค์Œ์— ํ•  ๊ฒƒ

    • ์ฐฉ์ง€ ๊ฐœ์„ ํ•˜๊ธฐ
    • ์ „ํˆฌ ์• ๋‹ˆ๋ฉ”์ด์…˜

     


    ์ด๋Ÿฐ ๊ธฐ๋ณธ ์กฐ์ž‘์ด ์€๊ทผ ๋””ํ…Œ์ผ ๊ฑด๋“ค๊ฒƒ๋„ ๋งŽ๊ณ  ์–ด๋ ต๋‹ค

     

     

     

    728x90
Designed by Tistory.