게임 개발

2D 총알이 기체 방향으로 날아가게 만드는 법

XY 평면의 발사 방향을 sin·cos와 Transform으로 계산하고, 발사 뒤 기체를 돌렸을 때 총알이 휘는 문제를 구분합니다.

CodingJoa 수정 2026.09.22 2분 정도 걸립니다
검은 배경에 벡터 내적을 설명하는 다이어그램. 가로로 뻗은 파란 벡터 a와 45도 위로 뻗은 초록 벡터 b가 있고, b에서 a로 내린 점선 아래에 주황색 정사영 화살표가 그려져 있다. 오른쪽에는 a·b = |a||b| cos θ 공식과 4 × 3 × cos 45° = 8.49, '양수 — 같은 방향 성분'이라는 설명이 적혀 있다

기체는 돌아갔는데 총알은 화면 위로만 날아간다면 먼저 발사 코드의 기준 축을 봅니다. Vector3.up은 월드의 위쪽이고 transform.up은 기체가 향하는 로컬 위쪽을 월드 방향으로 표현한 값입니다. 이름은 비슷하지만 기체가 회전하면 결과가 달라집니다.

이 글은 XY 평면의 2D 슈팅 게임을 가정합니다. 스프라이트의 앞부분은 로컬 +Y를 향합니다. +X를 향하게 그린 스프라이트라면 up 대신 right를 써야 합니다.

각도 0도가 어디를 보는지 먼저 정한다

+X축을 0도로 삼으면 각도 θ의 방향은 (cos θ, sin θ)입니다. 단위 원에서 0도는 (1,0), 90도는 (0,1), 180도는 (-1,0)입니다. Unity의 Mathf.Sin, Mathf.Cos에는 라디안을 넣습니다.

float radians = angleDegrees * Mathf.Deg2Rad;
Vector2 direction = new Vector2(Mathf.Cos(radians), Mathf.Sin(radians));

하지만 기체가 이미 Transform으로 회전했다면 각도를 다시 추출할 필요가 없습니다. 발사 순간의 muzzle.up을 저장하면 됩니다.

발사 순간의 방향을 저장한다

다음은 StraightBullet.cs입니다. 물리 이동을 사용하지 않는 시각적 실습이며, 실제 충돌 판정은 별도로 구현해야 합니다.

using UnityEngine;

public sealed class StraightBullet : MonoBehaviour
{
    private Vector3 velocity;

    public void Launch(Vector3 direction, float speed)
    {
        velocity = direction.normalized * Mathf.Max(0f, speed);
    }

    private void Update()
    {
        transform.position += velocity * Time.deltaTime;
    }
}

발사하는 컴포넌트에서는 생성 직후 아래처럼 호출합니다. bulletPrefab은 StraightBullet 컴포넌트, muzzle은 총구 Transform 참조입니다.

StraightBullet bullet = Instantiate(bulletPrefab, muzzle.position, muzzle.rotation);
bullet.Launch(muzzle.up, 10f);

총알을 기체의 자식으로 만들지 않은 점도 중요합니다. 자식이면 기체의 회전·이동·스케일 영향을 계속 받습니다. 또 총알의 Update에서 매번 muzzle.up을 읽으면 발사 후에도 방향이 바뀝니다. 직진탄과 유도탄의 차이는 방향을 언제 갱신하느냐에 있습니다.

부채꼴 발사로 확장하기

for (int shotIndex = -1; shotIndex <= 1; shotIndex++)
{
    Vector3 direction = Quaternion.AngleAxis(shotIndex * 15f, Vector3.forward) * muzzle.up;
    StraightBullet bullet = Instantiate(bulletPrefab, muzzle.position, muzzle.rotation);
    bullet.Launch(direction, 10f);
}

이 예제는 -15도, 0도, +15도 세 방향으로 이동합니다. 총알의 이미지까지 진행 방향을 보게 하려면 각 총알의 회전도 별도로 맞춰야 합니다. 이동 방향을 바꾸는 것과 외형을 돌리는 것은 다른 작업입니다.

검사는 기체를 0도·90도·180도로 돌려 각각 발사한 뒤, 날아가는 도중 기체를 다시 회전하는 순서로 합니다. 이미 발사한 총알이 휘면 방향을 매번 읽는지, 부모가 남아 있는지 확인합니다. 속도 10이면 장애물 없는 상태에서 0.5초 동안 이동 거리가 약 5인지도 함께 봅니다.

참고 API

이 글 공유하기 X Facebook 네이버

이 글은 기술 설명과 참고 자료, 글쓴이의 판단을 담고 있습니다. 예제와 실제 사용 사례의 적용 조건은 본문을 참고해주세요. 도구의 버전·가격·동작은 시간이 지나면 달라질 수 있으니, 따라 하실 때는 공식 문서를 함께 확인해주세요. 자세한 내용은 이용약관에 정리해두었습니다.