Kontroluj kamerę 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 ś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.

Pierwszoosobowa kamera
>

Klasyczna kamera Roblox
>

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.

  1. Wybierz StarterPlayer .

  2. Zmień tryb kamery na LockFirstPerson . Zapewnia to, że kamera użytkownika nie odsuwa się od jego głowy.

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

  1. Rozszerz StarterPlayer, a w StarterPlayerScripts dodaj Lokalny skrypt o nazwie CameraManager.

  2. 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.LocalPlayer
  3. Stwó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.LocalPlayer
    local function updateCamera()
    end
  4. W funkcji uzyskaj model postaci użytkownika i sprawdź, czy istnieje, 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
    end
    end

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.

  1. Użyj FindFirstChild, aby uzyskać HumanoidRootPart i sprawdzić, czy istnieje za pomocą 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 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.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

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

  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 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.LocalPlayer
    local camera = workspace.CurrentCamera
    local CAMERA_DEPTH = 64
    local HEIGHT_OFFSET = 2
    camera.FieldOfView = 20
    local 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!