발사체의 개수를 구한다.
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 백터로 선언하고 값을 넣어주었는데 실제로 사용할 때는 당연히 저 부분을 수정해서 저 값을 원하는 데로 사용하면 될 것이다.
'게임프로그래밍 > 실습2' 카테고리의 다른 글
[실습2] MVVM 바인딩을 위한 FieldNotify 생성하기 (0) | 2025.01.11 |
---|---|
[언리얼] 액터배열에서 가장 가까운 순서대로 액터 정렬하기 (0) | 2025.01.08 |
[실습2] 64. GAS 쿨다운 적용하기 (0) | 2025.01.01 |
[실습2] 63. 게임플레이어빌리티시스템 Cost 적용하기 (0) | 2025.01.01 |
[실습2] 62. 일정 범위 안에 있는 액터 배열에 담기 (0) | 2024.12.29 |