3D 오디오 추가

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

3D 오디오 는 3D 공간에서 특정 위치에서 방출되는 방향성 음향으로, 오디오 방송자와 수신자 사이의 거리와 방향에 따라 볼륨이 증가하거나 감소합니다.즉, 수신기나 송신기가 환경을 이동하면 플레이어가 동적으로 다른 방향과 볼륨 수준의 오디오를 들을 수 있습니다.

진저브레드 하우스 - 시작 파일을 시작 장소로 사용하고 진저브레드 하우스 - 오디오 완료 를 참조로 사용하여 루프 및 일회성 3D 오디오를 경험에 추가하는 방법을 이 자습서에서 보여줍니다. 포함 지침:

  • 플레이어가 서버에 연결되자마자 재생되는 환경 소리를 루프화합니다.
  • 플레이어에게 게임 플레이중요한 키 상황 이벤트에 대해 알리기 위해 오디오를 트리거합니다.
  • 3D 개체와 상호작용할 때 플레이어에게 청각 피드백을 제공하기 위해 오디오 활성화.
  • 플레이어가 환경 내의 관심 지점으로 이동하도록 하는 캐릭터 사운드 비트를 재생하는 중.

어느 시점에서든 프로세스에 갇히면 생강 집 - 완전 오디오 를 사용하여 진행 상황을 비교할 수 있습니다.

오디오 개체

방향 오디오를 생성하려면 이 자습서 내내 작업할 오디오 개체를 이해하는 것이 중요합니다.오디오 개체의 주요 유형은 6가지입니다:

  • AudioPlayer 개체가 로드되고 오디오 파일 을 재생합니다.
  • AudioEmitter 개체는 3D 환경에 오디오를 방송하는 가상 스피커 이다.
  • 개체는 3D 환경에서 오디오를 수집하는 가상 마이크입니다.
  • 개체는 스피커나 헤드폰과 같은 실제 세계 내의 물리적 하드웨어 장치입니다.
  • 개체는 실제 세계 내의 물리적 마이크입니다.
  • Wires 한 개체에서 다른 개체로 오디오 스트림을 전송합니다.

이러한 모든 오디오 개체는 실제 세계의 동료와 마찬가지로 소리를 방출하기 위해 함께 작동합니다.플레이어가 헤드셋을 착용하고 경험을 플레이하는 예제를 사용하여 실제로 이것이 어떻게 작동하는지 살펴보겠습니다:

  • The AudioPlayer 는 비오는 트랙에 대한 경험에 오디오 자산ID 1516791621 를 로드합니다.
  • The AudioEmitter 는 비 트랙 오디오의 스트림을 3D 환경으로 방출합니다.
  • A Wire 는 스트림을 3D 스피커에서 나오도록 하기 위해 AudioPlayer 에서 AudioEmitter 로 전달하고
  • 캐릭터의 자식 AudioListener 개체가 3D 환경 내에서 그 소리를 듣고 헤드셋에 다시 전달합니다.
  • 개체는 소리를 플레이어의 물리적 스피커나 이 경우 헤드폰으로 전달합니다.
  • 개체는 실제 세계의 소리를 캡처하고 경험으로 되돌려 음성 채팅에 사용합니다.
경험 내 개체 표현
실제 세계의 개체 표현

다음 섹션에서는 더 깊이 살펴보고 루프와 일회성 3D 오디오를 재생하는 방법을 배우면서 이러한 개체를 참조합니다.이러한 개체를 최신 기술로 검토할 때, 플레이어에게 경험의 소리를 캡처하고 피드하는 방법을 보다 정확하게 예측할 수 있습니다.

오디오 루프화

3D 오디오 루프 , 또는 플레이어가 서버에 연결되자마자 원활하게 반복되는 방향 오디오는 3D 공간의 분위기를 향상시키기 위해 살아 있고 동적으로 느껴지도록 만들어 주는 일반적인 사운드 디자인 기술입니다.또한, 3D 오디오를 루프하면 텔레비전의 정적이나 폭포의 웅웅거리는 소리와 같이 환경 사운드 소스가 일관되게 유지됩니다; 이 소리가 갑자기 중단되면 환경이 비현실적으로 느껴집니다.

이 개념을 보여주기 위해, 다음 3D 오디오가 루프가 해제된 오디오 트랙이 완료되는 즉시 중지되는 방법을 검토하십시오.물이 플레이어를 처음에 야외 환경으로 몰입시킨다고 해도 갑작스러운 청각적 변화는 실제 세계에서 폭포가 행동하는 방식과 어울리지 않습니다.

마찬가지로, 샘플은 흐르는 초콜릿 폭포에 이 기술을 사용하고 플레이어의 오디오 방송기로부터의 거리에 따라 볼륨을 조정합니다.플레이어가 20스터드 이하로 떨어지면 발신기가 전체 볼륨으로 소리를 방출합니다.플레이어가 더 멀리 이동할수록 오디오 슬러쉬는 오디오 방출기로부터 20스터드 떨어져서 볼륨이 줄어듭니다.이것은 소스멀리 있을수록 볼륨이 줄어드는 실제 세계 사운드를 모방합니다.

샘플 진저브레드 하우스 - 오디오 완성 장소 파일에서 루프 3D 오디오를 재현하려면:

  1. 플레이어 캐릭터에 연결된 기본 수신기를 활성화합니다.

    1. 탐색기 창에서 SoundService를 선택합니다.
    2. 속성 에서 기본 수신자 위치문자 로 설정합니다.경험을 실행하면 엔진이 자동으로:
      • 각 플레이어 캐릭터의 AudioListener 아래에 Humanoid.RootPart 를 생성하여 경험 내의 사운드 소스 위치와 규모에 따라 실제 세계의 스피커에서 사운드가 이동하는 소리를 들을 수 있습니다.
      • 생성하는 AudioDeviceOutput 아래에 음향 서비스 합니다.
  2. 탐색기 창에서 작업 공간 > WaterfallAudioObject 으로 이동한 다음:

    1. 오디오 플레이어 개체를 삽입하여 폭포의 오디오 소스를 생성합니다.
    2. 오디오 방출기 개체를 삽입하여 워터폴 오디오 개체 에서 위치 스트림을 방출합니다.
    3. 케이블 개체를 삽입하여 오디오 플레이어에서 오디오 방출기로 스트림을 전달합니다.
  3. Select the 오디오 플레이어 , then in the 속성 window,

    1. 비 오는 오디오 트랙을 재생하려면 자산 IDrbxassetid://1516791621 설정합니다.
    2. 오디오가 중단되지 않고 반복되도록 루프화 를 활성화합니다.
  4. 오디오 방출기를 선택한 다음, 속성 창에서 음향 약화 거리를 로 설정하여 오디오 방출기로부터 20스터드 떨어진 곳에서 소리가 점진적으로 줄어들도록 합니다.

  5. 선택 와이어 , 그런 다음 속성 창에서

    1. 원본 인스턴스를 새로운 오디오 플레이어에 설정하여 해당 특정 오디오 플레이어에서 오디오를 전송하도록 케이블을 원하는지 지정합니다.
    2. 새로운 오디오 방출기타겟 인스턴스 를 설정하여 워터폴 내에서 해당 특정 오디오 방출기에 오디오를 전달하도록 케이블을 지정하고 싶다고 지정합니다.
  6. 탐색기 창으로 돌아가 스크립트를 WaterfallAudioObject에 삽입하고, 이름을 LoopWaterfallMusic으로 변경하고, 실행 컨텍스트 속성을 클라이언트로 설정한 다음 다음 코드를 스크립트에 붙여넣습니다.


    local audioPlayer = script.Parent
    audioPlayer:Play()

    스크립트는 스크립트의 부모를 나타내는 변수를 선언하여 시작합니다 AudioPlayer .스크립트는 플레이어가 경험에 참여하는 순간부터 경험을 종료할 때까지 오디오 소스를 재생하도록 설정합니다.

  7. 아바타가 폭포 근처에 있을 때 루프 초콜릿 비 소리를 듣기 위해 경험을 플레이테스트하세요.캐릭터의 머리를 다른 방향으로 회전하여 들리는 소리는 3D 공간에서 발신자의 위치에 따라 동적으로 실제 세계 스피커로 이동합니다.

원샷 오디오

한 번의 샷 3D 오디오 또는 플레이어가 다시 트리거하지 않으면 특정 시간과 위치에서 한 번만 재생되는 방향 오디오는 플레이어가 자신의 행동, 환경 및 주변의 모든 캐릭터에 대해 컨텍스트를 제공합니다.경험에서 이러한 유형의 청각 피드백을 사용하는 것은 플레이어가 적을 피하거나 유용한 아이템을 선택하는 등의 전략적 결정을 내릴 수 있기 때문에 필수적입니다.

다음 섹션에서는 상황 게임 이벤트, 개체 상호 작용 및 플레이할 수 없는 캐릭터 대화를 포함하여 플레이어가 시기적이고 방향적인 피드백을 필요로 하는 일반적인 게임 플레이 시나리오에 대한 구현 세부 정보를 제공합니다.

이벤트 피드백

플레이어가 환경 내에서 새로운 게임플레이 영역을 잠금 해제하거나 적의 발사를 유도하는 등의 키 상황 이벤트를 트리거할 때, 3D 공간에서 초점과 주의를 집중해야 할 위치를 이해하는 것이 필수적입니다.즉각적인 청각 피드백을 받지 못하면 게임 플레이중요한 정보를 놓칠 수 있으며, 어디로 가야 하는지 또는 다음에 무엇을 해야 하는지 알지 못해 좌절할 수 있습니다.

이것이 왜 중요한지 보여주기 위해, 각 플레이어의 블래스터에서 재생되는 레이저 태그 템플릿의 원샷 3D 오디오를 검토합시다:

  • 깊은 팝 소리는 플레이어가 블래스터에서 발사하는 모든 폭발에 재생됩니다.
  • 클릭하고 로봇 비프 사운드는 플레이어가 새 라운드로 블래스터를 재장전할 때마다 재생됩니다.

이 두 소리는 모든 근처 플레이어에게 폭발의 방향을 알려 주어 재미에 참여하거나 잠재적인 위험을 피하도록 정보에 입각한 결정을 내릴 수 있도록 상황 인식을 제공합니다.

샘플은 이와 같은 기술을 사용하여 플레이어가 경험 내에서 주요 목표를 완료하면 보상에 대한 상황 인식을 제공합니다.세 개의 검드롭을 모두 수집한 후, 진저브레드 집으로 들어갈 수 있는 문이 열려 플레이어가 내부 선물에 액세스할 수 있습니다.

플레이어가 검드롭을 수집해야 하는 특정 순서가 없기 때문에, 플레이어가 마지막으로 수집한 검드롭이 어떤 것이든 상관없이 문이 열리는 것을 알고 있어야 합니다.위치 사운드는 플레이어가 자신의 성공과 문으로부터의 상대적인 거리와 방향에 관계없이 다음에 가야 할 곳을 알도록 하여 이것을 가능하게 합니다.

샘플 진저브레드 집 - 오디오 완료 장소 파일에서 한 번의 샷 이벤트 피드백 3D 오디오를 재현하려면:

  1. 탐색기 창에서 작업 공간 > 문으로 이동한 다음:

    1. 오디오 플레이어 개체를 삽입하여 볼륨에 대한 오디오 소스를 생성합니다.
    2. 오디오 방출기 개체를 삽입하여 에서 위치 스트림을 방출합니다.
    3. 케이블 개체를 삽입하여 오디오 플레이어에서 오디오 방출기로 스트림을 전달합니다.
  2. 오디오 플레이어를 선택한 다음 속성 창에서 자산 ID를 으로 설정하여 슬라이딩 금속 게이트 오디오 트랙을 재생합니다.

  3. 선택 와이어 , 그런 다음 속성 창에서

    1. 원본 인스턴스를 새로운 오디오 플레이어에 설정하여 해당 특정 오디오 플레이어에서 오디오를 전송하도록 케이블을 원하는지 지정합니다.
    2. 새로운 대상 인스턴스오디오 방출기 에 설정하여 와이어가 볼륨 내에서 특정 오디오 방출기에 오디오를 전달하길 원한다고 지정합니다.
  4. 탐색기 창으로 돌아가 서버스크립트서비스에 이동한 다음 스크립트를 삽입하고, 이름을 GumdropService로 변경하고, 실행 컨텍스트 속성을 서버로 설정한 다음 다음 코드를 스크립트에 붙여넣습니다.


    -- 변수 초기화 중
    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local ServerStorage = game:GetService("ServerStorage")
    local TweenService = game:GetService("TweenService")
    -- 모듈
    local Leaderboard = require(ServerStorage.Leaderboard)
    local PlayerData = require(ServerStorage.PlayerData)
    -- 변수
    local gumdropsFolder = Workspace.Gumdrops
    local gumdrops = gumdropsFolder:GetChildren()
    local GUMDROP_KEY_NAME = PlayerData.GUMDROP_KEY_NAME
    local GUMDROP_AMOUNT_TO_ADD = 1
    local function updatePlayerGumdrops(player, updateFunction)
    -- gumdrop 테이블 업데이트
    local newGumdropAmount = PlayerData.updateValue(player, GUMDROP_KEY_NAME, updateFunction)
    -- Gumdrop 리더보드 업데이트
    Leaderboard.setStat(player, GUMDROP_KEY_NAME, newGumdropAmount)
    -- 플레이어가 세 개의 검드롭을 수집했는지 확인
    if newGumdropAmount >= 3 then
    -- 플레이어가 3개의 검드롭을 수집할 때 문 이벤트 오디오 재생
    local audioPlayer = Workspace.Door.AudioPlayer
    audioPlayer:Play()
    -- 문을 아래로 이동시키는 애니메이션
    local doorPart = Workspace.Door
    local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Linear)
    local tween = TweenService:Create(doorPart, tweenInfo, {Position = doorPart.Position + Vector3.new(0, -15, 0)})
    tween:Play()
    end
    end
    -- 이벤트 처리기 정의
    local function onGumdropTouched(otherPart, gumdrop)
    if gumdrop:GetAttribute("Enabled") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- 플레이어가 검드롭을 터치했습니다
    local audioPlayer = gumdrop.AudioPlayer
    audioPlayer:Play()
    gumdrop.Transparency = 1
    gumdrop:SetAttribute("Enabled", false)
    updatePlayerGumdrops(player, function(oldGumdropAmount)
    oldGumdropAmount = oldGumdropAmount or 0
    return oldGumdropAmount + GUMDROP_AMOUNT_TO_ADD
    end)
    print("Player collected gumdrop")
    end
    end
    end
    -- 이벤트 수신기 설정
    for _, gumdrop in gumdrops do
    gumdrop:SetAttribute("Enabled", true)
    gumdrop.Touched:Connect(function(otherPart)
    onGumdropTouched(otherPart, gumdrop)
    end)
    end

    이 스크립트는 Workspace , Players , ServerStorageTweenService 서비스를 초기화하여 자식 및 기능을 참조할 수 있도록 시작합니다.그런 다음, 리더보드플레이어데이터 모듈이 필요하며 ServerStorage 에서 이러한 모듈은 플레이어가 환경에서 수집하는 검볼의 양을 추적하는 오른쪽 상단의 리더보드를 생성하고 업데이트하는 책임이 있습니다.

    스크립트의 updatePlayerGumdrops 함수는 이벤트 피드백에 대한 3D 오디오 트리거링에 대부분의 작업이 발생하는 곳이며, 두 가지 인수가 필요합니다:

    • player - 검드롭을 수집하는 플레이어.
    • updateFunction - 플레이어가 수집한 gumdrop 양을 업데이트하는 콜백 함수

    플레이어가 검드롭과 충돌하면 스크립트:

    • PlayerData.updateValue 함수를 호출하여 플레이어의 새로운 gumdrop 컬렉션 금액 값을 가져옵니다.
    • 새로운 금액으로 리더보드를 업데이트하려면 Leaderboard.setStat 함수를 호출합니다.
    • 금액이 더 크거나 같은지 확인하기 위해 3 보다 큰지 확인합니다.

    이 값이 3보다 크거나 같으면 스크립트:

    • 오디오 플레이어에서 오디오 방송기로 3D 오디오 트랙을 재생합니다.
    • 문을 현재 위치보다 선형으로 15스터드 아래로 이동합니다.

    스크립트의 나머지 부분은 gumdrop과 충돌하는 모든 것을 플레이어라고 감지하는 데 주로 책임이 있으므로 수집 피드백에 대한 비위치 소리를 트리거할 수 있습니다.스크립트의 이 부분에 대한 자세한 정보는 2D 오디오 추가 - 게임플레이 피드백을 참조하십시오.

  5. 환경에서 세 개의 검드롭을 모두 수집한 후 경험을 플레이테스트하여 슬라이드 게이트 소리를 들어보세요.카메라를 회전하면 사운드가 실제 세계의 스피커에 동적으로 이동되어 3D 공간에서 발신자의 위치에 따라 들립니다.

개체 상호 작용

플레이어가 환경 내의 3D 개체와 상호작용할 때, 조명 스위치를 켜거나 무기를 집어들면 그들이 개체와 상호작용하는 방법을 직관적으로 이해할 수 있도록 즉시 피드백을 제공하는 것이 중요합니다.시각적 및 청각적 피드백의 조합은 플레이어의 행동과 환경 반응 사이의 원인과 결과 관계를 강화합니다.

이 개념을 확장하기 위해, 식물 샘플에서 사용자 가드닝 작업의 사용자 흐름을 위한 다음 샷 3D 오디오를 검토합시다:

  • 플레이어가 씨앗을 심을 때 부드러운 클릭 소리가 재생됩니다.
  • 플레이어가 자라는 식물에 물을 뿌릴 때 젖은 튀는 소리가 재생됩니다.
  • 플레이어가 완전히 자란 식물을 수집하면 클립 사운드가 재생됩니다.
  • 플레이어가 캐비닛을 마차에 넣으면 부드러운 굴굴 소리가 재생됩니다.

이 모든 소리는 플레이어의 근접 알림 키 상호작용을 3D 공간에서 변경되는 개체와 강화하여 개체가 변경되는 것을 플레이어에게 알립니다.색상 변경이나 애니메이션이 독립적으로 해독하기 어려운 시각 장애가 있는 플레이어의 경우, 이러한 여러 형태의 감각 피드백을 제공하면 3D 개체 상호 작용이 가능하고 직관적으로 유지되도록 가능한 한 많은 플레이어에게 도움이 됩니다.

다양한 감각 피드백의 개체 상호 작용을 구성하는 방법에 대한 다른 예를 제공하기 위해, 샘플은 플레이어가 진저브레드 집 내부의 3D 페퍼민트 버튼을 밟을 때마다 시각적 및 청각적 피드백을 모두 제공합니다.플레이어가 버튼과 상호작용하지 않을 때, 일반적인 페퍼민트 캔디처럼 보이지만, 버튼을 밟으면 샘플:

  • 축하 종소리 오디오 트랙을 재생합니다.
  • 버튼의 측면을 녹색 색조로 염색합니다.
  • 버튼을 지면으로 이동합니다.

여기에서 항목을 잠금 해제하거나 특수 능력을 트리거하는 등 모든 종류의 독특한 게임 플레이 작업에 이 상호 작용을 연결할 수 있습니다.

기본 보기
누른 상태

샘플 진저브레드 집 - 오디오 완료 장소 파일에서 한 번의 샷 개체 상호 작용 3D 오디오를 재현하려면:

  1. 탐색기 창에서 작업 공간 > 3DAudioButton 으로 이동한 다음:

    1. 오디오 플레이어 개체를 삽입하여 버튼에 대한 오디오 소스를 생성합니다.
    2. 오디오 방출기 개체를 삽입하여 3DAudioButton 에서 위치 스트림을 방출합니다.
    3. 케이블 개체를 삽입하여 오디오 플레이어에서 오디오 방출기로 스트림을 전달합니다.
  2. 오디오 플레이어를 선택하고, 속성 창에서 자산 ID를 으로 설정하여 즐거운 축하 오디오 트랙을 재생합니다.

  3. 선택 와이어 , 그런 다음 속성 창에서

    1. 원본 인스턴스를 새로운 오디오 플레이어에 설정하여 해당 특정 오디오 플레이어에서 오디오를 전송하도록 케이블을 원하는지 지정합니다.
    2. 새로운 대상 인스턴스오디오 방출기 에 설정하여 와이어가 버튼 내에서 특정 오디오 방출기로 오디오를 전달하길 원한다고 지정합니다.
  4. 탐색기 창으로 돌아가 Explorer 창에서 스크립트3DAudioButton 에 삽입하고, 이름을 플레이오디오 누르기 로 변경한 다음 다음 코드를 스크립트에 붙여넣으세요:


    local TweenService = game:GetService("TweenService")
    local buttonModel = script.Parent.Parent
    local buttonPart = buttonModel.ButtonPart
    local buttonPressedAudioPlayer = buttonModel.ButtonPressedAudioPlayer
    local tweenInfo = TweenInfo.new(.2, Enum.EasingStyle.Exponential)
    local buttonTweenByIsPressed = {
    -- 누르기
    [true] = TweenService:Create(buttonPart, tweenInfo, {
    Size = buttonPart.Size / Vector3.new(2, 1, 1),
    Color = Color3.fromRGB(75, 151, 75),
    }),
    -- 기본
    [false] = TweenService:Create(buttonPart, tweenInfo, {
    Size = buttonPart.Size,
    Color = Color3.fromRGB(196, 40, 28),
    }),
    }
    local function onIsPlayingChanged()
    local isPlaying = buttonPressedAudioPlayer.IsPlaying
    local tween = buttonTweenByIsPressed[isPlaying]
    tween:Play()
    end
    onIsPlayingChanged()
    buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying"):Connect(onIsPlayingChanged)
    buttonPressedAudioPlayer.Ended:Connect(onIsPlayingChanged)
    buttonPart.Touched:Connect(function(_hit)
    buttonPressedAudioPlayer:Play()
    end)

    스크립트는 다음을 가져오는 것으로 시작합니다:

    • 그래서 지상에서 튀어나온 버튼의 부분을 애니메이션할 수 있습니다. TweenService
    • 스크립트의 부모 3DAudioButton 모델.
    • 버튼의 지상에서 튀어나온 부분.
    • 축하 사운드 오디오 트랙과 함께 관련 오디오 플레이어.

    스크립트는 다음을 정의합니다:

    • 버튼의 애니메이션이 지수 애니메이션 스타일로 재생될 것으로 지정하는 TweenInfo 개체.
    • 버튼의 누르거나 누르지 않은 상태를 나타내는 두 청소년.
      • true 키가 누른 상태에서 버튼이 약간 아래로 이동하여 부품의 측면을 녹색 색조로 염색합니다.
      • 압력이 없는 상태의 false는 버튼을 원래 위치로 이동하고 이전 색조를 제거합니다.

    스크립트의 나머지 부분은 개체 상호 작용 피드백에서 작업의 대부분이 발생하는 곳이므로 onIsPlayingChanged 함수와 이벤트 수신기가 함께 작동하는 방법을 검토하겠습니다:

    1. buttonPart.Touched 플레이어가 버튼을 터치하도록 듣고, 오디오 플레이어에서 연관된 오디오를 재생하기 위해 Play() 함수를 호출합니다.이 프로세스는 AudioPlayer.IsPlaying 속성을 false에서 true로 전환합니다.
    2. buttonPressedAudioPlayer:GetPropertyChangedSignal("IsPlaying") 오디오 플레이어의 IsPlaying 속성이 변경될 때 호출하여 onIsPlayingChanged 함수를 호출합니다.
    3. onIsPlayingChanged 함수는 이 정보를 사용하여 3D 공간에서 시각적 모양을 변경하는 청소년을 트리거합니다.
    4. 플레이어가 빠르게 버튼에 빠르게 점프하여 오디오를 재시작하지 않도록 하려면 listens for the audio player to finish playing before calling the function again.

    이벤트는 변경될 때만 발생하며, 즉 변경될 때 발생하지 않는다는 점에 유의해야 합니다(예: 에서 로 변경될 때).서버에서 클라이언트로 복제하는 속성의 타이밍 문제로 인해 이는 의도된 동작입니다.이로 인해 이 예제에서는 Ended 이벤트가 제공되고 수신되어 두 가지 경우를 모두 다루게 됩니다.

  5. 플레이어 캐릭터가 진저브레드 집의 3D 버튼을 터치할 때 축하 소리를 듣기 위해 경험을 플레이테스트하십시오.버튼에서 멀어지면 소리의 볼륨이 감소합니다.

캐릭터 대화

플레이할 수 없는 캐릭터(NPC)에서 방향 오디오를 제공하면 플레이어가 환경 내의 관심 지점으로 안내되고 다른 캐릭터와의 상호작용에 깊이가 더해집니다.사실, 스토리 중심 게임에서 많은 게임 디자이너는 간접적으로 플레이어에게 자신의 캐릭터, 동맹 및 적 캐릭터 또는 세계 자체에 대해 가르치기 위해 캐릭터 대화를 전략적으로 사용합니다.

이 기술의 일반적인 예에는 다음이 포함됩니다:

  • 대화 스타일 에서 게임의 분위기를 설정합니다.
  • 바운터 를 통해 플레이어에게 캐릭터 관계에 대해 가르치기
  • 적의 대화 를 통해 플레이어와 관련된 동기나 위치를 고백합니다.
  • 플레이어 캐릭터가 생각을 큰 소리로 말하여 플레이어를 부드럽게 안내하여 자신을 치유하거나, 다른 위치로 이동하거나, 아이템을 찾도록 합니다. * 플레이어 캐릭터와 동맹 캐릭터가 대화하여 역사, 문화 및 사회적 문제와 같은 경험 세계 세부 정보를 공개합니다. 이것이 실제로 어떻게 보일 수 있는지 보여주기 위해, 플레이어가 우주 정거장의 메인 로비 영역에 있을 때 주기적으로 재생되는 어둠 너머의 시연 3D 오디오를 검토하겠습니다.

우주 정거장을 캐릭터로 사용하여 이 대화 클립은 전체 설정에 대한 중요한 컨텍스트와 전설을 플레이어에게 제공합니다.예를 들어, 이 단일 문장에서 플레이어는 다음을 배웁니다:

  • 그들은 우주 공간에 있으며, 특히 Kerr-Newman Deep Space Relay 14라는 우주 정거장에 있습니다.
  • 그들의 환경은 미래적이고 환영적입니다.
  • 방문자이며 곧 떠날 가능성이 높습니다.

이 세부 정보는 플레이어를 환경 내에 몰입시키고 미션에 긴급감을 더합니다.그러나 플레이어가 자신의 주요 임무가 무엇인지 모르는 경우 캐릭터 대화를 사용하여 플레이어에게 경험 내에서 수행할 작업을 알릴 수도 있습니다.

설명을 위해 샘플은 3D 공간 내의 볼륨 또는 투명한 영역 을 사용하여 눈사람에게서 캐릭터 대화를 트리거하여 플레이어가 문을 열기 위해 세 개의 검드롭을 수집하도록 안내합니다.플레이어가 경험에 참여할 때 처음 보는 것 중 하나는 플레이어가 대화를 트리거하고 성공하기 위해 해야 할 일을 알게 될 가능성이 더 높습니다.

눈사람 주변의 볼륨은 플레이어가 3D 영역에 들어갈 때 오디오를 재생하기 위해 충돌 피드백을 사용합니다.

샘플 진저브레드 집 - 오디오 완료 장소 파일에서 일회성 캐릭터 대화 3D 오디오를 재현하려면:

  1. 탐색기 창에서 작업 공간 > 대화 볼륨 으로 이동하고:

    1. 오디오 플레이어 개체를 삽입하여 볼륨에 대한 오디오 소스를 생성합니다.
    2. 대화 볼륨에서 위치 스트림을 방송하기 위해 오디오 방출자 개체를 삽입합니다.
    3. 케이블 개체를 삽입하여 오디오 플레이어에서 오디오 방출기로 스트림을 전달합니다.
  2. 오디오 플레이어를 선택한 다음, 속성 창에서 자산 ID를 으로 설정하여 경험의 목표를 위한 지침 오디오 트랙을 재생합니다.

  3. 선택 와이어 , 그런 다음 속성 창에서

    1. 원본 인스턴스를 새로운 오디오 플레이어에 설정하여 해당 특정 오디오 플레이어에서 오디오를 전송하도록 케이블을 원하는지 지정합니다.
    2. 새로운 대상 인스턴스오디오 방출기 에 설정하여 와이어가 볼륨 내에서 특정 오디오 방출기에 오디오를 전달하길 원한다고 지정합니다.
  4. 탐색기 창으로 돌아가 스타터플레이어 > 스타터캐릭터스크립트 로 이동하고, 로컬스크립트 를 삽입하고, 이름을 플레이오디오플레이할때 로 변경하고, 다음 코드를 로컬 스크립트에 붙여넣으세요:


    local Workspace = game:GetService("Workspace")
    local Players = game:GetService("Players")
    local humanoid = script.Parent:WaitForChild("Humanoid")
    local volumeDetector = Workspace.DialogueVolume
    local trigger = humanoid:WaitForChild("Animator")
    local debounce = false
    local localPlayer = Players.LocalPlayer
    volumeDetector.Touched:Connect(function(hit)
    if debounce then
    return
    end
    local hitCharacter = hit:FindFirstAncestorWhichIsA("Model")
    local hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)
    if hitPlayer ~= localPlayer then
    return
    end
    debounce = true
    local audioPlayer = Workspace.DialogueVolume.AudioPlayer
    audioPlayer:Play()
    audioPlayer.Ended:Wait()
    debounce = false
    end)

    이 스크립트는 작업 공간과 플레이어 서비스를 가져와서 자식과 기능을 참조할 수 있도록 시작합니다.플레이어 캐릭터가 경험으로 다시 로드되거나 재생성되면 스크립트는 다음을 기다립니다:

    • 문자의 HumanoidAnimator 개체.
    • 대화 볼륨이라는 작업 영역의 볼륨 개체입니다. DialogueVolume .

    볼륨과 충돌하는 것이 있으면 이벤트 처리기 함수가 , 즉 볼륨에 충돌한 것이 캐릭터 모델의 후손인 경우 첫 번째 조상을 가져옵니다.그렇다면 함수는 다음과 같습니다:

    • 디바운스를 true 설정합니다.
    • 오디오가 종료때까지 플레이하고 대기합니다.
    • 디바운스를 false 다시 설정합니다.

    오디오가 재생을 마친 후에 설정 디바운스를 false``true``false 다시 설정하면 플레이어가 계속 볼륨과 충돌하면서 오디오가 반복적으로 트리거되지 않는 디바운스 패턴이 됩니다.이 디바운스 패턴에 대한 자세한 정보는 충돌 감지를 참조하십시오.

  5. 플레이어 캐릭터가 눈사람 주변의 볼륨을 만질 때 교육 캐릭터 대화를 듣기 위해 경험을 플레이테스트합니다.