본문 바로가기

게임프로그래밍/실습2

[실습2] 발사체 스프레드 코드

발사체의 개수를 구한다.

 

	const int32 NumProjectile = FMath::Min(MaxNumProjectiles, GetAbilityLevel());

 

전방 백터를 구하고 이를 스프레드 할 각도/2 만큼 회전시켜 준다.

 

const FVector Forward = Rotation.Vector();
const FVector LeftOfSpread = Forward.RotateAngleAxis(-ProjectileSpread / 2.f, FVector::UpVector);

 

이제 이 왼쪽 스프레드에 발사체가 다 들어갈 만큼 조금씩 오른쪽으로 회전시켜 주면 될 것이다. 그 각도 먼저 구하자.

 

각도를 구하기 전 발사체의 갯수가 2개 이상인지 확인한다.
if (NumProjectile > 1)
const float DeltaSpread = ProjectileSpread / (NumProjectile - 1);

 

스프레드를 할 때 위와 같이 스프레드 하기 때문에 발사체의 개수가 1개이면 치명적인 에러가 발생할 것이다.

여기서 DeltaSpread와 ProjectileSpread는 각도이다.

 

위와 같이 하는 이유는 90도를 기준으로 2개의 발사체가 있다고 한대 하나는 왼쪽 45도에 나머지 하나는 오른쪽 끝 45도에 있어야 90도의 각도 사이에 발사체가 2개 존재한다는 것이고 이는 90도의 각도만큼 오른쪽으로 돌아야 할것이다.

 

이제 for문을 통해 이 각도만큼 계속 회전시키면 된다.

 

for (int32 i = 0; i < NumProjectile; i++)
{
    const FVector Direction = LeftOfSpread.RotateAngleAxis(DeltaSpread * i, FVector::UpVector);
}

 

왼쪽 스프레드에서 오른쪽으로 앵글을 돌려주면 된다. 여기서 UpVector를 기준으로 양수만큼 늘어나면 오른쪽(X) 방향인 것이고 음수는 왼쪽(-X) 방향일 것이다.

 

 

전체코드는 아래와 같다.

const int32 NumProjectile = FMath::Min(MaxNumProjectiles, GetAbilityLevel());
const FVector Forward = Rotation.Vector();
const FVector LeftOfSpread = Forward.RotateAngleAxis(-ProjectileSpread / 2.f, FVector::UpVector);

if (NumProjectile > 1)
{
    const float DeltaSpread = ProjectileSpread / (NumProjectile - 1);

    for (int32 i = 0; i < NumProjectile; i++)
    {
       const FVector Direction = LeftOfSpread.RotateAngleAxis(DeltaSpread * i, FVector::UpVector);
    }
}
else
{
    const FVector Direction = Forward;
}

 

Direction을 const 백터로 선언하고 값을 넣어주었는데 실제로 사용할 때는 당연히 저 부분을 수정해서 저 값을 원하는 데로 사용하면 될 것이다.