Mini

[UE5] 발사체 적방향으로 발사구현, shift키 + 허공클릭시 발사구현// 캐릭 겹침시 카메라 확대 해결, 클라에서 발사체 방향 버그 수정 본문

UE5/Ability Tasks

[UE5] 발사체 적방향으로 발사구현, shift키 + 허공클릭시 발사구현// 캐릭 겹침시 카메라 확대 해결, 클라에서 발사체 방향 버그 수정

Mini_96 2024. 6. 13. 01:44

* 발사체 적방향으로 구현

- spell > 발사체소환함수에

타겟의 위치 변수 추가

class AURA_API UAuraProjectileSpell : public UAuraGameplayAbility
{
    GENERATED_BODY()

protected:
    virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo,
       const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override;

    UFUNCTION(BlueprintCallable, Category="Projectile")
    void SpawnProjectile(const FVector& ProjectileTargetLocation);

- 방향벡터 얻고(b-a), 방향설정

※ 쿼터니언 :

쿼터니언 왜 쓰는데?
euler 좌표계에서는, x,y,z 회전을 한번에 계산 못한다. (순서대로 해야한다.)
Gimbal lock 문제가 발생한다.
반면, 쿼터니언 좌표계에서는, x,y,z 회전을 한번에 계산 가능하다.
일반적인 3차원 벡터를 회전시키려면 복잡한 행렬 연산이 필요하지만, 쿼터니언을 사용하면 더 간단하고 빠른 계산이 가능합니다.

 

void UAuraProjectileSpell::SpawnProjectile(const FVector& ProjectileTargetLocation)
{
    //발사체는 서버에서생성, 클라는 복제본을 보게될거임
    //발사체가 서버에있는지 어케암?
    const bool bIsServer = GetAvatarActorFromActorInfo()->HasAuthority(); //아바타액텨 ==불 의 권위확인
    if(! bIsServer) return ; //발사체가 서버있는경우만 발사체 생성

    ICombatInterface* CombatInterface = Cast<ICombatInterface>(GetAvatarActorFromActorInfo()); //해당액터가 전투인터를 구현하면, 얻을수있음
    if(CombatInterface)
    {
       const FVector SocketLocation = CombatInterface->GetCombatSocketLocation();
       FRotator Rotation = (ProjectileTargetLocation - SocketLocation).Rotation(); //방향벡터의 회전각 구하기
       Rotation.Pitch=0.f; // 지면과 평행하게 움직이도록
       
       FTransform SpawnTransform; //발사체생성할 위치 == 지팡이끝 / but, 캐릭터에의존하면안됨, 전투인터페이스에서 소켓위치를 반환받으면 좋겠음.
       SpawnTransform.SetLocation(SocketLocation); //쿼터니언 : 짐벌락없는 회전표현방법

BP 에서 연결
결과

- 내 pc : 클라에서는 이상한방향으로 발사되는 버그가 있는듯???

 

* 버그수정

:캐릭 겹침시 카메라 확대

- 해결 : 캡슐, 매쉬가 카메라 무시하도록 설정

// Sets default values
AAuraCharacterBase::AAuraCharacterBase()
{
    // Set this character to call Tick() every frame.
    // You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = false; //틱마다 tick함수 실행하지마

    //캐릭겹치면 카메라 줌인 해결 : 캡슐, 매시가 카메라 무시하도록
    GetCapsuleComponent()->SetCollisionResponseToChannel(ECC_Camera,ECR_Ignore);
    GetMesh()->SetCollisionResponseToChannel(ECC_Camera,ECR_Ignore);

 

* shift키 + 허공클릭시 발사구현

- IA 만들기

 

- IMC 에 추가

- PC에서 바인딩

변수추가, 바인딩함수, 체크변수추가

UPROPERTY(EditAnywhere,Category="Input")
TObjectPtr<UInputAction> ShiftAction;

void ShiftPressed(){bShiftKeyDown=true;};
void ShiftReleased(){bShiftKeyDown=false;};
bool bShiftKeyDown=false;

바인딩

void AAuraPlayerController::SetupInputComponent()
{
    Super::SetupInputComponent(); // 부모 클래스의 SetupInputComponent() 함수 호출

   ...
    AuraInputComponent->BindAction(ShiftAction, ETriggerEvent::Started, this, &AAuraPlayerController::ShiftPressed);
    AuraInputComponent->BindAction(ShiftAction, ETriggerEvent::Completed, this, &AAuraPlayerController::ShiftReleased);

- held 함수 수정

void AAuraPlayerController::AbilityInputTagHeld(FGameplayTag InputTag) //누르는중
{
    ...
    
    //LMB인경우, 달리는 문제를 해결해야함
    //타겟팅중인 적이 있는 경우 or 쉬프트키누르눈중
    if(bTargeting || bShiftKeyDown)
    {
       if(GetASC())
       {
          GetASC()->AbilityInputTagHeld(InputTag); //ASC의 함수호출 (능력활성화 : 불발사)
       }
    }

-relase 함수수정

void AAuraPlayerController::AbilityInputTagReleased(FGameplayTag InputTag) //뗌
{
    //LMB가 아닌 일반태그인 경우, 그냥 능력을 활성화하고 끝냄
    if(!InputTag.MatchesTagExact(FAuraGameplayTags::Get().InputTag_LMB))
    {
       if(GetASC())
       {
          GetASC()->AbilityInputTagReleased(InputTag); //ASC의 함수호출
       }
       return;
    }

    //쉬프트키랑 상관없이, 마우스놓으면 ASC에 알림
    if(GetASC()) GetASC()->AbilityInputTagReleased(InputTag); //ASC의 함수호출 (입력이더이상 안눌린다고 알림)
    
    //아래의경우 거기로 부드럽게 이동 구현
    if(!bTargeting && !bShiftKeyDown)
    {
       ...
    }

}

 

BP_PC에서 IA에 의존성주입
결과 : 쉬프트 누른채 허공클릭해도 불이나감

 

 

* 클라에서 발사체 방향 버그 수정

wtf?

- 해결 : 

유효데이터가 있을때만 실행되도록 변경

아마, 유효하지않는 데이터로 설정되어 버그가 생긴것으로 추정.

 

https://github.com/DongHoonYu96/GameplayAbilitySystem_Aura/commit/02232ef3498a2e670ab0f768eeee7a912fbb369d

 

feat : 발사체 적방향으로 발사구현, shift키 + 허공클릭시 발사구현 · DongHoonYu96/GameplayAbilitySystem_Aur

Bisu96 committed Jun 12, 2024

github.com