유니티/Vivox

[Unity]Vivox - 4. 3D 위치 음성 채팅 구현

이름?없음 2024. 2. 7. 02:21
반응형

이 글은 Vivox버전 16을 기준으로 작성되었습니다

 

이번글에서는 Vivox를 이용하여 3D 위치 음성 채팅을 구현해 보겠습니다

반응형

저번글에서 알려드렸던 음성채팅과 매우 유사합니다

using System;
using System.Collections;
using System.Threading.Tasks;
using Unity.Services.Authentication;
using Unity.Services.Core;
using Unity.Services.Vivox;
using UnityEngine;

[Serializable]
public class Channel3DSetting
{

    //가청거리
    [SerializeField] private int audibleDistance = 32;

    //작아지기 시작하는 거리
    [SerializeField] private int conversationalDistance = 1;

    //FadeModel에 따른 감쇠 강도
    [SerializeField] private float audioFadeIntensityByDistance = 1.0f;

    //위치에따른 음량 감쇠 모델
    [SerializeField] private AudioFadeModel audioFadeModel = AudioFadeModel.InverseByDistance;

    public Channel3DProperties GetChannel3DProperties()
    {

        return new Channel3DProperties(audibleDistance, conversationalDistance, audioFadeIntensityByDistance, audioFadeModel);

    }

}

public class VivoxController : MonoBehaviour
{

    //채널 3D 설정
    [SerializeField] private Channel3DSetting channel3DSetting;

    //위치가 업데이트되는 주기
    [SerializeField] private float positonUpdateRate = 0.5f;

    public event Action OnLoginEndEvent;

    public static VivoxController Instance { get; private set; }

    private  void Awake()
    {

        DontDestroyOnLoad(gameObject);
        Instance = this;

    }

    private async void Start()
    {

        await UnityServices.InitializeAsync();
        await AuthenticationService.Instance.SignInAnonymouslyAsync();
        await VivoxService.Instance.InitializeAsync();

        await LoginAsync();

        OnLoginEndEvent?.Invoke();

    }

    private async Task LoginAsync()
    {

        LoginOptions options = new LoginOptions();
        options.DisplayName = Guid.NewGuid().ToString();

        await VivoxService.Instance.LoginAsync(options);

    }

    public async void JoinVoiceChannel(string channelName)
    {

        await VivoxService.Instance.JoinGroupChannelAsync(channelName, ChatCapability.AudioOnly);

    }

    public async void Join3DChannel(GameObject speakeObj, string channelName)
    {

        //위치 음성 채널에 접속
        await VivoxService.Instance.JoinPositionalChannelAsync(channelName, ChatCapability.AudioOnly, channel3DSetting.GetChannel3DProperties());

        //위치를 주기적으로 업데이트
        StartCoroutine(Update3DPositionCo(speakeObj, channelName));

    }

    private IEnumerator Update3DPositionCo(GameObject speakeObj, string channelName)
    {

        while (true)
        {

            //위치를 업데이트
            VivoxService.Instance.Set3DPosition(speakeObj, channelName);
            yield return new WaitForSeconds(positonUpdateRate);

        }

    }

}

위치 채널 속성을 생성한 후 PositionalChannel에 접속해 주시고 주기적으로 위치만 업데이트해 주시면 끝납니다

 

이제 테스트를 위해 스크립트를 작성한 후

using UnityEngine;

public class GameSceneController : MonoBehaviour
{

    [SerializeField] private string channelName;

    private void Awake()
    {

        VivoxController.Instance.Join3DChannel(gameObject, channelName);

    }

}

테스트를 해보겠습니다

인스펙터의 플레이어위치를 조정하고 말해보면 빌드본에서 위치에 따라 소리가 다르게 들리는 것을 확인하실 수 있습니다

 

이제 이것을 멀티플레이에 응용하거나 하면 더 몰입감 있는 게임구성이 가능해질 것입니다

Vivox관련글은 이것으로 끝내겠습니다

반응형

'유니티 > Vivox' 카테고리의 다른 글

[Unity]Vivox - 3.음성 채팅 구현  (4) 2024.02.07
[Unity]Vivox - 2.초기화와 로그인  (2) 2024.02.07
[Unity] Vivox - 1. 사용 준비  (0) 2024.02.07