[UE] Around 스킬 구현하기

목차
Plugins |
||||
Weapon |
||||
Resource |
||||
Icon128.png weapon_thumbnail_icon.png |
||||
Source |
||||
Weapon | ||||
SWeaponCheckBoxes.h .cpp SWeaponDetailsView.h .cpp SWeaponDoActionData.h .cpp SWeaponEquipmentData.h .cpp SWeaponHitData.h .cpp SWeaponLeftArea.h .cpp Weapon.Build.cs WeaponAssetEditor.h .cpp WeaponAssetFactory.h .cpp WeaponCommand.h .cpp WeaponContextMenu.h .cpp WeaponModule.h .cpp WeaponStyle.h .cpp |
||||
Source | ||
U2212_06 | ||
Characters | ||
CAnimInstance.h .cpp CEnemy.h .cpp CPlayer.h .cpp ICharacter.h .cpp |
||
Components | ||
CMontagesComponent.h .cpp CMovementComponent.h .cpp CStateComponent.h .cpp CStatusComponent.h .cpp CWeaponComponent.h .cpp |
||
Notifies | ||
CAnimNotifyState_BeginAction.h .cpp CAnimNotify_CameraShake.h .cpp CAnimNotifyState_EndAction.h .cpp CAnimNotify_EndState.h .cpp CAnimNotifyState.h .cpp CAnimNotifyState_CameraAnim.h .cpp CAnimNotifyState_Collision.h .cpp CAnimNotifyState_Combo.h .cpp CAnimNotifyState_Equip.h .cpp CAnimNotifyState_SubAction.h .cpp |
||
Utilities | ||
CHelper.h CLog.h .cpp |
||
Weapons | ||
CAura.h .cpp CCamerModifier.h .cpp CGhostTrail.h .cpp CRotate_Object.h .cpp CThornObject.h .cpp 생성 CDoAction_Around.h .cpp CDoAction_Combo.h .cpp CDoAction_Warp.h .cpp CSubAction_Around.h .cpp 생성 CSubAction_Fist.h .cpp CSubAction_Hammer.h .cpp CSubAction_Sword.h .cpp CDoAction_Warp.h .cpp CAttachment.h .cpp CDoAction.h .cpp CEquipment.h .cpp CSubAction.h .cpp CWeaponAsset.h .cpp CWeaponStructures.h .cpp |
||
Global.h CGameMode.h .cpp U2212_06.Build.cs |
||
U2212_06.uproject | ||
Around 스킬 구현하기
Around_SubAction_Montage 생성

CSubAction_Around 생성
새 C++ 클래스 생성 - CSubAction - CSubAction_Around 생성


CSubAction_Around.h
더보기
#pragma once #include "CoreMinimal.h" #include "Weapons/CSubAction.h" #include "Weapons/CWeaponStructures.h" #include "CSubAction_Around.generated.h" UCLASS(Blueprintable) class U2212_06_API UCSubAction_Around : public UCSubAction { GENERATED_BODY() private: UPROPERTY(EditDefaultsOnly, Category = "FallObject") TSubclassOf<class ACThornObject> ObjectClass; UPROPERTY(EditDefaultsOnly, Category = "FallObject") FVector ObjectLocation;//Spawn시킬 위치 private: UPROPERTY(EditDefaultsOnly, Category = "Action") FDoActionData ActionData; public: UCSubAction_Around(); public: virtual void Pressed() override; virtual void Begin_SubAction_Implementation() override; virtual void End_SubAction_Implementation() override; };
CSubAction_Around.cpp
더보기
#include "Weapons/SubActions/CSubAction_Around.h" #include "Global.h" #include "GameFramework/Character.h" #include "Components/CStateComponent.h" #include "Components/CMovementComponent.h" #include "Weapons/AddOns/CThornObject.h" UCSubAction_Around::UCSubAction_Around() { } void UCSubAction_Around::Pressed() { Super::Pressed(); CheckTrue(State->IsSubActionMode()); State->OnSubActionMode(); ActionData.DoAction(Owner); } void UCSubAction_Around::Begin_SubAction_Implementation() { Super::Begin_SubAction_Implementation(); FActorSpawnParameters params; params.Owner = Owner; params.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; FTransform transform; FVector ownerLocation = Owner->GetActorLocation(); ownerLocation += Owner->GetActorRotation().RotateVector(ObjectLocation); transform.SetLocation(ownerLocation); Owner->GetWorld()->SpawnActor<ACThornObject>(ObjectClass, transform, params); } void UCSubAction_Around::End_SubAction_Implementation() { Super::End_SubAction_Implementation(); State->OffSubActionMode(); State->SetIdleMode(); Movement->Move(); }
BP_CSubAction_Around 생성


CThornObject
새 C++ 클래스 생성 - Actor- CThornObject 생성
CThornObject.h
더보기
#pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "NiagaraDataInterfaceExport.h" #include "Weapons/CWeaponStructures.h" #include "CThornObject.generated.h" UCLASS() class U2212_06_API ACThornObject : public AActor, public INiagaraParticleCallbackHandler { GENERATED_BODY() private: UPROPERTY(EditDefaultsOnly, Category = "Hit") FHitData HitData; UPROPERTY(EditDefaultsOnly, Category = "Niagara") class UStaticMesh* NiagaraMesh;//나이아가라 매쉬 UPROPERTY(EditDefaultsOnly, Category = "Niagara") FRotator NiagaraMeshRotation;//회전값 UPROPERTY(EditDefaultsOnly, Category = "Collision") class UFXSystemAsset* CollisionEffect;//충돌 했을때 이펙트 UPROPERTY(EditDefaultsOnly, Category = "Collision") FTransform CollisionEffectTransform;//충돌했을때 보정 위치값 private: UPROPERTY(VisibleDefaultsOnly) class USceneComponent* Root; UPROPERTY(VisibleDefaultsOnly) class UNiagaraComponent* Niagara; public: ACThornObject(); protected: virtual void BeginPlay() override; public: void ReceiveParticleData_Implementation(const TArray<FBasicParticleData>& Data, UNiagaraSystem* NiagaraSystem); private: UFUNCTION() void OnSystemFinished(class UNiagaraComponent* PSystem); private: FVector BoxExtent;//Finished 되었을 때 계산할 Box };
CThornObject.cpp
더보기
#include "Weapons/AddOns/CThornObject.h" #include "Global.h" #include "NiagaraComponent.h" #include "GameFramework/Character.h" ACThornObject::ACThornObject() { CHelpers::CreateComponent<USceneComponent>(this, &Root, "Root");//Root 생성 CHelpers::CreateComponent<UNiagaraComponent>(this, &Niagara, "Niagara", Root);//나이아가라 컴포넌트 생성 } void ACThornObject::BeginPlay() { Super::BeginPlay(); Niagara->SetNiagaraVariableObject("Collision", this); Niagara->OnSystemFinished.AddDynamic(this, &ACThornObject::OnSystemFinished); if (!!NiagaraMesh)//NiagaraMesh가 있다면 { FBox box = NiagaraMesh->GetBoundingBox();//NiagaraMesh 충돌체 사이즈 BoxExtent = (box.Min - box.Max).GetAbs() * 0.5f;//부피로 전환해서 사용. } } void ACThornObject::ReceiveParticleData_Implementation(const TArray<FBasicParticleData>& Data, UNiagaraSystem* NiagaraSystem) { CheckFalse(Data.Num() > 0); //박스 추적 //static을 사용하는이유? //매 프레임 마다 Tick 결과 데이터가 매번 할당되고 지워져서 stack으로 계속 쌓인다. stack 데이터가 커지는걸 방지하기 위해 static으로 사용한다. static은 한 번 할당하면 제거가 일어나지 않기 때문에 유리하다. 계속 반복 할당되어야 되는것들은 static으로 사용하면 좋다. static TArray<AActor*> ignores; ignores.AddUnique(GetOwner()); static FHitResult hitResult; for(int32 i = Data.Num() - 1; i >= 0; i--)//거꾸로 사용한 이유? 중간에 먼저 삭제되는 경우 TArray가 땡겨져서 문제가 발생할 수 있으므로 거꾸로 처리한다. { FVector position = Data[i].Position + GetActorLocation(); FVector scale = Data[i].Velocity * BoxExtent; UKismetSystemLibrary::BoxTraceSingleByProfile(GetWorld(), position, position, scale, NiagaraMeshRotation, "Pawn", false, ignores, EDrawDebugTrace::ForOneFrame, hitResult, true);//Pawn 추적, 복합충돌 false, if (hitResult.bBlockingHit) { if (!!CollisionEffect) { FTransform transform = CollisionEffectTransform; transform.AddToTranslation(hitResult.Location); CHelpers::PlayEffect(GetWorld(), CollisionEffect, transform); } ACharacter* character = Cast<ACharacter>(hitResult.GetActor()); if (!!character) HitData.SendDamage(Cast<ACharacter>(GetOwner()), this, character); } } } void ACThornObject::OnSystemFinished(UNiagaraComponent* PSystem) { Destroy();//나이아가라를 제거한다. }
BP_CThornObject 생성



DA_Around에 BP_CSubAction_Around 할당

Sub Action Class: BP_CSubAction_Around 할당
실행화면

나이아가라 이펙트 수정하기
NS_Thorn_Projectile 가져오기 + 수정하기



25개를 떨어뜨리기 위해서 Spawn Count 25 설정.

Initial Mesh Orientation 0.0, 0.0, 1.0 설정.

Box Location을 추가한 후 박스 사이즈 설정.

Gravity는 Velocity 항목보다 위에 위치해야 한다.

Export Particle Data to Blueprint 추가
- Export Particle Data to Blueprint는 데이터를 빼올때 사용한다.
- Condition To Export Data 체크
- Collision 연결
NS_Projectile_Hit 가져오기 + 수정하기




실행화면

'⭐ Unreal Engine > UE RPG Skill' 카테고리의 다른 글
[UE] 활 조준 (0) | 2023.07.06 |
---|---|
[UE] 활 구현하기 (0) | 2023.07.05 |
[UE] Around 공격 구현하기 (0) | 2023.07.03 |
[UE] 워프 Top View 만들기 (0) | 2023.06.30 |
[UE] 워프 구현하기 (0) | 2023.06.29 |
댓글
이 글 공유하기
다른 글
-
[UE] 활 조준
[UE] 활 조준
2023.07.06 -
[UE] 활 구현하기
[UE] 활 구현하기
2023.07.05 -
[UE] Around 공격 구현하기
[UE] Around 공격 구현하기
2023.07.03 -
[UE] 워프 Top View 만들기
[UE] 워프 Top View 만들기
2023.06.30
댓글을 사용할 수 없습니다.