시작하기
중급 튜토리얼

사용자의 카메라 제어

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

사용자가 세상을 보는 뷰는 Camera 객체로 표현됩니다. 카메라 동작을 다양한 방법으로 조정할 수 있습니다. 예를 들어, 카메라는 몬스터가 지나갈 때 흔들리거나, 사이드 스크롤러에서 사용자 캐릭터의 측면에 고정될 수 있습니다.

1인칭 카메라 생성

1인칭 카메라는 카메라가 캐릭터의 머리에 고정된 뷰로, 실제와 더 유사합니다. 사용자가 세상에 몰입하도록 만드는 것이 목표인 슈팅 게임 및 스토리 경험에서 흔히 사용됩니다.

1인칭 카메라
클래식 Roblox 카메라

Studio에서 StarterPlayer 객체는 사용자의 카메라에 영향을 미치는 여러 속성을 포함하고 있습니다. CameraMode 속성은 카메라의 동작 방식을 결정합니다.

  1. StarterPlayer를 선택합니다.

    alt

  2. CameraMode를 LockFirstPerson으로 변경합니다. 이렇게 하면 사용자의 카메라가 머리에서 멀어지지 않도록 할 수 있습니다.

    alt

  3. 1인칭 카메라가 작동하는지 플레이테스트합니다.

사이드 스크롤링 카메라 생성

사이드 스크롤링 뷰는 카메라를 캐릭터 측면에 상대적으로 고정된 위치에 유지하여 세상에 2차원적인 느낌을 줍니다.

alt

카메라 스크립트 작성

  1. StarterPlayer를 확장하고, StarterPlayerScripts에서 CameraManager라는 이름의 LocalScript를 추가합니다.

    alt

  2. 스크립트 맨 위에 다음 코드 샘플을 복사하여 붙여 넣어 Players 서비스를 가져온 다음 새 변수에서 로컬 사용자를 가져옵니다.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
  3. updateCamera라는 함수를 생성합니다. 이는 카메라의 새 위치를 가져오고 설정하는 데 필요한 로직을 보유합니다.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local function updateCamera()
    end
  4. 함수 안에서 사용자의 캐릭터 모델을 가져오고, if 문을 사용하여 존재하는지 확인합니다.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local function updateCamera()
    local character = player.Character
    if character then
    end
    end

카메라 방향 설정

모든 캐릭터 모델에는 HumanoidRootPart라는 이름의 파트가 포함되어 있으며, 이는 세상에서 캐릭터의 위치를 가져오는 데 사용할 수 있습니다. 이는 카메라가 가리키는 위치를 설정합니다.

  1. FindFirstChild를 사용하여 HumanoidRootPart를 가져오고, if 문을 사용하여 존재하는지 확인합니다.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local function updateCamera()
    local character = player.Character
    if character then
    local root = character:FindFirstChild("HumanoidRootPart")
    if root then
    end
    end
    end
  2. HumanoidRootPart의 위치는 실제로 사용자의 머리 아래 2 스터드입니다. 이를 수정하기 위해 root의 위치에 2 스터드 높이를 가진 새로운 Vector3를 추가합니다.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local HEIGHT_OFFSET = 2
    local function updateCamera()
    local character = player.Character
    if character then
    local root = character:FindFirstChild("HumanoidRootPart")
    if root then
    local rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)
    end
    end
    end

카메라 위치 설정

카메라는 또한 위치가 필요합니다. 사용자의 뷰에 2D 사이드 스크롤링 느낌을 주기 위해, 카메라는 캐릭터의 측면을 직접 바라봐야 합니다. 카메라 위치의 Z 축에 깊이를 추가하여 카메라를 사용자 옆에 배치합니다.


local player = Players.LocalPlayer
local CAMERA_DEPTH = 24
local HEIGHT_OFFSET = 2
local function updateCamera()
local character = player.Character
if character then
local root = character:FindFirstChild("HumanoidRootPart")
if root then
local rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)
local cameraPosition = Vector3.new(rootPosition.X, rootPosition.Y, CAMERA_DEPTH)
end
end
end

CurrentCamera 업데이트

카메라의 위치와 카메라의 목표에 대한 변수 준비가 완료되었으므로, 이제 카메라 위치를 업데이트할 차례입니다. 사용자의 카메라는 Workspace의 CurrentCamera 속성을 통해 접근할 수 있습니다. 카메라에는 위치를 결정하는 CFrame 속성이 있습니다.

CFrame.lookAt()을 사용하여 카메라를 업데이트할 수 있습니다. 이 함수는 두 개의 위치를 사용하여 첫 번째 위치에서 두 번째를 가리키는 CFrame을 생성합니다. CFrame.lookAt()을 사용하여 cameraPosition에 위치하고 rootPosition을 바라보게 하는 CFrame을 생성합니다.


local player = Players.LocalPlayer
local camera = workspace.CurrentCamera
local CAMERA_DEPTH = 24
local HEIGHT_OFFSET = 2
local function updateCamera()
local character = player.Character
if character then
local root = character:FindFirstChild("HumanoidRootPart")
if root then
local rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)
local cameraPosition = Vector3.new(rootPosition.X, rootPosition.Y, CAMERA_DEPTH)
camera.CFrame = CFrame.lookAt(cameraPosition, rootPosition)
end
end
end

카메라 동기화

마지막 단계는 이 함수를 반복해서 실행하여 카메라가 사용자와 동기화된 상태를 유지하도록 하는 것입니다. 사용자가 보는 이미지는 지속적으로 새로 고쳐집니다. 모든 계산을 수행하는 데 걸리는 순간은 렌더 단계라고 합니다.

RunService:BindToRenderStep()을 사용하면 매 프레임마다 함수를 실행할 수 있도록 쉽게 설정할 수 있으며, 이 함수는 다음 세 가지 매개변수를 받습니다:

  • name - 이 바인딩의 이름으로, 다른 동일한 이름의 함수와 충돌하지 않도록 고유해야 합니다.
  • priority - 숫자가 높을수록 우선 순위가 높아집니다. 이 함수는 Roblox의 기본 카메라 업데이트 이후에 실행되어야 하므로 우선 순위는 내부 카메라의 RenderPriority보다 1레벨 높은 값으로 설정합니다.
  • function - 렌더 단계에 바인딩할 함수입니다.
  1. RunService:BindToRenderStep()을 사용하여 updateCamera 함수를 렌더 단계에 바인딩합니다.


    local Players = game:GetService("Players")
    local RunService = game:GetService("RunService")
    local player = Players.LocalPlayer
    local camera = workspace.CurrentCamera
    local CAMERA_DEPTH = 24
    local HEIGHT_OFFSET = 2
    local function updateCamera()
    local character = player.Character
    if character then
    local root = character:FindFirstChild("HumanoidRootPart")
    if root then
    local rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)
    local cameraPosition = Vector3.new(rootPosition.X, rootPosition.Y, CAMERA_DEPTH)
    camera.CFrame = CFrame.lookAt(cameraPosition, rootPosition)
    end
    end
    end
    RunService:BindToRenderStep("SidescrollingCamera", Enum.RenderPriority.Camera.Value + 1, updateCamera)
  2. 코드를 플레이테스트합니다. AD 키를 사용하여 캐릭터를 좌우로 이동합니다.

이소메트릭 카메라 생성

사용자의 위치를 가져오고 카메라의 위치를 매 프레임마다 업데이트하는 기본 구조는 이소메트릭 카메라와 같은 다른 카메라 스타일에 조정될 수 있습니다. 이소메트릭 카메라는 사용자 캐릭터를 향해 약간 아래쪽으로 고정된 각도로 바라보는 3D 뷰입니다.

alt

위치 및 뷰 수정

  1. 이전 예제에서 사용한 코드로, cameraPosition을 수정하여 모든 3차원 차원에 같은 양을 더합니다.

    alt


    local function updateCamera()
    local character = player.Character
    if character then
    local root = character:FindFirstChild("HumanoidRootPart")
    if root then
    local rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)
    local cameraPosition = rootPosition + Vector3.new(CAMERA_DEPTH, CAMERA_DEPTH, CAMERA_DEPTH)
    camera.CFrame = CFrame.lookAt(cameraPosition, rootPosition)
    end
    end
    end
    RunService:BindToRenderStep("IsometricCamera", Enum.RenderPriority.Camera.Value + 1, updateCamera)
  2. 카메라의 FieldOfView 속성을 변경하면 이 카메라를 확대 및 축소하는 효과를 시뮬레이션하여 뷰를 평평하게 만들 수 있습니다. 20의 값으로 설정하여 확대해 보고, 사용자와의 거리도 늘려 보세요.


    local Players = game:GetService("Players")
    local RunService = game:GetService("RunService")
    local player = Players.LocalPlayer
    local camera = workspace.CurrentCamera
    local CAMERA_DEPTH = 64
    local HEIGHT_OFFSET = 2
    camera.FieldOfView = 20
    local function updateCamera()

카메라 동작 방식을 변경함으로써 경험의 전혀 새로운 모습을 얻을 수 있습니다. 스크립트를 사용하여 카메라 위치를 변경하여 탑다운 카메라를 구현해 보세요. 원하는 결과를 얻기 위해 설정을 조정해 보세요!

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