본문 바로가기
VR/VVP(VR vs PC) | DAVIGO 카피

플레이어가 VR인지 PC인지 구분하기

by TODAYCODE 2021. 6. 1.
반응형

DAVIGO 게임이 출시되지 않아 직접 플레이 해 볼 수가 없어서 온전히 카피할 수가 없었다.

그러다보니 개발을 진행하는 과정에서 몇가지 변경점이 있었다.

 

원작인 DAVIGO는 보스몹의 역할을 수행하는 VR 1인과

하나의 팀을 이룬 다수의 pc 유저들 간의 결투게임인데

 

나는 게임에 접속할 경우 VR이든 PC이든 로비로 들어오게 되고,

여기서 결투나 경쟁, 협력 등의 다양한 게임모드를 선택해서 방을 생성하면,

접속한 사람들끼리 해당 게임모드를 플레이하게 만들고자 했다.

 

 

그래서 VR과 PC가 만나서 교류할 수 있는 게임시스템을 기본으로 삼아서,

다양한 모드의 게임을 만드는 쪽으로 변경했다.

그 모드 중에 하나가 DAVIGO 인 것이고.

 

원작게임보다 더 복잡해진 상황... 뭐.. 실현가능할지는 모르겠지만 일단 도전해보기로 했다.

 

 

아무튼 이런식으로 개발을 진행할 경우,

접속한 플레이어가 PC유저인지 VR 유저인지에 따라서 역할을 분배해야한다.

 

물론, 발매할 때 VR로 구매한 사람한테는 VR버전을

PC로 구매한 사람한테는 PC버전을 배포하면 되겠다만,

 

그냥 하나의 프로그램으로 실행하더라도

자동으로 PC상태인지 VR상태인지를 판단하고 싶었다.

 

고민을 많이 했고 몇가지 해결방법을 찾았다.

정답은 마지막해결방법이었다.

 


1. 플레이어에게 입력을 받기.

 

아주 원초적이고 단순한 방식이었다.

 

게임이 실행되면 첫번째 씬에서,

본인이 VR인지 PC인지 클릭하도록 만드는 방식이었다.

그럼 여기서 입력받은 내용을 토대로 다음 씬 부터 PC 역할과 VR 역할을 나눠주면 된다.

 

여기서 한가지 문제점은,

PC로 접속한 사람이 VR이라고 클릭하거나

VR로 접속한 사람이 PC라고 클릭할 경우인데,

 

이 경우에는 PC와 VR이 유니티상의 버튼을 누르는 방식 차이점으로 해결하려고 했다.

 

마우스 클릭으로는 PC버튼만 누를 수 있고,

VR 버튼은 VR 컨트롤러로만 선택할 수 있게 말이다.

 

그럼 PC는 PC라는 선택지만 클릭 할 수 있게되고

VR은 VR이라는 선택지만 클릭할 수 있게 되므로

잘못된 선택을 막아버릴 수가 있다.

 

그러나 vr인지 pc인지를 구분하기 위해서

씬을 하나 소비해야한다는 점에서

큰 단점이었다.

그래서 다른 방법을 고민하게 된다.

 

 

2. 코드

 

유니티 상에서 VR 환경설정을 해둔 상태로

VR이 아닌 PC로 플레이를 하게 되면 다음과 같은 오류창이 발생한다.

VR한다고 해놓고 왜 VR을 사용하지 않았냐? 라는 것인데

이는 VR을 인식하는 코드가 들어있다는 뜻이다.

 

따라서 이걸 활용하면 된다고 생각해서 이것저것 해보려했는데 실패했다.

OculusLoader.cs에 있는 코드들을 사용해보려했는데 스크립트 수정 자체가 불가능했다.

그러다보니 public으로 바꿀 수 없어서 다른 스크립트에서 가져와서 쓸 수가 없었고,

아니면 아예 상속을 받아서 사용해볼까 했는데 불필요한 기능까지 가져오게 되므로 그럴 수 없었다.

OVRManager 스크립트를 찾아보지는 않았다.

왜냐하면 찾다보니까 유니티 사이트에 스크립트가 공유되어 있었다.. 허무..

 

 

Unity - Scripting API: XR.XRDevice.isPresent

You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see: You've told us there are code samples on this page which don't work. If you know ho

docs.unity3d.com

여기 들어가면 현재 XRdevice가 연결되어있는지를

확인하는 코드가 구현되어있다.

 

여기에 쓰여있는 코드들을 그대로 가져와서 사용해도 된다.

 

나는 약간 변형시켰다.


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;

public class GameManager : MonoBehaviour
{
    public static GameManager instance;

    public bool isVR;

    public static bool isPresent()
    {
        var xrDisplaySubsystems = new List<XRDisplaySubsystem>();
        SubsystemManager.GetInstances<XRDisplaySubsystem>(xrDisplaySubsystems);
        foreach (var xrDisplay in xrDisplaySubsystems)
        {
            if (xrDisplay.running)
            {
                return true;
            }
        }
        return false;
    }
    private void Awake()
    {
        if (instance == null)
            instance = this;

        Debug.Log("VR Device = " + isPresent().ToString());
        isVR = isPresent();
    }

GameManager 스크립트를 생성하고 싱글톤으로 만들어줬다.

그리고 위 사이트에 적혀있는 IsPresent()함수를 적고,

실행하자마자 VR인지 PC인지 구분하게 했고,

bool형으로 isVR이라는 변수를 만들어서 isPresent()함수의 결과값을 담아두게 만들었다.

 

이후에 여러사람이 접속했을 때 Photon을 통해서 상대방의 isVR값을 받아와서

PC인지 VR인지에 따라서 적절한 캐릭터 모델을 구현하기 위해서이다.

 

 

아무튼 현재 테스트 해본 결과

여러대의 기기에서 VR과 PC를 바꿔가며 다양하게 접속해봤더니

전부 알맞게 기기에 적합한 캐릭터모델을 생성하여 로비에서 만날 수 있게 되었다.

 

 

이 부분에서 은근히 시간이 많이 소모되었는데

해결을 해서 다행이다.

반응형

'VR > VVP(VR vs PC) | DAVIGO 카피' 카테고리의 다른 글

VR게임 제작1 : DAVIGO - VR vs PC  (0) 2021.05.30

댓글