Widok użytkownika na świat jest reprezentowany przez obiekt Camera. Możesz zmienić zachowanie kamery, aby dostosować je do swojego doświadczenia na różne sposoby. Na przykład kamera może reagować na zdarzenia w świecie, takie jak drgania, gdy obok przechodzi potwór, lub być zablokowana po stronie postaci gracza, 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 narracyjnych doświadczeniach, gdzie celem jest, aby użytkownik czuł 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 ich głowy.

Przetestuj grę, aby zobaczyć kamerę pierwszoosobową w akcji.
Utwórz kamerę do przewijania bocznego
Widok przewijania bocznego utrzymuje kamerę w stałej pozycji w stosunku do boku postaci, nadając światu dwuwymiarowy charakter.

Zaimplementuj kamerę w skrypcie
Rozwiń StarterPlayer, a w StarterPlayerScripts dodaj LocalScript o nazwie CameraManager.

Na początku skryptu skopiuj i wklej poniższy przykład kodu, aby uzyskać usługę Graczy, 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 dla kamery.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()endWewnątrz funkcji uzyskaj model postaci użytkownika i sprawdź, czy istnieje, korzystając z instrukcji if.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenendend
Wskaźnika kamery
Wszystkie modele postaci zawierają część o nazwie HumanoidRootPart, którą można wykorzystać do uzyskania pozycji postaci w świecie. To ustawia pozycję, na którą patrzy kamera.
Użyj FindFirstChild, aby uzyskać HumanoidRootPart i sprawdź, czy istnieje, korzystając z 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 znajduje się właściwie 2 studsy poniżej głowy użytkownika. Aby to naprawić, dodaj nowy Vector3 z wysokością 2 studsy do pozycji rdzenia.
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 także potrzebuje pozycji. Aby nadać widokowi użytkownika dwuwymiarowy wygląd w stylu przewijania bocznego, kamera musi patrzeć bezpośrednio na bok postaci. Umieść kamerę po stronie użytkownika, dodając głębokość do samej osi Z pozycji kamery za pomocą 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
Zaktualizuj 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 ona dwie pozycje i tworzy CFrame znajdujące się w pierwszej pozycji, skierowane w stronę drugiej. Użyj CFrame.lookAt(), aby utworzyć CFrame, który jest umiejscowiony na cameraPosition i ukierunkowany na 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
end
Synchronizuj kamerę
Ostatnim krokiem jest powtarzanie tej funkcji, aby utrzymać kamerę w synchronizacji z użytkownikiem. Obraz, który widzi użytkownik, jest ciągle odświeżany. Ułamek sekundy potrzebny na wykonanie wszystkich niezbędnych obliczeń nazywa się etap renderowania.
RunService:BindToRenderStep() ułatwia wykonanie funkcji w każdej klatce, akceptując trzy następujące parametry:
- name - Nazwa tego powiązania, która powinna być unikalna, aby uniknąć kolizji z innymi funkcjami o tej samej nazwie.
- priority - Im wyższa liczba, tym wyższy priorytet. Ta funkcja powinna działać po domyślnym aktualizacji kamery Roblox, więc priorytet ustawiony jest o 1 poziom wyższy niż wewnętrzny RenderPriority kamery.
- function - Funkcja, która ma być powiązana z etapem renderowania.
Użyj RunService:BindToRenderStep(), aby powiązać funkcję updateCamera z etapem 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 polegająca na uzyskaniu pozycji użytkownika i aktualizacji 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, który jest lekko skierowany 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, dodając 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)Zmieniając właściwość kamery FieldOfView, symulujesz powiększanie i pomniejszanie, co może nadać widokowi bardziej spłaszczony wygląd. Spróbuj ustawić ją na wartość 20, aby przybliżyć, a następnie zwiększyć odległość kamery od użytkownika, aby to skompensować.
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 działania kamery, możesz uzyskać zupełnie nowy wygląd swojego doświadczenia. Sprawdź, czy możesz zmienić cameraPosition, aby osiągnąć widok z góry za pomocą tego samego skryptu. Spróbuj dostosować ustawienia, aby uzyskać rezultat, który ci się podoba!