사용자의 카메라 제어

*이 콘텐츠는 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 스터드 아래에 있습니다. 이를 수정하기 위해 루트의 위치에 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을 생성합니다. cameraPosition에 위치하고 rootPosition을 향하는 CFrame을 생성하기 위해 CFrame.lookAt()을 사용합니다.

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'은 미국 및 기타 국가 내 당사의 등록 및 미등록 상표입니다.