ユーザーの世界の視点は Camera オブジェクトによって表されます。カメラの挙動は、さまざまな方法で体験に合わせて変更できます。たとえば、カメラはモンスターが通り過ぎるときに揺れたり、サイドスクロール形式のユーザーキャラクターの横に固定されたりします。
一人称カメラを作成する
一人称カメラは、カメラがキャラクターの頭と一緒にロックされているビューで、より現実的です。これは、ユーザーを世界に没入させることを目的としたシューティングゲームやストーリー体験で一般的です。


スタジオにおいて、StarterPlayer オブジェクトには、ユーザーのカメラに影響を与えるいくつかのプロパティがあります。 CameraMode プロパティは、カメラの挙動を決定します。
StarterPlayer を選択します。

CameraMode を LockFirstPerson に変更します。これにより、ユーザーのカメラが頭から離れないようになります。

プレイテストをして、一人称カメラが動作しているのを確認します。
サイドスクロールカメラを作成する
サイドスクロールビューは、カメラがキャラクターの横に固定されるため、世界に二次元的な感覚を与えます。

カメラをスクリプトで制御する
StarterPlayer を展開し、StarterPlayerScripts に LocalScript を追加して、CameraManager と名付けます。

スクリプトの最上部に、以下のコードサンプルをコピー&ペーストして 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
end
CurrentCamera を更新する
カメラの位置の変数とカメラのターゲットの変数が準備できたので、カメラの位置を更新します。ユーザーのカメラには Workspace の CurrentCamera プロパティを介してアクセスできます。カメラには、その位置を決定する CFrame プロパティがあります。
CFrame.lookAt() を使用してカメラを更新できます。これは、2つの位置を取り、最初の位置に配置された CFrame を作成し、2番目の位置を向くものです。 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() は、これらの3つのパラメーターを受け入れることによって、毎フレーム関数を実行するのを簡単にします:
- 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 ビューです。

位置と視点を変更する
前の例のコードを使用して、すべての 3 次元に同じ量を追加するように cameraPosition を修正します。
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()
カメラの動作を変更することで、あなたの体験に新しい見た目をもたらすことができます。cameraPosition を変更して、同じスクリプトでトップダウンカメラを実現できるか見てみましょう。設定を調整して、気に入った結果を得ることを試みてください!