목차

     

     


     

     

     
    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