목차

     

     


     

     

     
    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