1. λΈλ λ μ€νμ΄μ€(Blend Space)
κ±·κΈ°, λ°κΈ° λ± κΈ°μ‘΄ μ λλ©μ΄μ μ ꡬν λ°©μμ 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λ₯Ό νμ±νν΄μΌ νλ€.
μ΄μ μΊλ¦ν°μ λͺ¨μ μν μ»΄ν¬λνΈλ₯Ό μΆκ°νκ³ , λͺ½νμ£Όκ° μ¬μλκΈ° μ μ νκΉμ μμΉμ νμ μ μ€μ νλ€.
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: λͺ½νμ£Ό μμ μμ μ μλ μν νκΉ μ΄λ¦μ μμΉλ‘ λ§ν¬νλ λ° μ¬μ©λλ€.
μ΄μ νλ μ΄ν΄ 보면 κ²°κ³Όλ λ€μκ³Ό κ°λ€. μ€μ κ°μ μμ νλ©΄ μ’ λ μ ννκ² λμν κ² κ°λ€.