ユーザーの世界のビューは、Cameraで表現されます。カメラの動作を変更して、あなたのエクスペリエンスに合わせて変更できます。たとえば、カメラはモンスターが歩いているイベントに反応したり、Camera、などです。
1人称カメラを作成する
1人称カメラは、キャラクターの頭をカメラがロックしたビューで、リアルライフにもっと正確です。これは、シューターやストーリーエクスペリエンスでゴールを感じさせるために、目標がユーザーを世界に没入させることでよくあります。
Studio では、StarterPlayer オブジェクトには、ユーザーのカメラに影響を与える複数のプロパティが含まれています。 カメラモード プロパティは、カメラの動作を決定します。
Select StarterPlayer 。
カメラモードを ロックファーストパーソン に変更します。これにより、ユーザーのカメラが頭から離れないようになります。
プレイテストして、最初の人々のカメラがアクションを起操作するかどうかを見ます。
サイドスクローリングカメラを作成する
サイドスクロールビューは、キャラクターの側面に対してカメラを固定された位置に保ち、世界に 2 次元の感覚を与えます。
カメラをスクリプト化する
StarterPlayer を拡張し、StarterPlayerScripts に ローカルスクリプト として名前付けられた CameraManager を追加します。
スクリプトのトップに、次のコードサンプルをコピーして貼り付け、 PlayerService を取得し、新しい変数でローカルユーザーを取得します。
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 を使用してヒューマノイドルートパートを取得し、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 を追加し、ルートの位置に 2 スタッド を追加します。
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 サイドスクロールの外観を与えるには、カメラは直接キャラクターの側面を見る必要があります。カメラの位置を Datatype.Vector3 によって深さを追加して、ユーザーの側面にカメラを配置することで、ユーザービューを 2D サイドスクロールでき
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
カメラを更新
カメラの位置とカメラのターゲットの変数が準備できたので、カメラの位置を更新します。Workspace の CurrentCamera プロパティを通じて、ユーザーのカメラにアクセスできます。カメラには CFrame プロパティがあり、その位置を決定します。
Datatype.CFrame.lookAt() を使用してカメラを更新できます。これは 2つの位置を取り、CFrame.lookAt() を指している第1位置にあります。cameraPosition を作成するためには、1> カメラポジション1> と、4>
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 - レンダリングステップにバインドされる関数。
Class.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 を変更して、同じスクリプトでトップダウンカメラを達成できるかどうかをチェックしてください。設定を調整して結果を得てください!