Unreal Team Project - 3주차 진행상황

윤정민·2022년 8월 29일
0

셈틀

목록 보기
4/4

1. Collision

(1) What is Collision in UE4

  • Collision : 물리적 충돌이나 레이 캐스팅을 실시간으로 처리하는 기능
  • Collision 반응
    • 무시(ignore)
    • 겹침(Overlap)
    • 블록(Block)
  • 기능
    • Query : 충돌이 겹치는지에 대한 처리
    • Physics : 물리적 반응 (RigidBody)

(2) Collision Filtering : Channel

  • channel : 각 object나 trace에 따라 다른 collision 반응을 나타낼때 사용

1) 채널 종류

  • object channel : object에 대한 채널
  • trace channel : trace에 대한 채널

2) 채널 관리(Preset)

  • 다른 채널간의 collision 반응을 설정할 수 있음

2. 구현 내용

(1) Projectile과 Enemy의 충돌

  • Enemy.h

	UPROPERTY(EditAnyWhere, BlueprintReadOnly)
		float Health = 100.0f;
	UPROPERTY(EditAnywhere)
		float DamageValue = 5.0f;
public:
	void DealDamage(float DamageAmount);
  • Enemy.cpp

DealDamage
	Health -= DamageAmount;

	if (Health <= 0.0f)
	{
		Destroy();
	}
  • Projectile.h

    • OnHit 함수는 Collision이 발동될때 발생하며 충돌한 Actor의 정보를 인자로 가져온다.
	UFUNCTION()
		void OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor,
			UPrimitiveComponent* OtherComp, int32 OtherBodyIndex,
			bool bFromSweep, const FHitResult& Hit);

    UPROPERTY(EditAnywhere)
		float DamageValue = 20.0f;
  • Projectile.cpp

BeginPlay
CollisionSphere->OnComponentBeginOverlap.AddDynamic(this, &AProjectile::OnHit);
OnHit
	AEnemy* Enemy = Cast<AEnemy>(OtherActor);
	if (Enemy)
	{
		Enemy->DealDamage(DamageValue);
		Destroy();
	}

(2) Enemy와 PlayerCharacter의 충돌

  • MonsterShooterCharacter.h

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
		float Health = 100.0f;

public:
	void DealDamage(float DamageAmount);
  • MonsterShooterCharacter.cpp

DealDamage
	Health -= DamageAmount;

	if (Health <= 0.0f)
	{
		//restart game
		AMonsterShooterGameMode* MyGameMode =
			Cast<AMonsterShooterGameMode>(UGameplayStatics::GetGameMode(GetWorld()));
		if (MyGameMode)
		{
			MyGameMode->RestartGameplay(false);
		}

		Destroy();
	}
  • Enemy.h

UFUNCTION()
		void OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor,
			UPrimitiveComponent* OtherComp, int32 OtherBodyIndex,
			bool bFromSweep, const FHitResult& Hit);
            
UPROPERTY(EditAnywhere)
	class UBoxComponent* DamageCollision;
  • Enemy.cpp

BeginPlay
DamageCollision->OnComponentBeginOverlap.AddDynamic(
this, &AEnemy::OnHit);
OnHit
AMonster_ShooterCharacter* Char =
Cast<AMonster_ShooterCharacter>(OtherActor);

if (Char)
{
	Char->DealDamage(DamageValue);
}

(3) PlayerCharacter와 Door의 충돌

  • Door.h

UPROPERTY(EditAnywhere)
		class UStaticMeshComponent* DoorMesh;

	UPROPERTY(EditAnywhere)
		class UBoxComponent* CollisionComponent;
        
// 충돌 발생 시 발동될 함수
	UFUNCTION()
		void OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& Hit);

};
  • Door.cpp

생성자
	DoorMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Door Mesh"));
	RootComponent = DoorMesh;

	CollisionComponent = CreateDefaultSubobject<UBoxComponent>(TEXT("Collision Component"));
	CollisionComponent->SetupAttachment(DoorMesh);
BeginPlay
CollisionComponent->OnComponentBeginOverlap.AddDynamic(this, &ADoor::OnHit);
OnHit
void ADoor::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp,int32 OtherBodyIndex, bool bFromSweep, const FHitResult& Hit)
{
	AMonsterShooterCharacter* Char = Cast<AMonsterShooterCharacter>(OtherActor);

	if (Char)
	{
		AMonsterShooterGameMode* MyGameMode =
			Cast<AMonsterShooterGameMode>(UGameplayStatics::GetGameMode(GetWorld()));

		if (MyGameMode)
		{
			MyGameMode->RestartGameplay(true);
		}
	}
}

2. UI(User Interface)

(1) UMG(Unreal Montion Graph)

: 게임내 HUD, 메뉴, 기타 인터페이스 관련 그래픽요소로 사용자에게 보여주고싶은 것들을 만드는 데 사용할 수 있는 비주얼 UI 제작 툴

  • 대표적으로 Widget
    : 미리 만들어진(button, check box, slider, bar등)함수 시리즈로, 이들을 조립해 UI를 제작할 수 있음
  • Widget은 전용 Widget Blueprint에서 편집됨
    • Designer 탭 : 인터페이스의 시각적인 레이아웃과 기본적인 함수
    • Graph 탭 : 사용된 위젝 내부의 함수 기능이 제공

(2) Main UI

1) Widget 설정

  • 왼쪽 하단에 player Health를 Text로 만들어준다.
  • 왼쪽 하단에 progress bar를 사용해 health percent를 시각적으로 보여준다.
  • 상단에 탈출을 위한 남은 시간을 보여준다.

2) UI Blueprint Graph

이벤트 그래프

  • MonsterShooterCharacter와 MonsterShooter_GameMode에 관한 레퍼런스를 가져온다.

Display Time Countdown

  • Display Time Countdown 함수를 생성한다.
  • 만들어 둔 GameMode의 Timer Count값을 가져온다.
  • "Timer : " 와 Time Count를 Append한다.
  • 이를 string으로 변환하여 출력하도록 한다.

  • 아까 만들어둔 TimerText의 Text값을 Display Time Countdown로 설정해준다.

Display Player Health 함수

  • Display Player Health 함수를 생성한다.

  • Monster Shooter Character의 Health 값을 가져온다.

  • 이를 100으로 나누어 백분율로 표현한다.

  • 이를 return 값으로 설정한다. (이때 dangling방지를 위해 유효성을 검사한다.)

  • health progress bar의 진행상태(percent)를 만들어준 Display Player Health 함수로 설정한다.

3) Display in GameMode

  • 만들어준 UI를 BP_MonsterShooterGameMode에 widget을 생성해 viewport에 보여주도록 한다.

(3) Enemy UI

  • BP_EnemyHealth의 이름을 가진 UI를 만들어준다.

1) Enemy Health Widget

  • progress 로 health bar 만들기

2) Enemy

  • 만들어둔 Health UI를 BP_Enemy에 추가해준다.

3) Enemy Health Widget

  • BP_Enemy에서 만들어둔 Enemy Health UI 레퍼런스에서 progress를 들고와 Percent를 Set할 타깃으로 한다.

  • Enemy의 Health를 100으로 나누어 백분율로 나타내 percent값으로 지정한다.

profile
그냥 하자

0개의 댓글