음성 채팅 추가

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

음성 채팅은 3D 공간에서 플레이어가 서로 가까워지거나 멀어짐에 따라 말하는 플레이어의 볼륨을 조정하여 현실적인 커뮤니케이션을 시뮬레이션하는 근접 기반 채팅 기능입니다. 플레이어가 마이크를 통해 서로 대화할 수 있도록 함으로써, 전 세계에서 실시간으로 소통하고 전략을 세워 게임의 목표를 달성할 수 있습니다.

Gingerbread Island - Voice Chat .rbxl 파일을 참조하여, 이 튜토리얼에서는 게임 플레이에 다양한 형태의 음성 채팅을 통합하는 방법을 보여줍니다. 여기에는 다음과 같은 안내가 포함됩니다:

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

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

설정 구성

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

플레이어가 게임에 참여하면, 음성 채팅 설정은 이제 다음을 수행합니다:

  • 음성 사용 자격이 있는 플레이어가 마이크를 사용할 수 있도록 허용합니다.
  • 각 음성 사용 자격이 있는 Player 객체 아래에 AudioDeviceInput 객체를 생성하고 부모로 설정합니다.
  • 각 음성 사용 자격이 있는 Player.Character 아래에 AudioEmitter 객체를 생성하고 부모로 설정합니다.
  • Workspace.CurrentCamera 아래에 AudioListener를 생성하고 부모로 설정합니다.

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

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

팀 채팅 추가

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

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

  1. Explorer 창에서 ServerScriptServiceScript를 삽입합니다.

  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 객체를 반복하여, 각 팀의 userID만 마이크로부터 들을 수 있도록 Enum.AccessModifierType 속성을 Allow로 설정한 후, 팀의 userID로 SetUserIdAccessList를 업데이트합니다.

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

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

푸시 투 채팅 추가

푸시 투 채팅은 플레이어가 게임 내에서 특정 버튼을 누르고 있는 동안에만 마이크를 활성화할 수 있는 음성 채팅 구성입니다. 푸시 투 채팅을 게임 플레이에 통합하는 것은 플레이어가 다른 플레이어와 주변 소음보다 더 많은 프라이버시와 제어를 원할 때 유용합니다.

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

  1. Explorer 창에서 ReplicatedStorageScript를 삽입합니다.

  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 창에서 ServerScriptServiceScript를 삽입합니다.

  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 객체의 Muted 속성을 muteAll의 값으로 설정합니다. 예를 들어, muteAlltrue이면 플레이어의 마이크가 비활성화되고, false이면 활성화됩니다.

    스크립트는 무한 루프에 들어가 15초마다 모든 AudioDeviceInput 객체를 음소거하고 음소거 해제합니다.

  3. 게임을 플레이하여 플레이어가 15초 간격으로 음성 채팅을 통해 서로 들을 수 있는지 확인합니다.

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