Bolt & Voice 통합
좋은 게임의 주요 특징 중 하나는 확실히 플레이어 간의 상호 작용이며, 이것은 플레이어들이 서로 문자를 보내고, 캐릭터와 제스처를 취하게 하면서 다양한 방법으로 이루어질 수 있습니다. 그러나 궁극적으로는 게임을 하면서 좋은 대화를 할 수 있기 때문에 훨씬 더 재미있고 유동적인 경험을 할 수 있습니다.
이러한 이유로, 원활한 경험을 만들고 실시간 토론의 모든 편의를 제공하기 위해 Photon Voice가 만들어졌습니다.
Photon Bolt는 게임의 네트워킹 구현으로 사용되도록 되어 있고 모든 플레이어의 동기화를 유지하는 데 초점을 맞추고 있지만, 의도된 텍스트와 음성 스트리밍과 같은 기능이 자연히 부족합니다. 이 튜토리얼에서는 어떻게 Photon Bolt 게임을 Photon Voice와 통합하고 플레이어들이 서로 대화하도록 할 수 있는지 보여줄 것입니다.
Photon Voice 설정
먼저 빈 새 유니티 프로젝트부터 시작하는 것이 좋습니다. Bolt와 Voice를 설정하는 방법에 대한 아이디어를 얻을 수 있습니다.
모든 것이 잘 작동한다는 것을 알게 되면, 이미 존재하는 게임에 설정할 수 있습니다.
Photon Voice SDK를 Bolt 프로젝트에 설정하는 아래의 절차를 따라 하세요:
- Photon Bolt를 아직 임포트 하지 않았다면 다운로드하고 유니티 프로젝트로 임포트 합니다.
- Photon Voice를 에셋 스토어에서 다운로드하고 유니티 프로젝트로 임포트 합니다.
- Photon Bolt 샘플들을 임포트 합니다:
Assets/Photon/PhotonBolt/packages/
로 이동하고bolt_samples.unitypackage
를 임포트 합니다.- 사용할 수 있는 모든 샘플을 포함하거나
Voice
폴더만 선택할 수 있습니다.Voice
샘플이 없다면, 당사의 샘플 공개 저장소인 여기에서 다운로드할 수 있습니다.
- Photon Voice 애플리케이션 ID를 구성합니다:
Assets/samples/Voice/prefabs/BoltVoiceBridge
에 있는 프리팹을 오픈하고,Voice Connection
컴포넌트를 확인합니다.App Settings
섹션에서,App Id Voice
필드를 확인하실 수 있습니다.- Voice App ID를 입력합니다.
Scripting Define Symbols
에서BOLT_VOICE_SAMPLE
플래그를 포함하여 Voice 샘플을 활성화합니다. 이에 관련하여 여기에서 자세히 읽어보세요. 프로젝트에 포함되거나 포함되지 않을 수 있는 Photon Voice의 참조가 필요하므로 기본적으로 비활성화됩니다.
좋습니다. 이제 Voice용의 Bolt 샘플에 필요한 모든 것을 가지고 있습니다.
Voice 샘플 사용하기
Voice 목적의 Bolt의 샘플은 다음의 특징을 보여주고 있습니다.
- 씬에서 플레이어들의 위치를 동기화하여 말을 걸 수 있도록 합니다.
- 플레이어가 근처의 다른 플레이어의 말만 듣도록 오디오 소스를 관리합니다(공간 오디오).;
- 같은 플레이어만 서로 듣고 대화하는 "Voice 영역"을 관리합니다.
SDK에 없다면 당사의 공개 저장소인 여기에서 다운로드하세요.
모든 Bolt 게임에서와 마찬가지로 플레이어에서 사용하는 데이터를 정의하는 상태를 만들어야 합니다.
이 샘플에서 플레이어는 아래와 같은 간단한 상태를 사용할 것입니다:
Transform
: 일반적인Transform
속성으로 플레이어의 위치를 동기화하는데 사용합니다.VoicePlayerID
: 이 속성은 Voice 룸에 연결된 Voice 클라이언트의 고유 ID를 식별합니다. 특정 Voice 스피커를 올바른 플레이어와 매핑하는 데 사용됩니다.
샘플에는 2개의 씬만이 포함되어 있습니다: (i) Voice_Menu
는 서버 또는 클라이언트로 시작할 수 있도록 해 주는 간단한 메뉴씬으로 게임 씬을 자동 로드해주며, (ii) Voice_Meeting
은 실제 게임 씬입니다.
Meeting
씬에서, 3개의 영역이 존재하게 됩니다. 이 영역은 이전에 설명한 "Voice 영역"입니다. 이 영역의 주요 특성은:
you will find three areas, those are the "Voice Areas" we described before. The main characteristics of those areas are: (i) 태그 GameController
, (ii) 트리거 콜라이더를 갖고 있음, 그리고 (iii) 플레이어가 감지되는 그룹을 식별하는 Bolt Voice Area
컴포넌트를 갖고 있습니다.
클라우드 서비스와의 Photon Voice 연결을 관리하는 것은 물론 플레이어가 사용하는 Voice 스피커 참조를 인스턴스화하고 저장하는 역할을 하는 BoltVoiceBridge
클래스가 통합의 또 다른 중요한 부분입니다.
소스 코드를 확인하여 코드의 작동 방식에 대한 자세한 정보를 얻을 수 있습니다. 요약하면 이 클래스는 Photon Voice SDK에 있는 원래 ConnectAndJoin
클래스와 매우 유사하게 동작하지만 플레이어가 자동으로 Voice 룸을 생성/참가하고 다른 플레이어와 오디오 공유를 시작하도록 일부 Bolt 이벤트와 속성을 후크 합니다.
플레이어가 Voice_Meeting
씬에 들어가면 자동으로 Voice 룸에 연결되고 특정 Voice ID를 받게 됩니다.
이 Voice 룸은 Bolt 세션 이름에 _voice
를 추가하여 보이지 않게 만든 이름으로 만들어졌기 때문에 이 이름을 구성할 수 있는 플레이어만 연결할 수 있습니다.
원격 플레이어가 감지되면 BoltVoiceBridge
가 해당 플레이어의 새 스피커를 생성하여 내부 레지스트리에 저장합니다. BoltVoiceBridge.CustomBoltSpeakerFactory
를 참고하세요.
스피커 레지스트리는 Voice 플레이어 ID와 스피커 간의 매핑으로, 특정 참조가 다른 원격 플레이어의 것임을 식별하는 데 사용됩니다.
각 플레이어가 Bolt 게임 세션에 들어가고 Voice 룸에 연결되면 Bolt 플레이어 상태에서 자신의 Voice 플레이어 ID를 업데이트하기 시작합니다.
샘플에서 플레이어는 BoltVoicePlayerController
클래스에 의해 제어되며, Bolt에 대해 이미 알고 있다면 이것이 매우 간단한 컨트롤러 구현임을 알 수 있습니다.
각 플레이어는 로컬 엔터티 플레이어의 소유자이므로 상태를 적절하게 수정할 수 있습니다.
올바른 스피커와 올바른 플레이어를 부모로 삼기 위해 VoicePlayerID
를 사용합니다. 앞서 말씀드린 ID는 해당 플레이어의 ID를 모든 피어에 공유하며, 이 정보를 바탕으로 BoltVoiceBridge
가 만든 레지스트리에서 스피커 참조를 수집합니다.
이는 BoltVoicePlayerController.SetupSpeaker
메소드의 플레이어 컨트롤러 클래스에서 나타날 수 있습니다.
Voice 그룹은 플레이어가 들어가고 나가는 위치, 특히 플레이어가 있는 위치를 기반으로 관리됩니다.
플레이어 컨트롤러의 트리거 콜백에 가입했으므로 씬에서 "Voice 영역" 중 하나를 검색하면 BoltVoiceArea
컴포넌트에서 그룹 ID를 가져와 'BoltVoiceBridge'로 보내므로 관심 그룹
(여기 및 여기에서 상세 정보 참고)이 변경될 수 있습니다.
통합에 사용되는 Speaker 프리팹을 수정하려면 Assets/samples/Voice/Prefabs/BoltSpatialSpeaker
의 설정을 변경하면 됩니다.
기본적으로 주변 플레이어만 서로의 소리를 들을 수 있도록 3D 사운드로 구성되어 있지만 필요한 경우 쉽게 변경할 수 있습니다.
좋습니다. 이제 이 샘플의 모든 움직이는 부분에 대해 더 잘 알 수 있을 것입니다.
두 씬을 모두 빌드 설정
에 포함시키고 게임의 standalone 실행 파일로 빌드 하세요.
각각의 애플리케이션 ID로 Bolt와 Voice를 모두 올바르게 설정했다면 Bolt 서버와 세션을 만들고 클라이언트로 들어갈 수 있습니다.
두 사람이 게임에 참여하게 되면 음성 클라이언트로도 연결되고 서로의 목소리를 들을 수 있습니다.
"Voice 영역"을 입력하려고 하면 같은 영역에 있는 플레이어만 해당 영역 내의 다른 플레이어로부터 오디오를 수신합니다.
"외부" 영역도 그룹으로 취급되기 때문에 "Voice 영역" 안에 없는 다른 플레이어를 누구나 들을 수 있습니다.