* 발사체 적방향으로 구현
- 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); //쿼터니언 : 짐벌락없는 회전표현방법
- 내 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)
{
...
}
}
* 클라에서 발사체 방향 버그 수정
- 해결 :
아마, 유효하지않는 데이터로 설정되어 버그가 생긴것으로 추정.
'UE5 > Ability Tasks' 카테고리의 다른 글
[UE5] 발사체 이펙트, 소리, 수명 구현 (0) | 2024.06.15 |
---|---|
[UE5] 발사체 방향으로 캐릭회전 구현 (0) | 2024.06.15 |
[UE5] GAS 에서 예측 개념 (0) | 2024.06.12 |
[UE5] 클라에서 서버로 data 보내고 받기 구현, 클라에서 캐릭안보임버그 해결 (0) | 2024.06.12 |
[UE5] GAS::Target Data System // 클라에서 서버로 data 전달방법 (0) | 2024.06.10 |