반응형
이 글은 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 |