XR플밍 - 10. XR 애플리케이션 개발을 위한 VR/AR 프로그래밍 - 개인 프로젝트(VR) VRGunRange 2.1일차 (6/14)

이형원·2025년 6월 14일
0

XR플밍

목록 보기
104/215

들어가기에 앞서
오늘은 개인 일정이 있어서 작업시간이 길지는 않았다.

1. 2.1일차 작업 정리

  • 과녁이 세워져 있을 때에만 점수를 획득할 수 있도록 로직 수정
  • 시작UI에서 버튼에 컨트롤러를 향했을 때에만 상호작용 Ray가 뜨도록 변경
  • 맵 디테일 수정
  • 총기에 발사 쿨타임 반영
  • 크로스헤어(중심점) 기능 테스트 진행 -> 결론적으로 크로스헤어 기능을 제외하기로 결정

2. 문제의 발생과 해결과정

오늘은 작업할 시간 자체가 많이 없었어서 사실 문제가 발생할 만한 작업도 그다지 진행하지 않았다. 다만 한 가지 - 크로스헤이 기능을 추가하려 했다가 결국에는 제외한 이유에 대해서 설명하고자 한다.

2.1 크로스헤어의 정의와 필요성

크로스헤어란, FPS나 TPS 게임 중에서 특히 총을 무기로 사용하는 게임의 경우 이렇게 조준점이 보이게 하는 기능을 말한다. 이러한 조준점이 실제 현실에서 총을 잡을 때에는 존재하지 않지만, 게이머들은 실제로 총을 잡고 게임을 하는 것이 아니며, 또한 캐주얼하게 게임을 즐기기 위해 이런 조준점이 필요하다고 생각한다.

즉 정리하자면 아래와 같은 두 가지 이유로 FPS, TPS에는 크로스헤어가 필요하다고 생각한다.

  1. 직접 총을 잡고 있는 것이 아니므로, 총이 어디를 조준하고 있는지에 대한 기준점이 필요함.
  2. 게이머가 즐기는 '게임'을 만드는 것이기 때문에 이러한 편의성이 필요하다고 생각함.

2.2 VR 게임에서의 크로스헤어 적용 시도와 시행착오

우선은 위와 같은 이유로 VR 사격장 시뮬레이션을 만드는 시점에서 나는 이것이 '게임'이기 때문에 크로스헤어가 필요하다고 생각했다. 실제로 코드도 작성했고, 어느 정도는 의도한 대로 기능하는 것을 확인했다.

코드 작성 내용은 간단하게 아래와 같이 작성했었다.

using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

public class CrossHairImgController : MonoBehaviour
{
    [SerializeField] private XRGrabInteractable m_gunInteractable;
    [SerializeField] private GameObject m_canvas;
    [SerializeField] private GameObject m_image;
    [SerializeField] private Transform m_muzzlePoint;

    void Update()
    {
        if(m_gunInteractable.isSelected)
        {
            m_canvas.SetActive(true);
            m_image.transform.position = RectTransformUtility.WorldToScreenPoint(Camera.main, m_muzzlePoint.position);
        }
        else
        {
            m_canvas.SetActive(false);
        }
    }
}

하지만 문제가 발생했다. 실제로 이대로 실행하면 의도한 대로 총구에 크로스헤어는 따라오는데, 실제로 맞는 위치는 크로스헤어와는 다른 위치로 맞게 된다.

이런 이유가 발생하는 건 MuzzlePoint를 기준으로 했다는 것이 원인일 것이다. 그러면 이 부분을 수정하고, 이 방향으로 총을 쐈을 때 총이 어디에 맞을 지 계산하고 크로스헤어를 표시해야 한다는 소리다. 물론 실제로 이걸 계산하는 것이 아예 불가능하지는 않겠지만, 과녁과의 거리가 달라져도 금방 변하는 수치이고, 이걸 계산하는 복잡한 과정을 넣고서 크로스헤어를 표시하는 게 필요한 것인가 고민에 빠졌다.

이런 문제가 발생한 이유는 FPS 게임과 VR 총 게임의 환경이 다르다는 점에서 이유가 있었다.

FPS의 경우에는 일반적으로 총을 든 순간 총의 위치가 고정되기 때문에 어디로 쏠 지가 고정되어 있다. 따라서 크로스헤어를 반영해도 크로스헤어의 위치를 고정할 수 있다.
하지만 VR의 경우는 직접 총을 잡고 겨누는 상황이기 때문에 이런 크로스헤어를 고정시킬 방법이 없다는 것이 문제점이었다.

이러한 문제점 말고도 다음과 같은 생각도 있었다.
사격장 시뮬레이터면 사실 크로스헤어가 없는 편이 현실성이 더 있다.

즉, 결과적으로 정리하자면 아래와 같은 두 이유로 VR 사격장 시뮬레이터에서 크로스헤어와 관련된 부분을 제외하는 것으로 결론내렸다.

  1. FPS/TPS와 달리 VR은 총을 직접 잡고 겨누는 방식에 가깝기 때문에, 크로스헤어를 반영하는 것 자체가 쉽지 않고 적합하지 않다.
  2. 조금 더 현실성을 따지고 체험형 요소로 생각하면 크로스헤어가 없는 편이 좋을 것이다.

결국엔 해당 코드와 구성요소를 폐기했지만 실제로 시도해보면서 몸소 깨달은 유의미한 시행착오였다고 생각한다.

3. 수정해야 할 점과 과제

3.1 (미해결 버그/이슈) 총을 든 채로 이동할 때 총이 덜덜 떨리는 현상

이 부분에 대한 건 확실히 수정이 필요해 보이지만, 아직 뚜렷한 해결방법이 보이지 않는 상태이다. 좀 더 고민해보자.

3.2 (구현) 내려간 과녁 다시 올리기 - 스테이지 개념 구현

지금은 연습 느낌으로 과녁에 총을 발사하는 부분만 구현했지만, 스테이지 개념을 반영해서 과녁이 랜덤하게 오르락 내리락 하면서 쏘는 방식을 구현해보려고 한다.

3.3 (구현) 게임 종료 구현

사실 VR 게임을 해 본 적이 없어서 게임 종료를 어떻게 구현해야 할 지 잘 모르겠긴 하지만, 플레이어 뒤쪽에 UI를 하나 더 배치해서 게임 종료를 구현할 지 고민중이다.

3.4 (구현/도전) 총을 양손으로 잡았을 때만 총 발사되도록 하기

지금은 총을 한 손으로 잡아도 발사가 되다 보니 왼손으로 겨냥하는 부분이 조금 불필요하게 느껴지고 총 발사 또힌 비현실적으로 느껴진다. 디테일을 위해서 해당 부분을 구현할 수 있을지 알아보자.

3.5 (구현/도전) 총을 잡는 컨트롤러를, 손으로 교체하기

컨트롤러를 손으로 바꿀 수 있는 에셋을 구했다. 이걸 적용시키면 훨씬 더 실감나는 게임을 할 수 있을지도 모른다.

3.6 (도전) 랭킹시스템 구현

최고기록을 기록할 수 있는 랭킹 시스템을 구현해보고자 한다.
다만 최고기록을 저장하는 건 그렇다 쳐도, 키보드를 구현할 수 있을지가 난감하다.

3.7 (도전) 총 장전 시스템 구현

총을 장전하는 시스템을 구현해보고자 한다. 소켓 기능을 쓰는 등의 방식으로 구현해야 한다는 건 알고 있으나, 앞서 해야 할 작업이 많은 관계로 우선순위를 뒤로 미뤘다.

3.8 (버그?) 총알을 연속 발사할 때 총알이 사라지는 버그

해당 이슈는 총기에 발사 쿨타임을 넣은 것으로 해결됨

profile
게임 만들러 코딩 공부중

0개의 댓글