ユーザーの世界の見方は、Camera オブジェクトで表現されます。カメラの動作を多様な方法で体験に合わせることができます。例えば、カメラは世界のイベントに反応し、モンスターが通過するときに震えたり、ユーザーキャラクターの側面にロックされたり、サイドスクローラーのようになります。
1人称カメラを作成する
1人称カメラは、カメラがキャラクターの頭でロックされた状態のビューで、リアルライフにより正確です。シューターやストーリー体験では、目標はユーザーを世界に没入させることです。


Studio では、StarterPlayer オブジェクトには、ユーザーのカメラに影響を与える複数のプロパティが含まれています。 カメラモード プロパティは、カメラの動作を決定します。
Select スタータープレイヤー 。
カメラモードを LockFirstPerson に変更します。これにより、ユーザーのカメラが頭から動かないようになります。
プレイテストして、最初の人のカメラがアクションを起こすのを見る。
サイドスクロールカメラを作成する
サイドスクロールビューでは、カメラをキャラクターの側面に対して固定位置に保ち、世界に2次元の感覚を与えます。
カメラをスクリプトする
スタータープレイヤーを拡張し、スタータープレイヤースクリプトに ローカルスクリプト と呼ばれる CameraManager を追加します。
スクリプトの上部で、次のコードサンプルをコピーして貼り付けて、 プレイヤーサービス を取得し、新しい変数でローカルユーザーを取得します。
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
カメラを指す
すべてのキャラクタモデルには、 ヒューマノイドルートパーツ と呼ばれる部分が含まれており、世界でキャラクタの位置を取得するのに使用できます。カメラのポイントを設置する位置を設定します。
FindFirstChild を使用して、ヒューマノイドルートパーツを取得し、if 文を使用して存在するかどうかをチェックします。
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenendendendヒューマノイドルートパーツの位置は、実際にはユーザーの頭の 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軸 に深さを追加して、Vector3 を使用して。
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 プロパティを通じてユーザーのカメラにアクセスできます。カメラには CFrame プロパティがあり、位置を決定します。
CFrame.lookAt() を使用してカメラを更新できます。2つのポジションが必要で、2番目のポジションに向かって指さされた最初のポジションに位置する CFrame を作成します。Use 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 のデフォルトカメラアップデート後の 後 に実行する必要があり、優先度は内部カメラのレンダリング優先度より 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 を変更して、同じスクリプトでトップダウンカメラを達成できるかどうかを確認してください。設定を調整して、好きな結果を得てみてください!