Show Sidebar

PUN용 Photon Voice

시작하기

PUN용 Photon Voice는 PUN 에서 음성과 오디오 기능을 수행할 수 있도록 해주는 애드온입니다. PUN 에 따라 독립적인 Photon Realtime 어플리케이션이 필요 합니다.

PUN용 Photon Voice는 PUN 이 이미있고 설정되어 있는 유니티 프로젝트에서 임포트 되어야 합니다.

"Voice room" 은 Photon Voice 클라이언트에 의해서 생성된 룸을 말 합니다. 이 문서에서 종종 사용되는 용어이며 PUN 클라이언트가 참여한 룸과 혼선을 피하기 위해서 이 용어를 사용 합니다. 반면에 "PUN 룸"은 PUN 클라이언트가 참여한 룸을 말합니다.

PUN 클라이언트의 상태가 "Joined" 일 때 ("PUN room" 에 있는), 클라우드에서 Photon Voice 어플리케이션에 접속 또는 접속해제가 가능 합니다. 이 외에는 사용자들이 Photon Voice 어플리케이션에 명시적으로 작용 할 수가 없습니다. Photon Voice 클라이언트는 자동적으로 연결 작업흐름을 처리 합니다. Photon Voice 클라이언트는 참여한 "PUN 룸" 과 동일한 이름으로 "voice 룸"을 생성하거나 참여할 것 입니다.

Configure

프로젝트에 Photon Voice 를 임포트 하면 "Photon Voice 설정" 섹션이 PhotonServerSettings 의 PUN 설정 바로 밑에 나타나야 합니다. 여기에 Photon Voice 어플리케이션의 AppIdRegion을 선택 할 수 있습니다. 다음 단계를 따라서 유니티 인스펙터의 PhotonServerSettings 를 항상 다시 오픈 할 수 있다는 것을 기억 하세요: "Window" -> "Photon Unity Networking" -> "Highlight Server Settings".

오디오와 음성관련된 고급 설정을 수정하기 위해서는 신 하나의 객체에 PhotonVoiceSettings 스크립트가 붙여져 있어야 합니다. 사용할 수 있는 설정은 아래에 설명 되어 있습니다:

  1. PUN 관련 설정:
    • AutoConnect: PUN 클라이언트가 "PUN 룸" 에 참여했을 때 자동으로 "Voice 룸"에 Photon Voice 클라이언트를 자동으로 참여 하게 함
    • AutoDisconnect: PUN 클라이언트가 접속 해제 되면 자동으로 Photon Voice 클라이언트도 접속 해제 됩니다.
    • AutoTransmit: Photon 클라이언트가 "voice 룸"에 접속하자마자 자동으로 오디오 전송을 시작 합니다.
  2. 마이크와 "로컬" 오디오 녹음 설정은 생성된 모든 "레코더"에 적용 됩니다:
    • SamplingRate: 초당 얼마나 많은 오디오가 측정되는지에 대한 빈도. 일반적으로 필요한 오디오 품질을 정의 합니다. 사용할 수 있는 값: 8, 12, 16, 24 그리고 48 kHz. 디폴트는 24 kHz 입니다.
    • Delay: 전송되는 오디오 스트림 인코드 지연을 1/1000 초로 나타냅니다. (시간에 대한 버퍼 크기). 사용할 수 있는 값은 5, 10, 20, 40, 80 과 120 ms 입니다. 디폴트는 20 ms 입니다.
    • Bitrate: 특정 시간(초)에 대한 처리 되는 데이터의 양 (비트 수)입니다. 일반적으로 이 값은 압축 품질을 정의 합니다. 디폴트 값은 30000 b/s 입니다.
  3. "Remote" 오디오 스트리밍 설정으로 모든 "스피커"인스턴스가 생성될 때 적용 됩니다:
    • PlayDelayMs: 1/1000 초 단위의 플레이백 지연. 수신되는 패킷의 지연 변이를 보정하기 위해서 사용됨.
  4. 음성감지 기능 (생성된 "레코드" 인스턴스 모드에 적용 됩니다):
    • VoiceDetection: 음성 감지 기능 토글.
    • VoiceDetectionThreshold: 음성 감지가 설정 되어있을 경우 전송을 시작 하기 위한 최소한의 시그널 레벨. 0.01 은 디폴트 값으로 권장되는 값 입니다.
  5. 기타:
    • DebugInfo: 정보 레벨 유니티 콘솔의 Photon Voice 디버그 로그기록을 토글 합니다.
    • DebugLostPercent: 손실 프레임 시뮬레이션 비율.

"오디오 소스" 프리팹

PUN용 Photon Voice 는 프리팹에 의하여 "오디오 소스" 객체가 제공된다는 것을 예측 하고 있습니다. 최소 요구되는 프리팹은 두 개의 스크립트 컴포넌트가 동일한 GameObject 에 추가 되어야 합니다:

  • PhotonView
  • PhotonVoiceRecorder

PhotonVoiceRecorder 스크립트를 추가한 후에, AudioClip 컴포넌트와 PhotonVoiceSpeaker 스크립트가 추가된 것을 알 수 있을 것 입니다. 이 두개 컴포넌트는 동일한 룸에 참여한 다른 클라이언트에서 발생되어 수신된 원격 오디오를 재생성 하는데 필수 요소 입니다.

이 프리팹은 런타임시 PUN 을 이용한 룸 참여 이후에 인스터스가 생성되어야만 합니다. 신 객체 인스턴스들은 지원 되지 않습니다. 따라서 신에 PhotonVoiceRecorder 인스턴스들을 가지고 있지 않아야 합니다.

오디오 소스 프리팹은 두 개의 다른 목적으로 사용 됩니다:

  1. "로컬" 사운드를 녹음하고 전송 합니다:
    PhotonVoiceRecorder 가 처리 해 줍니다. 동일한 컴포넌트의 IsTransmitting 을 체크하여 녹음된 오디오의 전송여부를 파악 할 수 있습니다.

  2. 수신된 "원격" 사운드를 재생성하여 플레이 합니다:
    PhotonVoiceSpeaker 가 처리 해 줍니다. IsPlaying 프로퍼티를 체크 하여 원격에서 수신된 오디오가 플레이 되고 있는지 파악 합니다.

이 오디오 소스 프리팹은 두 가지 다른 방식으로 사용 될 수 있습니다:

  1. 음성 채팅:
    PhotonVoiceRecorder 에 오디오 클립이 지정되어 있지 않고 마이크 장치가 감지되면 오디오가 녹음되고 참여한 다른 모든 플레이어에게 전송 될 것 입니다. 여러개의 녹음 장치를 사용하는 경우에 사용되는 장치중의 하나는 PhotonVoiceRecorder.MicrophoneDevice 프로퍼티에 설정되어 있어야 합니다.

  2. 스트리밍 오디오 클립:
    이 옵션은 Photon Voice 전송 테스트를 위해 도입 되었습니다. 하지만 이 옵션은 다른 목적에서 사용 될 수 있습니다. 오디오 클립을 동일한 룸에 참여한 다른 플레이어들에게 브로드 캐스트 하기 위해서는 유니티에서 제공되는 오디오 미디어 파일을 PhotonVoiceRecorder.AudioClip 에 지정해야 할 필요가 있습니다. 이 작업은 Unity 에디터의 인스펙터에서 드래그앤 드롭으로 수행 할 수 있습니다. 매번 오디오 클립을 재 플레이 하고 싶다면 PhotonVoiceRecorder.Looptrue 로 설정했는지 확인 해주세요.

음성 감지

음성 감지는 사전 정의된 시그널 레벨을 초과한 것만이 음성 녹음이 되고 전송되는 선택적인 기능 입니다. 이 뜻은 음성 전송은 말하는 것이 끝났을 때 자동적으로 전송은 잠시 멈추고 다시 말을 시작 할 때 재개 된다는 것입니다. 이렇게 하면 필요없는 잡음이 전송되는 것을 방지하여 대역폭 소비를 감소시키는데 도움을 줄 것 입니다. VoiceDetectionThreshold 의 기본값은 0.01 입니다. 이 값은 음성 감지 보정과 잡음 정도 측정에 대한 실험의 결과로 얻은 일반적인 환경에서 권장되는 값입니다.

음성 캘리브레이션

음성 감지가 켜져 있음에도 불구하고 소리를 녹음할 때 이슈가 여전히 있다면 음성 캘리브레이션이 필요 할 수 도 있습니다. Photon Voice 는 제한된 시간동안에 자동 캘리브레이션 모드를 제공 합니다. 캘리브레이션 모드를 시작하기 위해서는 PhotonVoiceRecorder.VoiceDetectorCalibrate(period) 를 호출 해야 합니다. 디폴트 캘리브레이션 기간은 2000 밀리세컨드이지만 언제라도 변경 할 수 있습니다. 캘리브레이션을 사용함으로써 Photon Voice 는 자동적으로 소리없음과 시끄러움의 기준치를 조정 합니다.

Push-to-Talk

Photon Voice 에서 push-to-talk 기능은 매우 쉽게 구현 할 수 있습니다. 음성 레코딩과 전송을 수동으로 토글 해야 합니다. 마치 마이크를 끄고 켜는 것과 같습니다. push-to-talk 를 시작하기 위해서는 PhotonVoiceRecorder.Transmittrue 로 설정 하면 됩니다. 중지하려면 다시 false 로 되돌리면 됩니다. 사용자 입력으로 프로퍼티를 바인딩 하여 수행 하게 할 수도 있습니다(UI 버튼 또는 키보드 단축키를 통해서).

오디오 그룹

Photon Voice 는 브로드캐스트만 위한 것이 아닙니다. 플레이어들이 동시에 서로에게 방해가 되지 않으면서 다수의 대화를 할 수 있게 해줍니다. Photon 의 "관심 그룹" 기능을 이용한 "오디오 그룹" 을 통해 수행 될 수 있습니다. "Audio Group" 은 숫자로 식별 됩니다(byte). 여러 그룹을 구독 또는 구독 해지 할 수 있습니다. 아무튼 한 번에 하나의 그룹으로 오디오를 전송 할 수 있습니다.

디폴트로 모든 voice 클라이언트들은 그룹 "0" 을 구독 합니다:각 플레이어는 모든 플레이어의 목소리를 듣고 모두에게 이야기 할 수 있습니다. 이 기본 행동을 교체하기를 원한다면 PhotonVoiceNetwork.Client.GlobalAudioGroup 과 같은 이름을 가진 프로퍼티를 이용하여 "Global Audio Group" 을 변경 합니다. 해당 그룹에 등록한 플레이어들만이 전송한 오디오를 들을 수 있을 것 입니다.

다른 한편으로 듣고 싶은 그룹을 하나 이상 선택할 수 있습니다. 그룹 목록을 갱신하기 위해서 다음의 메소드를 사용할 수 있습니다:

PhotonVoiceNetwork.Client.ChangeAudioGroups(byte[] groupsToRemove, byte[] groupsToAdd);

오디오 그룹을 변경할 때 다음 사항들을 고려 해 주어야 합니다:

  • "voice 룸" 에 참여하고 있을 때만 수행 될 수 있습니다.
  • 그룹을 추가하고 싶지 않거나 제거 하고 싶지 않을 경우에는 각각의 파라미터에 null 을 전달 해줍니다.
  • 기존의 모든 그룹을 추가 또는 제거 하려면 빈 배열 (byte[0]) 을 각각의 파라미터에 전달 해줍니다.
  • 디폴트 오디오 그룹 (0)은 구독해지 할 수 없습니다.

오디오 그룹은 Push-to-Talk 와 결합하여 게임에 멋진 효과를 얻을 수 있습니다.

* 유즈케이스 예제 1: 비밀 대화*

몇 단계를 거쳐서 비밀 대화를 추가할 수 있습니다.:

  • n 이 플레이어 수이면 n * (n - 1) 개의 오디오 그룹을 생성하고 플레이어 쌍을 바인드 합니다. 예제:Player1 과 Player 2 는 그룹 "12" 또는 "21"을 구독 할 수 있습니다.
  • 플레이어는 모든 오디오 그룹을 다른 플레이어와 공유 해야 하거나 필요시에 "전화" 기능을 구독 합니다.
  • 플레이어는 GlobalAudioGroup 에 상응하여 공유된 "binary audio group" 번호로 설정하여 한 플레이어와 대화 할 수 있습니다.

유즈케이스 예제 2: 팀 대화

게임에서 팀을 구현 하고 있다면 다음과 같이 "팀 채팅"을 추가 할 수 있습니다:

  • 팀별로 그룹 번호를 지정 합니다.
  • 플레이어는 소속한 팀의 오디오 그룹을 구독 해야 합니다.
  • 동일한 팀의 플레이어들은 GlobalAudioGroup 을 팀의 오디오 그룹 번호로 설정하여 대화 할 수 있습니다.

알려진 이슈들

안드로이드 6.0 권한 승인

일반적으로 안드로이드 플랫폼을 구축 할 때, 대부분의 권한승인은 자동적으로 유니티가 manifest 파일에 추가 해 줄 것 입니다. Photon Voice 에서 필요한 두개의 퍼미션은 다음과 같습니다:

  • android.permission.INTERNET: 유니티의 Player 설정을 통해 자동으로 추가 됨.
  • android.permission.RECORD_AUDIO: 유니티 마이크 API 가 사용될 때 자동으로 추가 됨

안드로이드 Marshmallow 에서는 새롭게 도입된 권한 승인 모델로 문제가 되고 있는 것 같습니다. 생성된 APK 에는 android.permission.RECORD_AUDIO 퍼미션이 누락되어 음성을 녹음 할 수 없을 것 입니다. Android SDK 레벨 23을 타겟팅 할 때 이러한 이슈를 피하려면 최신의 유니티 버전으로 업데이트 해주시기 바랍니다.

 To Document Top