Kontrolowanie kamery użytkownika

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

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.

Kamera w trybie pierwszej osoby
Klasyczna kamera Robloxowa

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.

  1. Wybierz Początkującego gracza .

  2. Zmień tryb kamerze Zablokuj Pierwszą Osobę . Dzięki temu użytkownik nie będzie musiał przesuwać kamery z dala od głowy.

  3. 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

  1. Expand StarterPlayer, and in StarterPlayerScripts add a LokalnySkrypt named CameraManager .

  2. 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.LocalPlayer
  3. Utwó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.LocalPlayer
    local function updateCamera()
    end
  4. Wewnątrz funkcji uzyskaj model postaci użytkownika i sprawdź, czy istnieje, używając if.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local function updateCamera()
    local character = player.Character
    if character then
    end
    end

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.

  1. 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.LocalPlayer
    local function updateCamera()
    local character = player.Character
    if character then
    local root = character:FindFirstChild("HumanoidRootPart")
    if root then
    end
    end
    end
  2. Pozycja 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.LocalPlayer
    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)
    end
    end
    end

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.
  1. 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.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("SidescrollingCamera", Enum.RenderPriority.Camera.Value + 1, updateCamera)
  2. 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

  1. 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.Character
    if character then
    local root = character:FindFirstChild("HumanoidRootPart")
    if root then
    local 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)
    end
    end
    end
    RunService:BindToRenderStep("IsometricCamera", Enum.RenderPriority.Camera.Value + 1, updateCamera)
  2. 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.LocalPlayer
    local camera = workspace.CurrentCamera
    local CAMERA_DEPTH = 64
    local HEIGHT_OFFSET = 2
    camera.FieldOfView = 20
    local 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!