유니티에서 총알을 구현하는 것은 게임의 핵심적인 요소 중 하나입니다. 이번 설명에서는 총알이 발사되어 움직이고, 특정 물체에 부딪히면 사라지는 기본적인 로직을 담은 스크립트를 중심으로 이해하기 쉽게 설명해 드리겠습니다.
1. 총알 스크립트의 구성 요소
총알의 움직임과 충돌 처리를 담당하는 BulletController.cs
스크립트를 만들어 보겠습니다. 이 스크립트는 크게 세 가지 역할을 수행합니다.
- 총알의 속성 정의: 총알의 속도, 데미지, 그리고 수명 등을 결정합니다.
- 총알의 움직임: 발사된 총알이 앞으로 계속 나아가도록 만듭니다.
- 총알의 충돌 처리: 다른 물체와 부딪혔을 때 어떤 일이 일어나는지 정의합니다.
2. 스크립트 코드 분석
아래는 총알의 기능을 구현한 C# 스크립트입니다. 각 부분을 상세히 설명해 드릴게요.
C#
using UnityEngine;
public class BulletController : MonoBehaviour
{
// 총알의 속도, 유니티 인스펙터 창에서 조절 가능
public float bulletSpeed = 10f;
// 총알이 자동으로 사라지기까지의 시간
public float lifetime = 3f;
// Start() 메서드보다 먼저 호출됨.
void Awake()
{
// 일정 시간이 지나면 총알 오브젝트를 파괴.
// 메모리 관리를 위해 총알이 너무 오래 남아있지 않게 함.
Destroy(gameObject, lifetime);
}
// 매 프레임마다 호출됨.
void Update()
{
// 총알을 앞으로 이동시키는 코드.
// transform.forward는 오브젝트가 바라보는 방향.
// Time.deltaTime을 곱해 프레임 속도에 관계없이 일정한 속도로 이동시킴.
transform.Translate(Vector3.forward * bulletSpeed * Time.deltaTime);
}
// 다른 오브젝트와 충돌했을 때 호출됨.
void OnCollisionEnter(Collision collision)
{
// 충돌한 오브젝트의 태그를 확인
if (collision.gameObject.CompareTag("Enemy"))
{
// 여기에 적에게 데미지를 주는 로직을 추가할 수 있음
// 예: EnemyHealth enemyHealth = collision.gameObject.GetComponent<EnemyHealth>();
// if (enemyHealth != null)
// {
// enemyHealth.TakeDamage(bulletDamage);
// }
}
// 충돌 후 총알 오브젝트 파괴
Destroy(gameObject);
}
}
public float bulletSpeed = 10f;
:public
으로 선언된 변수는 유니티 인스펙터(Inspector) 창에서 직접 값을 수정할 수 있습니다.bulletSpeed
는 총알이 움직이는 속도를 결정합니다.Destroy(gameObject, lifetime);
:Awake()
메서드에서 이 코드를 사용하면, 총알이 생성된 후lifetime
변수에 지정된 시간(예: 3초)이 지나면 자동으로 화면에서 사라집니다. 이는 총알이 벽에 부딪히지 않고 무한정 날아가서 게임 성능에 영향을 주는 것을 방지하는 중요한 역할입니다.transform.Translate(Vector3.forward * bulletSpeed * Time.deltaTime);
:Update()
메서드는 매 프레임마다 실행됩니다. 이 코드는 총알 오브젝트를 **자신이 바라보는 앞 방향(Vector3.forward
)**으로bulletSpeed
만큼 이동시킵니다. 여기서 **Time.deltaTime
**은 필수적인 요소인데, 컴퓨터의 성능에 따라 프레임 속도가 달라져도 총알의 이동 속도가 일정하게 유지되도록 보정해 줍니다.void OnCollisionEnter(Collision collision)
: 이 메서드는 총알에 부착된 콜라이더(Collider)가 다른 물체의 콜라이더와 부딪혔을 때 자동으로 호출됩니다.if (collision.gameObject.CompareTag("Enemy"))
: 충돌이 발생하면,collision
이라는 변수에 부딪힌 오브젝트의 정보가 담겨있습니다. 이 정보를 이용해 부딪힌 오브젝트의 태그가 “Enemy”인지 확인하는 로직입니다. 이처럼 태그를 활용하면 총알이 어떤 물체와 부딪혔는지 정확하게 구분할 수 있습니다.Destroy(gameObject);
: 충돌 처리가 끝나면 총알 오브젝트를 즉시 파괴합니다. 총알이 여러 번 충돌하지 않도록 충돌 후 바로 제거해 주는 것이 중요합니다.
3. 유니티 에디터에서의 설정
이 스크립트를 완벽하게 작동시키기 위해서는 유니티 에디터에서 몇 가지 설정을 해주어야 합니다.
- 총알 프리팹 생성: 원통(Cylinder)이나 구(Sphere) 오브젝트를 만들고,
BulletController.cs
스크립트를 추가한 후 프리팹으로 만듭니다. - 콜라이더(Collider)와 리지드바디(Rigidbody) 추가: 충돌을 감지하기 위해 총알 오브젝트에 콜라이더 컴포넌트를 추가합니다. 또한,
OnCollisionEnter
메서드가 정상적으로 작동하려면 반드시 리지드바디 컴포넌트도 추가해야 합니다. - 태그 설정: 총알과 충돌해야 할 적 오브젝트에 미리 “Enemy” 태그를 지정해 줍니다.
- 스크립트 변수 설정: 총알 프리팹을 선택하고, 인스펙터 창에서
BulletController
스크립트의BulletSpeed
와Lifetime
값을 원하는 대로 조절해 줍니다.
4. 총알 발사 로직 (참고)
총알을 실제로 발사하는 코드는 보통 플레이어 캐릭터나 무기 스크립트에서 작성합니다. 이 스크립트에서는 Instantiate()
함수를 사용하여 미리 만들어둔 총알 프리팹을 게임 월드에 생성합니다.
C#
public GameObject bulletPrefab; // 유니티 에디터에서 총알 프리팹을 드래그하여 연결
public Transform firePoint; // 총알이 발사될 위치
void Shoot()
{
// firePoint 위치와 방향으로 총알 생성
Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
}
위와 같은 과정을 통해 총알이 생성되고, BulletController
스크립트가 총알의 움직임과 충돌을 독립적으로 처리하게 됩니다. 이 구조는 게임의 성능을 효율적으로 관리하는 데 큰 도움이 됩니다.