시작하기
중급 튜토리얼

음성 채팅 추가

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

음성 채팅은 근접 기반 채팅 기능으로, 3D 공간에서 플레이어가 서로 가까워지거나 멀어질 때 대화하는 플레이어의 음량을 조정하여 현실적인 소통을 시뮬레이션합니다. 플레이어가 마이크를 통해 서로 대화할 수 있도록 하여, 전 세계적으로 실시간으로 사교하고 전략을 세워 귀하의 경험 목표를 완료할 수 있습니다.

Gingerbread Island - Voice Chat .rbxl 파일을 참고하여, 이 자습서에서는 게임 플레이에 다양한 형태의 음성 채팅을 통합하는 방법을 보여줍니다. 여기에는 다음에 대한 안내가 포함됩니다:

  • 플레이어를 팀으로 분류하여 팀원과만 음성 채팅을 사용할 수 있습니다.
  • 플레이어가 장치의 특정 버튼을 누르고 있는 동안 일시적으로 마이크를 활성화할 수 있습니다.
  • 음성 채팅이 활성화되거나 비활성화되는 시간대 설정.

다음 섹션을 샘플과 함께 검토하면서, 귀하의 음성 채팅 요구 사항에 맞게 각 코드 샘플을 조정할 수 있습니다.

설정 구성

팀 채팅, 푸시 투 채팅 또는 시간 기반 채팅이 적절하게 작동하려면 음성 채팅을 활성화하고 3D 환경 내에서 오디오를 수집하고 방출하는 데 필요한 적절한 오디오 객체를 생성하기 위해 음성 채팅 설정을 구성해야 합니다.

플레이어가 귀하의 경험에 참여하면 이제 음성 채팅 설정이 다음을 수행합니다:

다음 섹션에서는 이러한 설정을 사용하여 세 가지 고유한 음성 채팅 구성을 자세히 설명합니다. 샘플 Gingerbread Island - Voice Chat 장소 파일을 따라가면서, Explorer 창에서 해당 비활성화된 스크립트를 활성화하여 그 동작을 테스트할 수 있습니다. 각각이 제대로 작동하는지 확인하기 위해, 다음 구성을 진행하기 전에 반드시 스크립트를 다시 비활성화하세요.

Explorer 창의 비활성화된 스크립트

팀 채팅 추가

팀 채팅은 같은 팀에 속한 플레이어만 서로 말하거나 들을 수 있는 음성 채팅 구성입니다. 팀 채팅을 게임 플레이에 통합하는 것은 플레이어가 문제를 해결하기 위해 협력하고 전략을 세울 수 있게 할 때 유용합니다. 예를 들어, 적 팀의 위치, 자원, 할당에 대한 정보를 조정하는 것이 가능합니다.

샘플 Gingerbread Island - Voice Chat 장소 파일에서 팀 음성 채팅을 재현하려면:

  1. Explorer 창에서 ServerScriptService스크립트를 삽입합니다.

  2. 스크립트의 이름을 TeamChat으로 변경하고, 다음 코드를 붙여넣습니다:


    local Teams = game:GetService("Teams")
    local Players = game:GetService("Players")
    local redTeam = Instance.new("Team", Teams)
    redTeam.TeamColor = BrickColor.new("Bright red")
    redTeam.AutoAssignable = true
    redTeam.Name = "Red Team"
    local blueTeam = Instance.new("Team", Teams)
    blueTeam.TeamColor = BrickColor.new("Bright blue")
    blueTeam.AutoAssignable = true
    blueTeam.Name = "Blue Team"
    local function getUserIds(team : Team) : {number}
    local userIds = {}
    for _, player : Player in team:GetPlayers() do
    table.insert(userIds, player.UserId)
    end
    return userIds
    end
    local function getDevices(team : Team) : {AudioDeviceInput}
    local devices = {}
    for _, player : Player in team:GetPlayers() do
    local device : AudioDeviceInput = player:FindFirstChild("AudioDeviceInput")
    if not device then
    continue
    end
    table.insert(devices, device)
    end
    return devices
    end
    local function updateTeam(team : Team)
    local users = getUserIds(team)
    for _, device in getDevices(team) do
    device.AccessType = Enum.AccessModifierType.Allow
    device:SetUserIdAccessList(users)
    end
    end
    local function onDeviceAdded(device : AudioDeviceInput)
    local player : Player = device.Parent
    if player.Team then
    updateTeam(player.Team)
    end
    end
    local function onPlayerAdded(player : Player)
    local device = player:FindFirstChild("AudioDeviceInput")
    if device then
    onDeviceAdded(device)
    end
    player.ChildAdded:Connect(function(child)
    if child.Name == "AudioDeviceInput" then
    onDeviceAdded(child)
    end
    end)
    end
    updateTeam(blueTeam)
    updateTeam(redTeam)
    for _, player in Players:GetPlayers() do
    onPlayerAdded(player)
    end
    Players.PlayerAdded:Connect(onPlayerAdded)
    blueTeam.PlayerAdded:Connect(function() updateTeam(blueTeam) end)
    blueTeam.PlayerRemoved:Connect(function() updateTeam(blueTeam) end)
    redTeam.PlayerAdded:Connect(function() updateTeam(redTeam) end)
    redTeam.PlayerRemoved:Connect(function() updateTeam(redTeam) end)

    이 스크립트는 플레이어가 경험에 참여하는 즉시 팀으로 분류할 수 있도록 TeamsPlayers 서비스를 가져옵니다. 예를 들어, 추가 스크립트 작업 없이 Teams 서비스는 다음과 같은 작업을 처리합니다:

    • 각 팀에 플레이어를 고르게 정렬하고 균형을 유지합니다.
    • 리더보드에서 자신의 팀에 따라 플레이어를 그룹화합니다.
    • 3D 공간에서 플레이어 이름을 해당 팀 색상으로 물들입니다.

    이 서비스를 사용하여 스크립트는 각 팀을 나타내기 위해 서로 다른 Color 속성 값을 가진 두 개의 고유한 Team 객체를 생성합니다: 밝은 빨간색밝은 파란색입니다.

    그런 다음 스크립트는 팀 음성 채팅 구성을 설정하는 핵심 작업을 처리하는 세 가지 함수를 정의합니다:

    • getUserIds - 팀의 모든 플레이어에 대한 userID 배열을 반환합니다.
    • getDevices - 팀의 모든 플레이어에 대한 AudioDeviceInput 객체 배열을 반환합니다. 각 Class.AudioDeviceInput 객체는 실제로 플레이어의 물리적 마이크를 나타냅니다.
    • updateTeam - getUserIds에서 모든 userID를 가져오고 getDevices에서 AudioDeviceInput 객체를 순회하여 Enum.AccessModifierType 속성을 Allow로 설정하여 각 팀의 userID만 팀원의 마이크에서 소리를 들을 수 있도록 허용하고, userIDs를 팀에서 SetUserIdAccessList로 업데이트합니다.

    스크립트 나머지는 이러한 함수와 이벤트 리스너가 함께 작동하는 방식을 관리합니다:

    • 새로운 플레이어가 경험에 참여하면, 스크립트는 플레이어가 마이크를 가지고 있는지 확인하고 팀을 업데이트합니다.
    • 스크립트에서 새로운 AudioDeviceInput 객체를 감지하면 해당 팀(빨간색 또는 파란색)에 대해 updateTeam을 호출합니다.
    • 플레이어가 경험에 참여하거나 퇴장할 때, 스크립트는 각 팀의 설정을 업데이트하기 위해 PlayerAddedPlayerRemoved 이벤트에 연결합니다.
  3. 친구들과 함께 경험을 플레이 테스트하여 각 팀의 팀원만 음성 채팅을 통해 들을 수 있는지 확인하세요.

푸시 투 채팅 추가

푸시 투 채팅은 플레이어가 장치에서 특정 버튼을 누르고 있는 동안만 경험 내에서 마이크를 활성화할 수 있는 음성 채팅 구성입니다. 푸시 투 채팅을 게임 플레이에 통합하는 것은 플레이어가 다른 플레이어와 주변 소음보다 목소리를 더 잘 들리게 하고, 더 많은 개인 정보 보호와 제어를 제공할 때 유용합니다.

샘플 Gingerbread Island - Voice Chat 장소 파일에서 푸시 투 음성 채팅을 재현하려면:

  1. Explorer 창에서 ReplicatedStorage스크립트를 삽입합니다.

  2. Properties 창에서 RunContextClient로 설정하여 스크립트가 로컬 플레이어의 마이크만 제어하도록 합니다.

  3. 스크립트의 이름을 PushToChat으로 변경하고, 다음 코드를 붙여넣습니다:


    local Players = game:GetService("Players")
    local UserInputService = game:GetService("UserInputService")
    local audioIn: AudioDeviceInput = Players.LocalPlayer:WaitForChild("AudioDeviceInput")
    local pushToTalkKey = Enum.KeyCode.V
    audioIn.Muted = true
    UserInputService.InputBegan:Connect(function(input: InputObject)
    if input.KeyCode == pushToTalkKey then
    audioIn.Muted = false
    end
    end)
    UserInputService.InputEnded:Connect(function(input: InputObject)
    if input.KeyCode == pushToTalkKey then
    audioIn.Muted = true
    end
    end)

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

    • 경험 내 모든 플레이어를 참조할 수 있도록 하는 Players 서비스.
    • 플레이어가 장치에서 버튼을 눌렀는지 확인하기 위해 사용하는 UserInputService 서비스.
    • 로컬 플레이어의 AudioDeviceInput 객체, 즉 장치의 물리적 마이크.

    그런 다음 스크립트는:

    • 플레이어가 마이크에 대고 말하기 위해 눌러야 하는 버튼으로 V 키를 설정합니다.
    • 플레이어의 마이크를 음소거합니다.

    스크립트 나머지는 UserInputServiceInputBeganInputEnded에 대한 두 개의 이벤트 리스너를 설정합니다. 플레이어가 V 키를 눌렀을 때 InputBegan 이벤트가 플레이어의 마이크를 음소거 해제하고, V 키에서 손을 뗄 때 InputEnded 이벤트가 다시 마이크를 음소거합니다.

  4. 경험을 플레이 테스트하여 플레이어가 V 키를 누르고 있는 동안에만 음성 채팅을 통해 서로를 들을 수 있는지 확인하세요.

시간 기반 채팅 추가

시간 기반 채팅은 설정된 시간 동안만 플레이어가 서로 말을 하거나 들을 수 있는 음성 채팅 구성입니다. 시간 기반 채팅을 게임 플레이에 통합하면, 플레이어가 특정 단계에서 서로 어떻게 소통할지를 신중하게 계획할 수 있습니다. 예를 들어, 라운드 기반 토론 중이거나 컷신 이후에 소통하는 것과 같습니다.

샘플 Gingerbread Island - Voice Chat 장소 파일에서 시간 기반 음성 채팅을 재현하려면:

  1. Explorer 창에서 ServerScriptService스크립트를 삽입합니다.

  2. 스크립트의 이름을 TimeBasedChat으로 변경하고, 다음 코드를 붙여넣습니다:


    local Players = game:GetService("Players")
    local muteAll = false
    local function toggleMuteAll()
    muteAll = not muteAll
    for _, player in Players:GetPlayers() do
    local device : AudioDeviceInput = player:FindFirstChild("AudioDeviceInput")
    if not device then
    continue
    end
    device.Muted = muteAll
    end
    end
    while true do
    task.wait(15) -- 매 15초마다
    toggleMuteAll() -- 사람들에게 말을 허용하거나 말하지 못하게 합니다
    end

    이 스크립트는 Players 서비스를 가져와 경험 내 모든 플레이어를 관리하는 기능을 참조할 수 있습니다. 그런 다음 muteAll 플래그를 false로 설정하고, 이후의 toggleMuteAll 함수는 음성 채팅을 켜고 끄는 데 사용됩니다.

    toggleMuteAll 함수를 살펴보면:

    • Players.GetPlayers를 사용하여 경험 내 모든 플레이어를 순회합니다.
    • 각 플레이어에 대해 자식으로 AudioDeviceInput 객체, 즉 장치의 물리적 마이크가 있는지 확인합니다.
    • 마이크가 있을 경우, 그 객체의 AudioDeviceInput 속성인 MutedmuteAll의 값으로 설정합니다. 예를 들어 muteAlltrue이면 플레이어의 마이크가 비활성화되고, false이면 활성화됩니다.

    그런 다음 스크립트는 무한 루프에 들어가 15초마다 모든 AudioDeviceInput 객체의 음소거 상태를 전환합니다.

  3. 경험을 플레이 테스트하여 플레이어가 15초 단위로 음성 채팅을 통해서만 서로를 들을 수 있는지 확인하세요.

©2026 Roblox Corporation. Roblox 및 Roblox 로고, 'Powering Imagination'은 미국 및 기타 국가 내 당사의 등록 및 미등록 상표입니다.