
재생할 몽타주들을 여기서 관리하고 몽타주 재생도 관리한다.
PlayerBase, AnimInstance, StateComponent를 참조 변수로 저장해두고 사용한다.
함수는
PlayEquipMontage, PlayAttackMontage : 몽타주 재생하는 함수
PlayNextSection : 콤보구현을 위해 노티파이에 사용될 다음 섹션을 재생시키는 함수
AttackMontageFinished : Attack몽타주 재생끝날때 상태들과 변수 초기화용 함수
그리고 콤보구현용 bool 변수들도 추가해두었다.
Actor를 상속받은 무기의 틀이될 클래스이다.
SkeletalMesh, BoxCollision, SceneComponent(Trace시작, 끝 설정용)
으로 구성되어있다.
무기의 SkeletalMesh에는 사진과 같이 Start, End 소켓을 추가해두어야한다.
두 소켓의 위치에 맞춰서 SceneComponents의 위치를 설정하고 사용하기 위해서이다.
void AWeaponBase::InitSceneComponents() { FAttachmentTransformRules transformRules(EAttachmentRule::KeepRelative, true); Start->AttachToComponent(Mesh, transformRules, TEXT("Start")); End->AttachToComponent(Mesh, transformRules, TEXT("End")); } void AWeaponBase::InitBoxCollision() { float distanceStartEnd = FVector::Dist(Mesh->GetSocketLocation(TEXT("Start")), Mesh->GetSocketLocation(TEXT("End"))); float distanceStartRoot = FVector::Dist(Mesh->GetSocketLocation(TEXT("Start")), Mesh->GetBoneLocation("Root")); BoxCollision->SetRelativeLocation(FVector(0.f,0.f, distanceStartRoot + (distanceStartEnd / 2))); BoxCollision->SetBoxExtent(FVector(10.f, 10.f, distanceStartEnd / 2)); }BeginPlay에서 두 함수를 호출해서
Start, End 소켓에 맞춰 SceneComponent(Start, End)를 Attach한다.
그리고 InitBoxCollision 함수에서 두 SceneComponent의 위치를 이용해서 BoxCollision의 위치와 길이를 자동으로 조정해주었다.
이렇게 자동으로 설정해둔 소켓에 맞게 콜리전 박스가 조절된다.
그리고 캐릭터에서 무기를 Equip, Unequip할 때 사용하도록 AttachMeshToSocket함수도 만들어 두었다.void AWeaponBase::AttachMeshToSocket(USceneComponent* InParent, const FName& InSocketName) { FAttachmentTransformRules transformRules(EAttachmentRule::KeepRelative, true); Mesh->AttachToComponent(InParent, transformRules, InSocketName); }노티파이스테이트에서 쓰일 BoxCollision을 켜고 끄는 함수, OnBoxBeginOverlap에 바인딩할 함수와 적이 감지되면 Trace를 실행하도록 BoxTrace함수도 구현해두었다.
BeginPlay에서 스폰시킬 Weapon의 Class변수( TSubclassOf로 담아둠 )
스폰한 Weapon을 담을 변수
GetEquippedWeapon 함수를 추가해두었고
무기를 장착하고 해제할때 사용할 Arm, Disarm함수를 추가했다. 이 두 함수는 EquipMontage에 맞춰서 노티파이로 호출된다.
플레이어나 적 등 여러곳에 쓰일 Hit되었을 때 호출될 함수를 가상함수로 추가해두었다.
public: UFUNCTION(BlueprintNativeEvent) void GetHit(const FVector& ImpactPoint, float Strength, AActor* HitActor);ImpactPoint는 맞은 위치, Strength는 피격 반응을 구별하기위한 수치로 Enum으로 공격의 강도를 구분할 수 있었지만 공격하는 캐릭터는 공격에 맞는 일정한 Strength를 주고, 받는 입장에선 저항 수치에 따라 반응하도록 설계하기위해 float 변수로 설정하였다.
임시로 Enemy의 Base기능들만 구현했다. IHitInterface를 상속받고 구현해두었다.
ImpactPoint에 따라 맞은 방향을 계산해서 SectionName을 적용시켜서 방향에 맞는 몽타주를 재생시키도록 구현하였다.
노티파이와 노티파이 스테이트들을 만들고 적용시켰다.
콤보가 잘 구현되었고 휘두름에 맞춰 Trail이 나오고, Collision이 켜져서 적을 검출하고 인터페이스로 구현해둔 GetHit을 호출해서 맞는 방향에 따라 HitReact몽타주가 잘 재생되고있다.