[Unreal_C++_DarkSoul]#8_문제 해결, Send Damage 방식 수정

2022. 12. 18. 02:00· 개인프로젝트
목차
  1.  
  2. [Unreal_C++_DarkSoul]#8_문제 해결, Send Damage 방식 수정

 

[Unreal_C++_DarkSoul]#8_문제 해결, Send Damage 방식 수정

 

Weapon 클래스가 Power Component를 통해 피격 대상에게 데미지 전달하는 방식을 수정합니다.

포트폴리오 진행 사항을 기록하기 위한 포스팅입니다.

 


 

Overview

 

  1. 문제점 고찰 및 해결책 제시
  2. 결과 코드

 

문제점

1. Sword.cpp

void ASword::OnCapsuleBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	CheckNull(OtherActor);

	AActor* OwnerActor = GetOwner();
	CheckNull(OwnerActor);

	CheckTrue(OtherActor == OwnerActor);

	if (AttackHitActors.Contains(OtherActor) != true)
	{
		GetPowerComponent()->SendDamge(OwnerActor, OtherActor, IsSkillAttack, SkillBasePower);

		AttackHitActors.Add(OtherActor);
	}
}

 

Problems

 

  1. 커플링: 각 무기별 충돌 과정에서 피격 대상에게 Damgae를 전달하기 위해 Power Component를 경유합니다.
  2. Type-Safe: Weapon 클래스는 데미지 전달 동작을 위해 "Power Component" 데이터 타입을 꼭 알아야 합니다.
  3. 코드 중복: 각 하위 클래스들은 데미지 전달 동작을 위해 #include "PowerComponent.h" 등의 코드가 필수적입니다.
  4. 유지 보수: Power Component 개발 중 문제가 발생하면, 모든 무기 하위 클래스들에게 영향을 끼칩니다.

 

Solutions

 

  1. Custom Delegate를 활용하여 Weapon 클래스의 데미지 전달 동작을 캡슐화합니다.
  2. Custom Delegate를 활용하여 보다 범용성이 높은 일반화 프로그래밍이 가능해집니다.
  3. Custom Delegate를 활용하여 Type-Safety를 보장합니다.

 

해결

 

 

[Unreal]#21_Custom Delegate

[Unreal]#21_Custom Delegate Unreal 개발 중 "Custom Delegate"에 대해 알아보겠습니다. 커스텀 대리자 함수 시그니처 생성 방법에 대해 살펴보겠습니다. Custom Delegate Signature 1. DECLARE_DLEEGATE DECLARE_DELEGATE(DELEGATE_

webddevys.tistory.com

 

1. Weapon.h

/*****************************************************************************************************************

[Remark]: FourParms -> FiveParams

목적:
	Weapon의 피격 과정에서 "Staus Effect", 즉 상태 이상 공격을 추가 구현하기 위해 EAttributeType을 인자로 추가합니다.
설명:
	1. FourParms -> FiveParams 로 교체
	2. C_PowerComponent 에서 Load하는 Weapon의 Power Information 중 "Attribute(속성)" 또한 Damage 전달 구현에 포함합니다.

*****************************************************************************************************************/

DECLARE_DELEGATE_RetVal_FourParams(bool, FWeaponCollisionBeginOverlap, AActor*, AActor*, bool, float);

class Weapon
{

//...

public:
	FWeaponCollisionBeginOverlap OnWeaponCollisionBeginOverlap;
    
//...

};

 

Details

 

  • Weapon 클래스 외부에 Custom Delegate를 선언합니다.
  • Weapon 클래스 내부에 미리 정의한 Custom Delegate 유형의 멤버를 선언합니다.

 

2. Sword::OnCapsuleBeginOverlap()

void ASword::OnCapsuleBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	CheckNull(OtherActor);

	AActor* OwnerActor = GetOwner();
	CheckNull(OwnerActor);

	CheckTrue(OtherActor == OwnerActor);

	if (AttackHitActors.Contains(OtherActor) != true)
	{
		if (OnWeaponCollisionBeginOverlap.IsBound())
		{
			OnWeaponCollisionBeginOverlap.Execute(OwnerActor, OtherActor, IsSkillAttack, SkillBasePower);

			AttackHitActors.Add(OtherActor);
		}
	}

}

 

Details

 

  • Sword 클래스, Weapon 클래스를 상속하는 하위 클래스들 중 하나를 살펴보겠습니다.
  • Power Component를 가져와 노출시키는 것이 아니라, 단순히 커스텀 델리게이트와 바인딩된 함수들을 실행시킵니다.
  • 바인딩된 위치가 캡슐화되어 유지보수성 향상을 기대할 수 있겠습니다.
  • 다만, 팀 프로젝트에서 다른 팀원들에게 혼란을 줄 수도...?

 

3. PowerComponent::BeginPlay()

void UC_PowerComponent::BeginPlay()
{
	//...
	AActor* OwnerActor = GetOwner();
	CheckNull(OwnerActor);

	Cast<AWeapon>(OwnerActor)->OnWeaponCollisionBeginOverlap.BindUFunction(this, TEXT("SendDamage"));
}

 

Details

 

  • Weapon 클래스에서 제공하는 델리게이트 함수를 "SendDamage()" 함수와 바인딩을 수행합니다.

 

 

 

'개인프로젝트' 카테고리의 다른 글

[Unreal_C++_DarkSoul]#10_문제 해결, AIController  (0) 2022.12.25
[Unreal_C++_DarkSoul]#9_기능 구현, Status Effect 기능  (0) 2022.12.18
[Unreal_C++_DarkSoul]#7_문제 해결, Magic Projectile  (0) 2022.12.17
[Unreal_C++_DarkSoul]#6_기능 구현, Targeting 기능  (0) 2022.12.10
[Unreal_C++_DarkSoul]#5_기능 구현, Target Point, Enemy Spawn 위치  (0) 2022.12.10
  1.  
  2. [Unreal_C++_DarkSoul]#8_문제 해결, Send Damage 방식 수정
'개인프로젝트' 카테고리의 다른 글
  • [Unreal_C++_DarkSoul]#10_문제 해결, AIController
  • [Unreal_C++_DarkSoul]#9_기능 구현, Status Effect 기능
  • [Unreal_C++_DarkSoul]#7_문제 해결, Magic Projectile
  • [Unreal_C++_DarkSoul]#6_기능 구현, Targeting 기능
Hardii2
Hardii2
Hardii2
개발 블로그
Hardii2
전체
오늘
어제
  • 분류 전체보기
    • 알고리즘
    • 웹 개발
      • Node.js
      • React
    • 게임개발
      • DirectX12
      • 관련 지식
      • Unreal C++
      • Unreal 블루프린트
    • 언어
      • Effective C++
      • Basic C++
      • 디자인 패턴
      • 자료구조
      • 기술 질문
    • 문제 풀이
      • BOJ 문제 풀이
      • Programmers 문제 풀이
      • geeksForgeeks 문제 풀이
    • 수학
      • 확률과 통계
      • 게임수학
    • 개인프로젝트
    • 그룹프로젝트
      • PM
      • Dev
    • Github

블로그 메뉴

  • 홈
  • 글쓰기

공지사항

인기 글

태그

  • Unreal Blueprint
  • Effective C++
  • BOJ
  • 트리
  • stl
  • 개발
  • BFS
  • programmers
  • unreal
  • 알고리즘
  • 디자인 패턴
  • 우선순위 큐
  • set
  • C++
  • DP
  • 기술 질문
  • 그래프
  • dfs
  • 최단 경로
  • 정렬

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Hardii2
[Unreal_C++_DarkSoul]#8_문제 해결, Send Damage 방식 수정
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.