투사체 기초
11강. 투사체 기초
1. 이번 강의에서 해결할 문제
투사체가 목표와 다른 방향으로 날아가거나 위치 차이를 그대로 속도로 사용해 거리에 따라 속도가 바뀝니다. 방향과 속력을 분리하고 예상 도달 시간을 계산합니다.
2. 학습 목표
3. 핵심 개념
Direction은 길이 1인 방향, Speed는 cm/s, Velocity는 방향과 속력을 함께 가진 cm/s 벡터입니다.
Velocity = normalize(Target - Muzzle) × Speed
Time = Distance / Speed
Time은 목표가 움직이지 않고 중력·가속이 없는 단순 모델입니다. 움직이는 목표 예측과 탄도는 후속 수학·AI 심화 주제입니다.
4. 단계별 실습
C++ · 파일 경로: Source/TopDownSurvival/Combat/CombatProjectile.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CombatProjectile.generated.h"
class UProjectileMovementComponent;
class USphereComponent;
UCLASS()
class TOPDOWNSURVIVAL_API ACombatProjectile : public AActor
{
GENERATED_BODY()
public:
ACombatProjectile();
protected:
UPROPERTY(VisibleAnywhere, Category = "Projectile")
TObjectPtr<USphereComponent> CollisionSphere;
UPROPERTY(VisibleAnywhere, Category = "Projectile")
TObjectPtr<UProjectileMovementComponent> Movement;
};
C++ · 파일 경로: Source/TopDownSurvival/Combat/CombatProjectile.cpp
#include "Combat/CombatProjectile.h"
#include "Components/SphereComponent.h"
#include "GameFramework/ProjectileMovementComponent.h"
ACombatProjectile::ACombatProjectile()
{
PrimaryActorTick.bCanEverTick = false;
CollisionSphere = CreateDefaultSubobject<USphereComponent>(TEXT("CollisionSphere"));
CollisionSphere->InitSphereRadius(12.0f);
CollisionSphere->SetCollisionProfileName(TEXT("Projectile"));
SetRootComponent(CollisionSphere);
Movement = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("Movement"));
Movement->InitialSpeed = 900.0f;
Movement->MaxSpeed = 900.0f;
Movement->ProjectileGravityScale = 0.0f;
Movement->bRotationFollowsVelocity = true;
InitialLifeSpan = 5.0f;
}
적 발사 함수
void AMathAIEnemyCharacter::FireProjectile(AActor* Target)
{
if (!ProjectileClass || !IsValid(Target)) return;
const FVector Muzzle = GetActorLocation() + GetActorForwardVector() * 80.0f;
const FVector Direction =
(Target->GetActorLocation() - Muzzle).GetSafeNormal();
if (Direction.IsNearlyZero()) return;
FActorSpawnParameters Params;
Params.Owner = this;
Params.Instigator = this;
Params.SpawnCollisionHandlingOverride =
ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
GetWorld()->SpawnActor<ACombatProjectile>(
ProjectileClass, Muzzle, Direction.Rotation(), Params);
}
Blueprint 작업
BP_CombatProjectile 자식을 만들고 Sphere에 작은 기본 Mesh를 붙입니다. Collision Preset의 Projectile이 없다면 프로젝트 전용 Object Channel을 만들거나 적절한 Custom 설정을 사용합니다.
5. 코드와 수학·AI가 동작하는 이유
정규화로 거리를 제거해 모든 발사체가 같은 InitialSpeed를 사용합니다. Direction.Rotation은 로컬 Forward를 발사 방향으로 돌립니다. ProjectileMovementComponent가 이동과 충돌 Sweep을 처리하므로 사용자 Tick이 필요 없습니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
투사체 기초 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.