Widok użytkownika na świat jest przedstawiony 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 wydarzenia w świecie, takie jak drżenie, gdy potwór przechodzi, lub zablokowana po stronie użytkownika, jak w side-scroller.
Tworzenie kamery w pierwszej osobie
Kamera w pierwszej osobie to widok, w którym kamera pozostaje zablokowana z głową postaci, co jest bardziej dokładne w rzeczywistym życiu. Jest to powszechne w grach strzelających i doświadczeniach opowieści, w których celem jest uczynienie użytkownika czującym się w świecie.
W Studio obiekt StarterPlayer zawiera wiele właściwości, które wpływają na kamerę użytkownika. Właściwość KameraMode określa, jak zachowuje się kamera.
Wybierz Początkującego gracza .
Zmień tryb kamerze Zablokuj Pierwszą Osobę . Dzięki temu użytkownik nie będzie musiał przesuwać kamery z dala od głowy.
Przeprowadź test, aby zobaczyć pierwszą kamerę w akcji.
Tworzenie kamery poziomowej
Strona przewijająca pozwala kameryjce zachować stałą pozycję w stosunku do strony postaci, co daje światu dwuwymiarowy kształt.
Skryptowanie kamery
Expand StarterPlayer, and in StarterPlayerScripts add a LokalnySkrypt named CameraManager .
Na górze skryptu, skopiuj i wklej następujący kod przykładu, aby uzyskać usługę graczy , a następnie w zmiennej nowej lokalnego użytkownika.
local Players = game:GetService("Players")local player = Players.LocalPlayerUtwórz funkcję nazwę 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, używając if.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenendend
Pokazanie kamerze
Wszystkie modele postaci zawierają część nazyającą się HumanoidRootPart , którą można użyć do uzyskania pozycji postaci w świecie. Ustawia to pozycję kamer.
Użyj FindFirstChild , aby uzyskać część korzenia ludzkiego i sprawdzić, czy istnieje ona używając 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 studs poniżej głowy użytkownika. Aby to naprawić, dodaj nowy Vector3 z wysokością 2 studs 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
Ustawienie pozycji kamery
Kamera również potrzebuje pozycji. Aby nadać użytkownikowi widok 2D side-scrolling, kamera musi spoglądać bezpośrednio na stronie charakteru. Umieść kamerę na stronie użytkownika, dodając głębi tylko do Z axis pozycji kamery przy użyciu 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
Aktualizuj obecną kamerę
Teraz, gdy zmienne pozycja kamery i cel kamery są gotowe, czas na aktualizację pozycji kamery. Możesz uzyskać dostęp do kamery poprzez właściwość CurrentCamera Workspace. Kamera ma właściwość CFrame, aby określić swoją pozycję.
Możesz użyć CFrame.lookAt(), aby aktualizować kamerę. Zajmuje dwa pozycje i tworzy CFrame położony na pierwszej pozycji wskazującej na drugą. Użyj CFrame.lookAt() , aby utworzyć CFrame, który jest położony na cameraPosition i wskazuje na 1> 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 powtórne uruchomienie funkcji, aby utrzymać kamerę w zgodzie z użytkownikiem. Obraz, jaki widzi użytkownik, jest nieustannie odświeżany. Kolejnym podzielnym czasie potrzebnym na wykonanie wszystkich niezbędnych obliczeń nazywa się krok renderowania .
RunService:BindToRenderStep() ułatwia wykonanie funkcji na każdym kadrze, akceptując te trzy parametry:
- name - Nazwa tego wiązania, które powinno być unikalne, aby nie kolidowało z innymi funkcjami tego samego nazwy.
- priority - Im wyższa liczba, tym wyższa priorytet. Ta funkcja powinna zostać wykonana po aktualizacjakamerze domyślnej Roblox, aby priorytet wynosił 1 poziom wyższe niż renderowanie kamerze wewnętrznej.
- function - Funkcja do której należy być związanym z renderowaniem kroku.
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)Z playtestowaniem kodu. Użyj kluczy A i D, aby przenieść swojego postaci z jednego do drugiego.
Tworzenie kamery isometrycznej
Podstawowa struktura uzyskania pozycji użytkownika i aktualizacji pozycji kamery w każdym klatku można dostosować do wielu innych stylów kamer, takich jak kamera isometryczna . Kamera isometryczna to 3D-wiew wskazujący nieco w dół pod kątem wobec postaci użytkownika.
Modyfikowanie pozycji i widoku
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 FieldOfView kamery simuluje zmianę jej skalowania w górę i w dół, co może dać wrażenie płaskiego widoku. Spróbuj ustawić ją na wartość 20, aby zmniejszyć odległość kamery od użytkownika i kompensować.
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 zachowania kamery, możesz osiągnąć całkowicie nowy wygląd dla swojego doświadczenia. Zobacz, czy możesz zmienić cameraPosition , aby uzyskać kamerkę top-down z tym samym skryptem. Spróbuj zmieniać ustawienia, aby uzyskać wynik, który lubisz!