사용자가 세상을 보는 뷰는 Camera 객체로 표현됩니다. 카메라 동작을 다양한 방법으로 조정할 수 있습니다. 예를 들어, 카메라는 몬스터가 지나갈 때 흔들리거나, 사이드 스크롤러에서 사용자 캐릭터의 측면에 고정될 수 있습니다.
1인칭 카메라 생성
1인칭 카메라는 카메라가 캐릭터의 머리에 고정된 뷰로, 실제와 더 유사합니다. 사용자가 세상에 몰입하도록 만드는 것이 목표인 슈팅 게임 및 스토리 경험에서 흔히 사용됩니다.


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

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

1인칭 카메라가 작동하는지 플레이테스트합니다.
사이드 스크롤링 카메라 생성
사이드 스크롤링 뷰는 카메라를 캐릭터 측면에 상대적으로 고정된 위치에 유지하여 세상에 2차원적인 느낌을 줍니다.

카메라 스크립트 작성
StarterPlayer를 확장하고, StarterPlayerScripts에서 CameraManager라는 이름의 LocalScript를 추가합니다.

스크립트 맨 위에 다음 코드 샘플을 복사하여 붙여 넣어 Players 서비스를 가져온 다음 새 변수에서 로컬 사용자를 가져옵니다.
local Players = game:GetService("Players")local player = Players.LocalPlayerupdateCamera라는 함수를 생성합니다. 이는 카메라의 새 위치를 가져오고 설정하는 데 필요한 로직을 보유합니다.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()end함수 안에서 사용자의 캐릭터 모델을 가져오고, if 문을 사용하여 존재하는지 확인합니다.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenendend
카메라 방향 설정
모든 캐릭터 모델에는 HumanoidRootPart라는 이름의 파트가 포함되어 있으며, 이는 세상에서 캐릭터의 위치를 가져오는 데 사용할 수 있습니다. 이는 카메라가 가리키는 위치를 설정합니다.
FindFirstChild를 사용하여 HumanoidRootPart를 가져오고, if 문을 사용하여 존재하는지 확인합니다.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenendendendHumanoidRootPart의 위치는 실제로 사용자의 머리 아래 2 스터드입니다. 이를 수정하기 위해 root의 위치에 2 스터드 높이를 가진 새로운 Vector3를 추가합니다.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal HEIGHT_OFFSET = 2local function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenlocal rootPosition = root.Position + Vector3.new(0, HEIGHT_OFFSET, 0)endendend
카메라 위치 설정
카메라는 또한 위치가 필요합니다. 사용자의 뷰에 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 - 렌더 단계에 바인딩할 함수입니다.
RunService:BindToRenderStep()을 사용하여 updateCamera 함수를 렌더 단계에 바인딩합니다.
local Players = game:GetService("Players")local RunService = game:GetService("RunService")local player = Players.LocalPlayerlocal camera = workspace.CurrentCameralocal CAMERA_DEPTH = 24local HEIGHT_OFFSET = 2local function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenlocal 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)endendendRunService:BindToRenderStep("SidescrollingCamera", Enum.RenderPriority.Camera.Value + 1, updateCamera)코드를 플레이테스트합니다. A 및 D 키를 사용하여 캐릭터를 좌우로 이동합니다.
이소메트릭 카메라 생성
사용자의 위치를 가져오고 카메라의 위치를 매 프레임마다 업데이트하는 기본 구조는 이소메트릭 카메라와 같은 다른 카메라 스타일에 조정될 수 있습니다. 이소메트릭 카메라는 사용자 캐릭터를 향해 약간 아래쪽으로 고정된 각도로 바라보는 3D 뷰입니다.

위치 및 뷰 수정
이전 예제에서 사용한 코드로, cameraPosition을 수정하여 모든 3차원 차원에 같은 양을 더합니다.
local function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenlocal 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)endendendRunService:BindToRenderStep("IsometricCamera", Enum.RenderPriority.Camera.Value + 1, updateCamera)카메라의 FieldOfView 속성을 변경하면 이 카메라를 확대 및 축소하는 효과를 시뮬레이션하여 뷰를 평평하게 만들 수 있습니다. 20의 값으로 설정하여 확대해 보고, 사용자와의 거리도 늘려 보세요.
local Players = game:GetService("Players")local RunService = game:GetService("RunService")local player = Players.LocalPlayerlocal camera = workspace.CurrentCameralocal CAMERA_DEPTH = 64local HEIGHT_OFFSET = 2camera.FieldOfView = 20local function updateCamera()
카메라 동작 방식을 변경함으로써 경험의 전혀 새로운 모습을 얻을 수 있습니다. 스크립트를 사용하여 카메라 위치를 변경하여 탑다운 카메라를 구현해 보세요. 원하는 결과를 얻기 위해 설정을 조정해 보세요!