사용자의 세계에 대한 뷰는 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 스터드 아래에 있습니다. 이를 수정하기 위해 루트의 위치에 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
endCurrentCamera 업데이트하기
이제 카메라의 위치와 카메라의 목표에 대한 변수가 준비되었으므로 카메라의 위치를 업데이트할 차례입니다. 사용자의 카메라는 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 - 렌더 단계에 바인딩할 함수입니다.
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()
카메라의 동작 방식을 변경함으로써 게임에 전혀 새로운 모습을 부여할 수 있습니다. 같은 스크립트를 사용하여 카메라 위치를 변경하여 탑다운 카메라를 구현해 보세요. 원하는 결과를 얻기 위해 설정을 조정해 보세요!