FPS 게임에서 재미를 더하기 위해 수류탄의 효과적인 사용은 중요합니다. 예시로 배틀그라운드는 수류탄 투척을 위해 마우스를 누르고 있으면 궤적이 노출되고 궤적에 따라 수류탄이 투척됩니다. 다음 코드는 이 메커니즘을 활용하여 유니티에서 LineRenderer 컴포넌트로 수류탄이 날아가는 궤적을 시각적으로 표시하고, 플레이어가 투척 시 수류탄이 어디로 가는지 미리 예측할 수 있도록 합니다.
주요 기능
- 수류탄 투척: 플레이어가 마우스를 클릭하여 수류탄을 던집니다.
- 실시간 궤적 표시: 마우스 버튼을 누르고 있는 동안 수류탄의 궤적을 실시간으로 화면에 표시합니다.
using UnityEngine;
public class Example : MonoBehaviour
{
[SerializeField] private GameObject grenadePrefab; // 수류탄 프리팹
[SerializeField] private float throwPower; // 수류탄 투척력
private Camera _mainCamera; // 메인 카메라 참조변수
private LineRenderer _lineRenderer; // 라인 렌더러 참조변수
private bool _isShowingTrajectory; // 궤적 표시 상태
// 메인 카메라와 라인 렌더러를 초기화하고, 라인 렌더러를 비활성화
private void Awake()
{
_mainCamera = Camera.main;
_lineRenderer = GetComponent<LineRenderer>();
_lineRenderer.enabled = false;
}
// 마우스 입력을 감지하여 궤적 표시와 수류탄 투척 기능을 제어
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
_isShowingTrajectory = true;
_lineRenderer.enabled = true;
}
if (Input.GetMouseButtonUp(0))
{
Throw();
_isShowingTrajectory = false;
_lineRenderer.enabled = false;
}
if (_isShowingTrajectory)
{
ShowTrajectory();
}
}
// 수류탄을 생성하고 던지는 기능을 담당
private void Throw()
{
// 투척 위치 계산
Vector3 position = transform.position;
Vector3 forward = _mainCamera.transform.forward;
Vector3 startVelocity = throwPower * forward;
Vector3 startPosition = position + forward * 5 + _mainCamera.transform.right / 2;
startPosition.y += 1.5f;
// 수류탄 생성 및 발사
GameObject instantGrenade = Instantiate(grenadePrefab, startPosition, Quaternion.identity);
Rigidbody rigidGrenade = instantGrenade.GetComponent<Rigidbody>();
rigidGrenade.AddForce(startVelocity, ForceMode.Impulse);
// 일정 시간 후 수류탄 제거
Destroy(instantGrenade, 3.0f);
}
// 수류탄의 궤적을 계산하고 라인 렌더러에 표시
private void ShowTrajectory()
{
// 궤적 표시 관련 변수 초기화
int linePoint = 1;
float timePoint = 0.1f;
// 라인 렌더러 점 개수 설정
_lineRenderer.positionCount = Mathf.CeilToInt(linePoint / timePoint) + 1;
// 초기 위치 및 방향 설정
Vector3 forward = _mainCamera.transform.forward;
Vector3 startVelocity = throwPower * forward;
Vector3 startPosition = transform.position + forward * 5 + _mainCamera.transform.right / 2;
startPosition.y += 1.5f;
// 초기 위치 설정
_lineRenderer.SetPosition(0, startPosition);
// 궤적 계산
for (int i = 1; i < _lineRenderer.positionCount; i++)
{
float time = i * timePoint;
// 시간에 따른 궤적 위치 계산
Vector3 point = startPosition + time * startVelocity;
point.y = startPosition.y + startVelocity.y * time + (Physics.gravity.y / 2f * time * time);
// 라인 렌더러에 궤적 위치 설정
_lineRenderer.SetPosition(i, point);
}
}
}