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


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

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

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

カメラをスクリプト化する
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() を使用してカメラを更新できます。これは 2 つの位置を取り、最初の位置に向かって 2 番目の位置を指す 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() を使用すると、次の 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 ビューです。

位置とビューを変更する
前の例のコードを使用して、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()
カメラの動作を変更することで、ゲームにまったく新しい外観を実現できます。cameraPosition を変更して、同じスクリプトでトップダウンカメラを実現できるか試してみてください。設定を調整して、気に入った結果を得てみてください!