개요
- 유니티에서 발사체를 발사하는 기본적인 원리를 넘어서, 고급 발사체 발사 로직을 구현하는 것은 게임의 실감나고 다이나믹한 전투 시스템을 만드는 데 있어 필수적입니다. 이 글에서는 중급 개발자를 위한 조준 및 타겟팅 시스템 구현 방법을 다룹니다. 본 포스팅에서는 유니티의 Physics Raycast, Quaternion, 그리고 벡터 계산을 활용한 예제 코드를 제공하며, 실전에서 활용할 수 있는 팁도 공유합니다.
조준 시스템 구현
- 게임 내에서 정확한 조준은 사용자 경험을 크게 향상시킵니다. 마우스 포인터나 화면 상의 특정 지점을 향해 자동으로 조준하게 만드는 것부터 시작해봅시다.
public class AimSystem : MonoBehaviour
{
public Camera playerCamera;
public Transform gunBarrelEnd;
public LayerMask targetLayerMask;
void Update()
{
Ray ray = playerCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Mathf.Infinity, targetLayerMask))
{
Vector3 targetPoint = hit.point;
Vector3 aimDirection = targetPoint - gunBarrelEnd.position;
Quaternion rotation = Quaternion.LookRotation(aimDirection);
gunBarrelEnd.rotation = Quaternion.Lerp(gunBarrelEnd.rotation, rotation, Time.deltaTime * 10);
}
}
}
- 위 코드는 카메라에서 마우스 포인터의 위치로 레이를 발사하고, 타겟 레이어에 충돌이 감지되면, 그 지점을 향해 총구가 조준하도록 합니다. Quaternion.Lerp 함수를 사용해 부드러운 회전을 구현할 수 있습니다.
타겟팅 시스템 구현
- 플레이어가 자동으로 가장 가까운 적을 타겟팅 할 수 있도록 구현해봅시다. 이는 특히 다수의 적과 싸울 때 유용합니다.
public class TargetingSystem : MonoBehaviour
{
public Transform player;
public float targetingRange = 50.0f;
public LayerMask enemyLayerMask;
Transform FindClosestEnemy()
{
Collider[] hitColliders = Physics.OverlapSphere(player.position, targetingRange, enemyLayerMask);
Transform closestEnemy = null;
float closestDistanceSqr = Mathf.Infinity;
Vector3 currentPosition = player.position;
foreach (Collider hitCollider in hitColliders)
{
Vector3 directionToTarget = hitCollider.transform.position - currentPosition;
float dSqrToTarget = directionToTarget.sqrMagnitude;
if (dSqrToTarget < closestDistanceSqr)
{
closestDistanceSqr = dSqrToTarget;
closestEnemy = hitCollider.transform;
}
}
return closestEnemy;
}
void Update()
{
Transform target = FindClosestEnemy();
if (target != null)
{
Vector3 targetDirection = target.position - player.position;
Quaternion targetRotation = Quaternion.LookRotation(targetDirection);
player.rotation = Quaternion.Lerp(player.rotation, targetRotation, Time.deltaTime * 5);
}
}
}
- Physics.OverlapSphere 함수를 사용하여 플레이어 주변의 적들을 감지하고, 그 중 가장 가까운 적을 타겟팅하는 로직입니다. 이 로직을 활용하면 플레이어가 다수의 적 사이에서 전략적으로 가장 위협적인 대상을 빠르게 식별하고 공격할 수 있습니다.
실전 팁
- 타겟팅 시스템을 구현할 때, 성능 최적화를 고려해야 합니다. 특히 Update 함수 내에서 고비용 연산을 수행하는 것을 피하고, 가능한 경우 이벤트 기반 또는 코루틴을 사용하여 연산을 분산시키는 것이 좋습니다.
- 사용자 인터페이스(UI)를 통해 현재 타겟팅된 적을 시각적으로 표시하는 기능을 추가하면 플레이어의 몰입감과 전략적인 게임 플레이가 향상됩니다.