16. 몬스터 리스폰 구현과 맵 적용

2023. 9. 30. 21:25·[게임 개발] 개발 일지/RPG

서론

이번에는 몬스터를 죽여도 일정 시간 이후에 다시 살아나는 기능을

타이머와 SpawnActor를 통해 구현해 보고,

에셋을 이용하여 플레이할 맵을 만들어 보고 몬스터를 배치하여 게임의 전체적인 모습을 잡아보도록 하겠습니다.

 


리스폰 구현

우선 리스폰 시스템의 구현을 위하여 Enemy 클래스의 SetDead 함수를 수정해 보도록 하겠습니다.

SetDead는 몬스터의 체력이 0이 되면 호출되는 함수로 지금은 AI 기능이 멈추고

플레이중인 몽타주를 정지시키고 충돌 기능을 끄는 코드들만 구현되어 있어서 다음 코드처럼 수정하였습니다.

 

void ARPGEnemy::SetDead()
{
	ARPGAIController* AIController = Cast<ARPGAIController>(Controller);
	// AI 중단
	if (AIController)
	{
		AIController->StopAI();
	}

	AnimInstance->PlayDeadMontage();
	SetActorEnableCollision(false);

	FTimerHandle RespawnTimerHandle;
	GetWorldTimerManager().SetTimer(RespawnTimerHandle, this, &ARPGEnemy::RespawnTimer, StatComp->GetRespawnTime(), false);
}

타이머를 설정하여 StatComponent에서 설정해놓은 부활 시간만큼의 시간이 지난 후

RespawnTimer 함수를 호출하여 부활 기능을 진행하게 됩니다.

 

void ARPGEnemy::RespawnTimer()
{
	Destroy();
	GetWorld()->SpawnActor(this->GetClass(), &InitialLocation, &InitialRotation);
	UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), RespawnParticle, InitialLocation);
}

RespawnTimer 함수가 호출되면 현재 액터를 파괴하고 SpawnActor 함수를 통해 죽은 몬스터와 똑같은 새로운 몬스터 객체를 생성하게 됩니다. 생성되는 위치는 몬스터의 생성자에서 저장해놓은 몬스터의 초기위치로 부활하게 됩니다.

 

	// 초기 위치 저장
	InitialLocation = GetActorLocation();
	InitialRotation = GetActorRotation();

생성자에서 위와 같은 코드를 통해 몬스터의 최초 위치를 기억하여 리스폰 될 때 사용하게 됩니다.

 

리스폰 기능의 구현 결과

몬스터가 초기 위치에 Respawn 파티클을 생성하며 리스폰하는 모습입니다!

 


연속공격 데미지 증가

	// 연속공격시 데미지 상승 (첫공격시 AttackCnt는 1)
	const float DamageIncrease = 15.0f;
	const float AttackDamage = StatComp->GetAttackDamage() + ((AttackCnt - 1) * DamageIncrease);

연속공격의 횟수를 세기위한 AttackCnt 변수를 이용하여 연속공격 할수록 입히는 데미지가 강해지도록 설정하였습니다.

첫 공격시 AttackCnt가 1인 상태로 데미지가 들어가기 때문에 1을 빼주었습니다.

 

 


맵 적용

캐릭터와 어울리는 환경 에셋을 다운받아 캐릭터를 적용시켰습니다. 랜드 스케이프 툴을 이용해서
게임의 진행 경로에 맞게 지형을 다듬을 예정입니다.

 

새로만든 맵에도 네비를 적용시켜 몬스터가 정상적으로 AI를 이용하여 이동할 수 있게 하였습니다.
전투도 정상적으로 진행되는 모습입니다.

 


다음 포스팅에서는 스탯창 UI를 만들어 보도록 하겠습니다.

 

감사합니다!

저작자표시 (새창열림)

'[게임 개발] 개발 일지 > RPG' 카테고리의 다른 글

18. 스탯 UI 구현하기 - 2  (0) 2023.10.03
17. 스탯 UI 구현하기 - 1  (0) 2023.10.02
15. 피격 파티클 추가, 행동에 사운드 추가  (0) 2023.09.30
14. 파티클과 사운드를 이용한 패링 연출 효과  (0) 2023.09.29
13. 방어 액션과 패링 기능의 구현  (0) 2023.09.27
'[게임 개발] 개발 일지/RPG' 카테고리의 다른 글
  • 18. 스탯 UI 구현하기 - 2
  • 17. 스탯 UI 구현하기 - 1
  • 15. 피격 파티클 추가, 행동에 사운드 추가
  • 14. 파티클과 사운드를 이용한 패링 연출 효과
람팜팜~
람팜팜~
:)
  • 람팜팜~
    RumPumPum
    람팜팜~
  • 전체
    오늘
    어제
    • 전체 (123)
      • 🎵 일상 (2)
      • JAVA (5)
        • 김영한의 자바 입문 (3)
      • JavaScript (12)
      • ---------------------------.. (0)
      • [게임 개발] 포트폴리오 (2)
        • RPG (1)
        • 슈터-플랫포머 (1)
      • [게임 개발] 개발 일지 (28)
        • RPG (25)
        • TopDownProject (3)
      • [게임 개발] 언리얼엔진 공부 (9)
        • 이득우의 언리얼 프로그래밍 Part.1 (6)
        • 이득우의 언리얼 프로그래밍 Part.2 (1)
        • 개인 메모 (2)
      • [게임 개발] 알고리즘 공부 (60)
        • 프로그래머스 (8)
        • 백준 (52)
        • 개인 메모 (0)
      • [게임 개발] CPP 공부 (2)
        • 이것이 C++ 이다 (1)
        • Effective C++ (0)
        • Effective Modern C++ (0)
        • 홍정모 그래픽스 새싹코스 (1)
      • [게임 개발] CS 공부 (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      우선순위 큐
      참조자
      해시
      역참조
      데드락
      dfs
      스레드
      context switching
      투포인터
      프로세스
      그리디
      문자열
      브루트포스
      메모리구조
      누적합
      슬라이딩 윈도우
      dp
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    람팜팜~
    16. 몬스터 리스폰 구현과 맵 적용
    상단으로

    티스토리툴바