Unity/Photon

Photon - VR(XR Toolkit), Voice

๐ŸŸฆ ํฌํ†ค VR, Voice

ํฌํ†ค์„ ์˜ค๋žœ๋งŒ์— ์‚ฌ์šฉํ•˜๋ ค๋‹ˆ ์‚ฌ์šฉ๋ฒ•์„ ์žŠ๊ธฐ๋„ํ•˜๊ณ  ๋ณ€ํ•œ ๊ฒƒ๋“ค๋„ ์žˆ์—ˆ๋‹ค.

XR Toolkit๊ณผ ํ•จ๊ป˜ ํฌํ†ค์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•๊ณผ ์—…๋ฐ์ดํŠธ๋œ ํฌํ†ค ๋ณด์ด์Šค ์‚ฌ์šฉ๋ฒ•(์•ž์„œ ๋ธ”๋กœ๊น…ํ•œ ๋ฐฉ๋ฒ•๊ณผ ๋‹ฌ๋ผ์ง)์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

(Photon ๊ธฐ๋ณธ์„ธํŒ…์„ ๋งˆ์ณค๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์ž‘์„ฑํ•จ)

 

 

- Document

 

๐ŸŸง VR Setting

- XR Origin ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ

 

 

 

- ์บ๋ฆญํ„ฐ๋กœ ์“ธ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ : VRPlayer

- PhotonView ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€

- ์ƒˆ ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€ : VRPlayer

 

 

 

- ๋นˆ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ : Head, LeftHand, RightHand

- Head, LeftHand, RightHand์— PhotonTransformView ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€

- Custom Left Hand Model, Custom Right Hand Model์— PhotonAnimatorView ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€

- Resources ํด๋”๋กœ ํ”„๋ฆฌํŒนํ™”

- VRPlayer ํ•˜์ด์–ด๋ผํ‚ค์—์„œ ์ œ๊ฑฐ

 

- Head : ์บ๋ฆญํ„ฐ ๋จธ๋ฆฌ. XR Origin์˜ ๋ฉ”์ธ์นด๋ฉ”๋ผ์˜ Transform๊ณผ ๋™๊ธฐํ™”์‹œํ‚ฌ ์˜ค๋ธŒ์ ํŠธ.

- LeftHand, RightHand : ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ Transform๊ณผ ๋™๊ธฐํ™”์‹œํ‚ฌ ์˜ค๋ธŒ์ ํŠธ

- ํ•˜์œ„์— ๋ชจ๋ธ์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using UnityEngine.XR;
using UnityEngine.XR.Interaction.Toolkit;

public class VRPlayer : MonoBehaviour
{
    [SerializeField] private PhotonView m_PhotonView;
    [SerializeField] private Transform m_Head;
    [SerializeField] private Transform m_LeftHand;
    [SerializeField] private Transform m_RightHand;

    [SerializeField] private Animator m_LeftHandAnimator;
    [SerializeField] private Animator m_RightHandAnimator;

    private Transform m_Camera;
    private Transform m_LeftHandController;
    private Transform m_RightHandController;


    public void Start()
    {
        if (m_PhotonView.IsMine)
        {
            m_Camera = Camera.main.transform;
            m_LeftHandController = GameManager.instance.m_LeftController.transform;
            m_RightHandController = GameManager.instance.m_RightController.transform;

            m_Head.gameObject.SetActive(false);
        }
    }

    private void Update()
    {
        if (m_PhotonView.IsMine)
        {
            MapPosition(m_Head, m_Camera);
            MapPosition(m_LeftHand, m_LeftHandController);
            MapPosition(m_RightHand, m_RightHandController);

            UpdateHandAnimation(InputDevices.GetDeviceAtXRNode(XRNode.LeftHand), m_LeftHandAnimator);
            UpdateHandAnimation(InputDevices.GetDeviceAtXRNode(XRNode.RightHand), m_RightHandAnimator);
        }
    }

    void UpdateHandAnimation(InputDevice targetDevice, Animator handAnimator)
    {
        if (targetDevice.TryGetFeatureValue(CommonUsages.trigger, out float triggerValue))
        {
            handAnimator.SetFloat("Trigger", triggerValue);
        }
        else
        {
            handAnimator.SetFloat("Trigger", 0);
        }

        if (targetDevice.TryGetFeatureValue(CommonUsages.grip, out float gripValue))
        {
            handAnimator.SetFloat("Grip", gripValue);
        }
        else
        {
            handAnimator.SetFloat("Grip", 0);
        }
    }

    private void MapPosition(Transform target, Transform rigTransform)
    {
        target.position = rigTransform.position;
        target.rotation = rigTransform.rotation;
    }
}

- ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

- Head๋ชจ๋ธ์€ ์นด๋ฉ”๋ผ์— ๋ถ™์œผ๋ฉด ์‹œ์•ผ๊ฐ€ ๊ฐ€๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํ™œ์„ฑ์‹œํ‚จ๋‹ค.

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using UnityEngine.XR.Interaction.Toolkit;

public class GameManager : MonoBehaviourPunCallbacks
{
    public static GameManager instance = null;
    public Transform XROrigin;
    [SerializeField] private Transform[] m_SpawnPoints;
    public XRController m_LeftController;
    public XRController m_RightController;
    private GameObject m_Player;

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
    }

    private void Start()
    {
        Vector3 pos = m_SpawnPoints[PhotonNetwork.CurrentRoom.PlayerCount].position;
        Quaternion rot = m_SpawnPoints[PhotonNetwork.CurrentRoom.PlayerCount].rotation;

        m_Player = PhotonNetwork.Instantiate("VRPlayer", pos, rot, 0);
        XROrigin.transform.position = pos;
        XROrigin.transform.rotation = rot;
    }

    public override void OnLeftRoom()
    {
        base.OnLeftRoom();
        PhotonNetwork.Destroy(m_Player);
    }
}

- ์ƒˆ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ํ›„ ํ•˜์ด์–ด๋ผํ‚ค์— ์ถ”๊ฐ€ : GameManager

- ์ธ์ŠคํŽ™ํ„ฐ ์—ฐ๊ฒฐ

 

- ๋กœ๋น„์”ฌ์—์„œ ๋ฃธ์— ์ž…์žฅํ•˜๊ณ  ๋‚œ ํ›„ ํ•ด๋‹น ์”ฌ์œผ๋กœ ์ด๋™ํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•ด๋†จ๊ธฐ ๋•Œ๋ฌธ์— OnPlayerEnteredRoom ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹Œ Start ๋ฉ”์„œ๋“œ์—์„œ ์บ๋ฆญํ„ฐ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.

- ์ฃผ์˜์  : ์ƒ์„ฑํ•  ์บ๋ฆญํ„ฐ ํ”„๋ฆฌํŒน์— XROrigin์„ ๋„ฃ์œผ๋ฉด ์•ˆ๋œ๋‹ค. XROrigin์€ ์”ฌ์— ํ•˜๋‚˜๋งŒ ์žˆ์–ด์•ผํ•œ๋‹ค.

- ์Šคํฐ ํฌ์ธํŠธ๋Š” ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์›ํ•˜๋Š” ์œ„์น˜๋กœ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ ๋ณ€์ˆ˜์ด๋ฏ€๋กœ ํ•„์ˆ˜๋Š” ์•„๋‹˜

 

 

 

๐ŸŸง Photon Voice Setting

- photon voice ํŒจํ‚ค์ง€ ๋‹ค์šด๋กœ๋“œ

 

 

 

- Window > Photon Unity Networking > Highlight Server Settings

- photon ํ™ˆํŽ˜์ด์ง€์—์„œ voice ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ํ›„ App Id Voice ์ž…๋ ฅ

 

 

 

- ๋นˆ ๊ฒŒ์ž„์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ ํ›„ ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€ : VoiceLogger

 

 

 

- ๋นˆ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ : VoiceManager

- ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€ : PunVoiceClient, Recorder

 

 

 

- VRPlayer ํ”„๋ฆฌํŒน์— ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€ : PhtonVoiceView, Speaker, AudioSource

'Unity > Photon' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

09. Photon - ์‹ค์Šต 1 (7) Room List  (6) 2021.08.25
08. Photon - ์‹ค์Šต 1 (6) Photon Nickname  (0) 2021.08.24
07. Photon - ์‹ค์Šต 1 (5) Photon Voice  (0) 2021.08.23
06. Photon - ์‹ค์Šต 1 (4) Lobby, Custom Property  (0) 2021.08.22
05. Photon - ์‹ค์Šต 1 (3) Score  (1) 2021.08.18