Samouczki dla średnio zaawansowanych

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

Kamera Pierwszoosobowa
Klasyczna Kamera Roblox

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.

  1. Wybierz StarterPlayer.

    alt

  2. Zmień CameraMode na LockFirstPerson. To zapewnia, że kamera użytkownika nie oddala się od ich głowy.

    alt

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

alt

Zaimplementuj kamerę w skrypcie

  1. Rozwiń StarterPlayer, a w StarterPlayerScripts dodaj LocalScript o nazwie CameraManager.

    alt

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


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

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.

  1. Użyj FindFirstChild, aby uzyskać HumanoidRootPart i sprawdź, czy istnieje, korzystając z instrukcji 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 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.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 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.
  1. 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.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 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.

alt

Zmodyfikuj pozycję i widok

  1. Używając kodu z poprzedniego przykładu, zmodyfikuj cameraPosition, dodając tę samą wartość do wszystkich 3 wymiarów.

    alt


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

©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.