Widok użytkownika świata jest reprezentowany przez obiekt Camera.Możesz zmienić zachowanie kamery, aby dopasować je do swojego doświadczenia na wiele sposobów.Na przykład kamera może reagować na wydarzenia na świecie, takie jak drżenie, gdy przechodzi obok niej potwór, lub zablokowana po bokach postaci użytkownika, jak w przypadku side-scrollera.
Stwórz kamerę pierwszoosobową
Kamera w pierwszej osobie to widok, w którym kamera pozostaje zamknięta z głową postaci, co jest bardziej dokładne w przypadku prawdziwego życia.Jest to powszechne w doświadczeniach strzelców i historii, w których celem jest sprawienie, że użytkownik poczuje 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ść tryb kamery określa, jak kamera się zachowuje.
Wybierz StarterPlayer .
Zmień tryb kamery na LockFirstPerson . Zapewnia to, że kamera użytkownika nie odsuwa się od jego głowy.
Przetestuj, aby zobaczyć pierwszą osobową kamerę w akcji.
Stwórz kamerę przewijającą po bokach
Widok przewijany po bokach utrzymuje kamerę w stałej pozycji względem boku postaci, dając światu dwuwymiarowe odczucie.
Skryptuj kamerę
Rozszerz StarterPlayer, a w StarterPlayerScripts dodaj Lokalny skrypt o nazwie CameraManager.
Na górze skryptu skopiuj i wklej następujący przykład kodu, aby uzyskać usługę Graczy , a następnie w nowej zmienne uzyskaj lokalnego użytkownika.
local Players = game:GetService("Players")local player = Players.LocalPlayerStwórz funkcję o nazwie updateCamera. Zawiera ona logikę potrzebną do uzyskania i ustawienia nowej pozycji dla kamery.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()endW funkcji uzyskaj model postaci użytkownika i sprawdź, czy istnieje, używając oświadczenia if.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenendend
Skieruj kamerę
Wszystkie modele postaci zawierają część o nazwie HumanoidRootPart , którą można użyć do uzyskania pozycji postaci w świecie.To ustawia pozycję punktów kamery.
Użyj FindFirstChild, aby uzyskać HumanoidRootPart i sprawdzić, czy istnieje za pomocą oświadczenia 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 o 2 szpilki poniżej głowy użytkownika.Aby to naprawić, dodaj nowy Vector3 z wysokością 2 szpilki do pozycji korzenia.
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 potrzebuje również pozycji.Aby dać użytkownikowi widok 2D bocznego przewijania, kamera musi patrzeć bezpośrednio na bok postaci.Umieść kamerę obok użytkownika, dodając głębi tylko do osi Z pozycji kamery za pomocą >.
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
Aktualizacja obecnej kamery
Teraz, gdy zmienne dla pozycji kamery i celu kamery są gotowe, nadszedł czas na aktualizację pozycji kamery.Możesz uzyskać dostęp do kamery użytkownika za pomocą właściwości CurrentCamera Przestrzeni roboczej.Kamera ma właściwość CFrame w celu określenia jej pozycji.
Możesz użyć CFrame.lookAt() , aby zaktualizować kamerę.Wymaga dwóch pozycji i tworzy ramkę CFrame położoną na pierwszej pozycji wskazaną na drugą.Użyj CFrame.lookAt(), aby stworzyć CFrame, który jest umieszczony na cameraPosition i wskazuje 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
Zsynchronizuj kamerę
Ostatnim krokiem jest uruchomienie tej funkcji wielokrotnie, aby utrzymać kamerę w zgodności z użytkownikiem.Obraz, który widzi użytkownik, jest stale odświeżany.Dziesiątka sekund, jakie zajmuje wykonanie wszystkich niezbędnych obliczeń, nazywa się stopniem renderowania .
RunService:BindToRenderStep() ułatwia wykonanie funkcji na każdym ramie, akceptując te trzy parametry:
- name - Nazwa tego wiązania, która powinna być unikalna, aby nie kolidowała z innymi funkcjami o tej samej nazwie.
- priority - Im wyższa jest liczba, tym wyższy jest priorytet.Funkcja ta powinna uruchomić się po aktualizacjadomyślnej kamery Roblox, więc priorytet jest ustawiony o 1 poziom wyższy niż priorytet renderowania wewnętrznej kamery.
- function - Funkcja, do której należy przypiąć krok renderowania.
Użyj RunService:BindToRenderStep(), aby wią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 kluczy A i D, aby przenieść postać z boku na bok.
Stwórz kamerę isometryczną
Podstawowa struktura uzyskiwania pozycji użytkownika i aktualizowania pozycji kamery w każdym ramie może być dostosowana do wielu innych stylów kamery, takich jak kamera isometryczna .Kamera isometryczna to widok 3D wskazujący nieco w dół pod kątem w stosunku do postaci użytkownika.
Dostosuj pozycję i widok
Używając kodu z poprzedniego przykładu, zmodyfikuj cameraPosition, aby dodać tę samą ilość 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 kamery FieldOfView symuluje jej powiększanie i pomniejszanie, co może dać widokowi bardziej płaski wygląd.Spróbuj ustawić go na wartość 20 , aby przybliżyć, i zwiększ dystans kamery od użytkownika, aby 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 działania kamery, możesz osiągnąć zupełnie nowy wygląd dla swojego doświadczenia.Zobacz, czy możesz zmienić cameraPosition, aby uzyskać górną kamerę z tym samym skryptem.Spróbuj zmodyfikować ustawienia, aby uzyskać wynik, który lubisz!