Widok użytkownika na świat jest reprezentowany przez obiekt Camera. Możesz zmienić zachowanie kamery, aby dostosować je do swojej gry na różne sposoby. Na przykład, kamera może reagować na wydarzenia w świecie, takie jak drżenie, gdy obok przechodzi potwór, lub być zablokowana z boku postaci użytkownika, jak w grze typu side-scroller.
Utwórz kamerę pierwszoosobową
Kamera pierwszoosobowa to widok, w którym kamera pozostaje zablokowana z głową postaci, co jest bardziej zgodne z rzeczywistością. Jest to powszechne w grach strzelankach i fabularnych, gdzie celem jest sprawienie, aby użytkownik poczuł się zanurzony w świecie.


W Studio obiekt StarterPlayer zawiera szereg właściwości, które wpływają na kamerę użytkownika. Właściwość CameraMode określa, jak zachowuje się kamera.
Wybierz StarterPlayer.

Zmień CameraMode na LockFirstPerson. To zapewnia, że kamera użytkownika nie oddala się od jego głowy.

Przetestuj grę, aby zobaczyć kamerę pierwszoosobową w akcji.
Utwórz kamerę przewijającą z boku
Widok przewijający z boku utrzymuje kamerę w stałej pozycji względem boku postaci, nadając światu dwuwymiarowy charakter.

Zapisz skrypt kamery
Rozwiń StarterPlayer, a w StarterPlayerScripts dodaj LocalScript o nazwie CameraManager.

Na początku skryptu skopiuj i wklej następujący fragment kodu, aby uzyskać usługę Players, a następnie w nowej zmiennej uzyskaj lokalnego użytkownika.
local Players = game:GetService("Players")local player = Players.LocalPlayerUtwórz funkcję o nazwie updateCamera. Ta funkcja zawiera logikę potrzebną do uzyskania i ustawienia nowej pozycji kamery.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()endWewnątrz funkcji uzyskaj model postaci użytkownika i sprawdź, czy istnieje, używając instrukcji if.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenendend
Wskazanie kamery
Wszystkie modele postaci zawierają część o nazwie HumanoidRootPart, która może być używana do uzyskania pozycji postaci w świecie. To ustawia pozycję, na którą kamera patrzy.
Użyj FindFirstChild, aby uzyskać HumanoidRootPart i sprawdź, czy istnieje, używając instrukcji if.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenendendendPozycja HumanoidRootPart jest w rzeczywistości 2 study poniżej głowy użytkownika. Aby to naprawić, dodaj nowy Vector3 z wysokością 2 study do pozycji root.
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
Ustaw pozycję kamery
Kamera również potrzebuje pozycji. Aby nadać widokowi użytkownika dwuwymiarowy wygląd przewijania z boku, kamera musi patrzeć bezpośrednio na bok postaci. Umieść kamerę z boku użytkownika, dodając głębokość tylko do osi Z pozycji kamery, używając 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
endZaktualizuj CurrentCamera
Teraz, gdy zmienne dla pozycji kamery i celu kamery są gotowe, czas zaktualizować pozycję kamery. Możesz uzyskać dostęp do kamery użytkownika przez właściwość CurrentCamera w Workspace. Kamera ma właściwość CFrame, aby określić swoją pozycję.
Możesz użyć CFrame.lookAt(), aby zaktualizować kamerę. Przyjmuje dwie pozycje i tworzy CFrame znajdujący się w pierwszej pozycji, skierowany w stronę drugiej. Użyj CFrame.lookAt(), aby stworzyć CFrame, który jest umiejscowiony w cameraPosition i skierowany w stronę rootPosition.
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
endSynchronizuj kamerę
Ostatnim krokiem jest wielokrotne uruchamianie tej funkcji, aby utrzymać kamerę w synchronizacji z użytkownikiem. Obraz, który widzi użytkownik, jest stale odświeżany. Ułamek sekundy, który zajmuje wykonanie wszystkich niezbędnych obliczeń, nazywa się render step.
RunService:BindToRenderStep() ułatwia wykonanie funkcji w każdej klatce, akceptując te trzy parametry:
- name - Nazwa tego powiązania, która powinna być unikalna, aby nie kolidowała z innymi funkcjami o tej samej nazwie.
- priority - Im wyższa liczba, tym wyższy priorytet. Ta funkcja powinna działać po domyślnej aktualizacji kamery Roblox, więc priorytet jest ustawiony na 1 poziom wyżej niż RenderPriority wewnętrznej kamery.
- function - Funkcja, która ma być powiązana z krokiem renderowania.
Użyj RunService:BindToRenderStep(), aby powiązać funkcję updateCamera z krokiem renderowania.
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)Przetestuj swój kod. Użyj klawiszy A i D, aby poruszać swoją postacią z boku na bok.
Utwórz kamerę izometryczną
Podstawowa struktura uzyskiwania pozycji użytkownika i aktualizowania pozycji kamery w każdej klatce może być dostosowana do wielu innych stylów kamer, takich jak kamera izometryczna. Kamera izometryczna to widok 3D skierowany lekko w dół pod stałym kątem w stronę postaci użytkownika.

Zmodyfikuj pozycję i widok
Używając kodu z poprzedniego przykładu, zmodyfikuj cameraPosition, aby dodać tę samą wartość do wszystkich 3 wymiarów.
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)Zmiana właściwości FieldOfView kamery symuluje przybliżanie i oddalanie, co może nadać widokowi płaski wygląd. Spróbuj ustawić ją na wartość 20, aby przybliżyć, a następnie zwiększ odległość kamery od użytkownika, aby to zrekompensować.
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()
Zmieniając sposób, w jaki zachowuje się kamera, możesz osiągnąć zupełnie nowy wygląd dla swojej gry. Sprawdź, czy możesz zmienić cameraPosition, aby uzyskać kamerę z widokiem z góry, używając tego samego skryptu. Spróbuj dostosować ustawienia, aby uzyskać rezultat, który Ci się podoba!