[Unreal] 캐릭터 μ• λ‹ˆλ©”μ΄μ…˜ κ°œμ„ 

2024. 8. 18. 16:03Β·πŸ“ Game/✏ Unreal

1. λΈ”λ Œλ“œ 슀페이슀(Blend Space)

κ±·κΈ°, λ›°κΈ° λ“± κΈ°μ‘΄ μ• λ‹ˆλ©”μ΄μ…˜μ˜ κ΅¬ν˜„ 방식은 FSM ꡬ쑰둜 νŠΉμ • 쑰건에 λ§žλŠ” μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ¦‰μ‹œ μ‹€ν–‰λ˜λ„λ‘ κ΅¬ν˜„λ˜μ–΄ μžˆμ—ˆλ‹€. κ·Έλž˜μ„œ 이 방식은 μ• λ‹ˆλ©”μ΄μ…˜ μ „ν™˜μ΄ 일어날 λ•Œ λ”±λ”± λŠκΈ°λŠ” λŠλ‚Œμ΄ λ“€μ—ˆλ‹€.

 

FSM

 

μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ „ν™˜ν•  λ•Œ λΆ€λ“œλŸ½κ²Œ λ°”λ€Œλ„λ‘ λΈ”λ Œλ“œ 슀페이슀λ₯Ό μ‚¬μš©ν•  것이닀. λΈ”λ Œλ“œ μŠ€νŽ˜μ΄μŠ€λŠ” 두 μž…λ ₯값에 따라 μ• λ‹ˆλ©”μ΄μ…˜μ„ λΈ”λ Œλ”© μ‹œμΌœ μ€€λ‹€.

 

λΈ”λ Œλ“œ 슀페이슀 생성

 

λΈ”λ Œλ“œ 슀페이슀λ₯Ό μƒμ„±ν•œ ν›„, λ¨Όμ € μΆ• μ„ΈνŒ…μ΄ ν•„μš”ν•˜λ‹€.

 

λΈ”λ Œλ“œ 슀페이슀 μˆ˜μ •

  • Vertical Axis
    • Name: Speed
    • Minimum Axis Value: 0
    • Maximum Axis Value: 700
    • Smoothing Time: 0.1. 값이 클수둝 λΆ€λ“œλŸ½κ²Œ μ „ν™˜λœλ‹€.

 

ν˜„μž¬ μΊλ¦­ν„°μ˜ κ±·κΈ° μ†λ„λŠ” 500, λ›°κΈ° μ†λ„λŠ” 700으둜 μ„€μ •λ˜μ–΄ μžˆμ–΄ 이 값에 맞게 μ• λ‹ˆλ©”μ΄μ…˜μ„ λ°°μΉ˜ν•΄ μ€€λ‹€.

 

에디터 κ·Έλ¦¬λ“œ μˆ˜μ •

  • Idle μ• λ‹ˆλ©”μ΄μ…˜: Speed 0
  • Walk μ• λ‹ˆλ©”μ΄μ…˜: Speed 500
  • Run μ• λ‹ˆλ©”μ΄μ…˜: Speed 700

 

λΈ”λ Œλ“œ 슀페이슀의 Speed λ³€μˆ˜λ₯Ό μ„€μ •ν•˜κΈ° μœ„ν•΄ 캐릭터 AnimInstance ν΄λž˜μŠ€μ— Speed κ°’ μΆ”κ°€κ°€ ν•„μš”ν•˜λ‹€.

 

UPROPERTY(BlueprintReadOnly)
float CharacterSpeed;
void USurvivorCharacterAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
	Super::NativeUpdateAnimation(DeltaSeconds);

	if (IsValid(Character) == false)
	{
		auto Pawn = TryGetPawnOwner();
		Character = Cast<ASurvivorCharacter>(Pawn);
	}

	if (IsValid(Character))
	{
		CharacterSpeed = Character->GetCharacterMovement()->Velocity.Length();
		...
	}
}

 

λ§ˆμ§€λ§‰μœΌλ‘œ μ• λ‹˜ κ·Έλž˜ν”„μ—μ„œ λΈ”λ Œλ“œ 슀페이슀λ₯Ό μ μš©ν•œ ν›„ ν”Œλ ˆμ΄ν•˜λ©΄, κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™λ‹€. 이전보닀 λΆ€λ“œλŸ½κ²Œ μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ „ν™˜λ˜κ³  μžˆλ‹€.

 

λΈ”λ Œλ“œ 슀페이슀

 

2. λͺ¨μ…˜ μ›Œν•‘(Motion Warping)

기계 수리 λ“± νŠΉμ • 앑터와 μƒν˜Έμž‘μš©ν•˜λŠ” μ• λ‹ˆλ©”μ΄μ…˜μ΄ ν•„μš”ν•œ 경우 λ‹€μŒκ³Ό 같은 λ¬Έμ œκ°€ μžˆμ—ˆλ‹€. λ¬Όλ‘  수리 μ• λ‹ˆλ©”μ΄μ…˜μ΄ 싀행될 λ•Œ 기계λ₯Ό 바라보도둝 νšŒμ „μ„ ν•˜λŠ” λ“±μ˜ μž‘μ—…μ„ ν•  μˆ˜λ„ μžˆμ§€λ§Œ, ν•˜λ‚˜μ˜ μ½”λ“œλ‘œ λͺ¨λ“  상황에 μ μ ˆν•œ νšŒμ „μ„ ν•˜κΈ° μ–΄λ ΅λ‹€λŠ” 점과 더 μžμ—°μŠ€λŸ¬μš΄ μ• λ‹ˆλ©”μ΄μ…˜μ„ μœ„ν•΄ λͺ¨μ…˜ μ›Œν•‘μ„ μ‚¬μš©ν•˜κΈ°λ‘œ ν–ˆλ‹€.

 

기계 수리 μ• λ‹ˆλ©”μ΄μ…˜

 

λͺ¨μ…˜ μ›Œν•‘μ€ μΊλ¦­ν„°μ˜ 루트 λͺ¨μ…˜μ΄ 타깃과 μΌμΉ˜ν•˜λ„λ‘ λ™μ μœΌλ‘œ μ •λ ¬ν•˜λŠ” κΈ°λŠ₯이닀. μΊλ¦­ν„°μ˜ 루트λ₯Ό 직접 μ΄λ™μ‹œν‚€λŠ” 방법이 μ•„λ‹ˆλ©° 루트 λͺ¨μ…˜ μ• λ‹ˆλ©”μ΄μ…˜μ„ λ³΄κ°„ν•˜μ—¬ 캐릭터λ₯Ό μ΄λ™μ‹œν‚€λŠ” 방식이닀. 파쿠λ₯΄λ‚˜ μ•”μ‚΄ λ“±μ˜ λ‹€μ–‘ν•œ κ³³μ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

λͺ¨μ…˜ μ›Œν•‘μ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν”ŒλŸ¬κ·ΈμΈ 섀정이 ν•„μš”ν•˜λ‹€.

 

PublicDependencyModuleNames.AddRange(
	new string[] {
		...
		"MotionWarping"
    }
);

 

이제 λͺ¨μ…˜ μ›Œν•‘μ„ μ‚¬μš©ν•  λͺ½νƒ€μ£Όμ—μ„œ μ• λ‹ˆλ©”μ΄μ…˜κ³Ό λͺ¨μ…˜ μ›Œν•‘μ„ μΆ”κ°€ν•˜κ³  Warp Target Name을 μ„€μ •ν•œλ‹€. Warp Target Name을 톡해 μ›Œν”„ 타깃을 찾게 λœλ‹€.

 

μ• λ‹ˆλ©”μ΄μ…˜ λͺ½νƒ€μ£Ό μˆ˜μ •

 

μ΄λ•Œ μΆ”κ°€ν•œ μ• λ‹ˆλ©”μ΄μ…˜λ“€μ€ 루트 λͺ¨μ…˜μ˜ EnableRootMotionλ₯Ό ν™œμ„±ν™”ν•΄μ•Ό ν•œλ‹€.

 

μ• λ‹ˆλ©”μ΄μ…˜ EnableRootMotion ν™œμ„±ν™”

 

이제 캐릭터에 λͺ¨μ…˜ μ›Œν•‘ μ»΄ν¬λ„ŒνŠΈλ₯Ό μΆ”κ°€ν•˜κ³ , λͺ½νƒ€μ£Όκ°€ μž¬μƒλ˜κΈ° 전에 νƒ€κΉƒμ˜ μœ„μΉ˜μ™€ νšŒμ „μ„ μ„€μ •ν•œλ‹€.

 

UPROPERTY()
UMotionWarpingComponent* MotionWarpingComponent;
ASurvivorCharacter::ASurvivorCharacter()
{
	...
	MotionWarpingComponent = CreateDefaultSubobject<UMotionWarpingComponent>(TEXT("MotionWarping"));
}

MachineInstall()
{
	FMotionWarpingTarget Target = {};
	Target.Name = FName("Machine");
	Target.Location = GetActorLocation();
	Target.Rotation = UKismetMathLibrary::FindLookAtRotation(GetActorLocation(), InstallMachine->GetActorLocation());
	
	MotionWarpingComponent->AddOrUpdateWarpTarget(Target);
}
  • AddOrUpdateWarpTarget: λͺ½νƒ€μ£Ό μ—μ…‹μ—μ„œ μ •μ˜λœ μ›Œν”„ 타깃 이름을 μœ„μΉ˜λ‘œ λ§ν¬ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.

 

이제 ν”Œλ ˆμ΄ν•΄ 보면 κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™λ‹€. μ„€μ • 값을 μˆ˜μ •ν•˜λ©΄ μ’€ 더 μ •ν™•ν•˜κ²Œ λ™μž‘ν•  것 κ°™λ‹€.

 

λͺ¨μ…˜ μ›Œν•‘

μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Game/✏ Unreal' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Unreal] μ΅œμ ν™”
  • [Unreal] νŒ¨ν‚€μ§•
  • [Unreal] ν”„λ‘œνΌν‹°(λ¦¬ν”Œλ ‰μ…˜), 맀크둜, κ°€λΉ„μ§€ μ»¬λ ‰μ…˜
  • [Unreal] κ²Œμž„ μΈμŠ€ν„΄μŠ€, μ„œλΈŒμ‹œμŠ€ν…œ
Blxxming
Blxxming
CS 지식과 κ³΅λΆ€ν•˜λ‹€ 배운 것, κ²½ν—˜ν•œ 것 등을 κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
  • Blxxming
    πŸ’‘λ²ˆλœ©πŸ’‘
    Blxxming
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • Tech Interview
    • πŸ“š Tech (246)
      • πŸ“ Computer Science (96)
        • ✏ OS (12)
        • ✏ Network & Web (10)
        • ✏ Database (11)
        • ✏ Data Structure (6)
        • ✏ Algorithm (40)
        • ✏ Design Pattern (9)
        • ✏ Cloud Computing (3)
        • ✏ (5)
      • πŸ“ Language (73)
        • ✏ Language (6)
        • ✏ C & C++ (11)
        • ✏ C# (19)
        • ✏ JAVA (37)
      • πŸ“ Game (43)
        • ✏ Computer Graphics (2)
        • ✏ Unity (14)
        • ✏ Unreal (26)
        • ✏ (1)
      • πŸ“ Book (34)
        • ✏ Effective (3)
        • ✏ Game Server (16)
        • ✏ Clean Code (14)
        • ✏ (1)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Blxxming
[Unreal] 캐릭터 μ• λ‹ˆλ©”μ΄μ…˜ κ°œμ„ 
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”