Controllo della telecamera dell'utente

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

La visione dell'utente del mondo è rappresentata da un oggetto Camera . Puoi cambiare il comportamento della fotocamera per adattarti alla tua esperienza in varie modalità. Ad esempio, la fotocamera può reagire agli eventi nel Mondo, come quando un mostro cammina di passo, o bloccata sul lato del personaggio utente, come in un side-scroller.

Creazione di una telecamera in prima persona

Una telecamera in prima persona è una vista in cui la telecamera rimane bloccata con la testa del personaggio, il che è più preciso per la vita reale. È comune in esperienze di sparatore e di storia dove l'obiettivo è far sentire l'utente immerso nel Mondo.

Prima persona camera
Fotocamera Roblox classica

In Studio, the StarterPlayer oggetto contiene una serie di proprietà che influenzano la Telecameradell'utente. La proprietà CameraMode determina il modo in cui la fotocamera si comporta.

  1. Seleziona StarterPlayer .

  2. Cambia CameraMode in LockFirstPerson . Ciò garantisce che la fotocamera dell'utente non si muova dalla loro testa.

  3. Prova il gioco per vedere la prima telecamera in azione.

Creazione di una fotocamera a scorrimento laterale

Una vista a scorrimento laterale mantiene la fotocamera in una posizione fissa rispetto alla parte del personaggio, dando al mondo un aspetto a due dimensioni.

Scripting della fotocamera

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

  2. Nella parte superiore dello script, copia e pasta il seguente esempio di codice per ottenere il servizio Players , e poi in una nuova variabile ottieni l'utente locale.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
  3. Crea una funzione chiamata updateCamera . Questo contiene la logica necessaria per ottenere e impostare una nuova posizione per la Telecamera.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local function updateCamera()
    end
  4. Dentro la funzione, ottieni il modello di personaggio dell'utente e controlla se esiste usando una dichiarazione if.


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

Puntare la telecamera

Tutti i modelli di personaggio contengono una parte chiamata HumanoidRootPart , che può essere utilizzata per ottenere la posizione del personaggio nel Mondo. Questo imposta la posizione dei punti della fotocamera.

  1. Usa FindFirstChild per ottenere il HumanoidRootPart e verificare che esiste usando una dichiarazione 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. La posizione della parte della radice umana è in realtà 2 studs sotto la testa dell'utente. Per correggere questo, aggiungi un nuovo Vector3 con una altezza di 2 studs alla posizione della radice.


    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

Impostazione della posizione della telecamera

La fotocamera ha anche una posizione. Per dare alla visuale dell'utente un aspetto 2D side-scrolling, la fotocamera deve guardare direttamente al lato del personaggio. Place la fotocamera sul lato dell'utente aggiungendo profondità al solo Z axis della posizione della Telecamerausando un 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

Aggiorna visuale attuale

Ora che le variabili per la posizione della Telecamerae la posizione della Telecamerasono pronte, è ora di aggiornare la posizione della Telecamera. Puoi accedere alla fotocamera attraverso la proprietà CurrentCamera di Area di lavoro. La fotocamera ha una proprietà CFrame per determinare la sua posizione.

Puoi usare CFrame.lookAt() per aggiornare la Telecamera. Prende due posizioni e crea un CFrame situato alla posizione prima puntato verso la seconda. Usa CFrame.lookAt() per creare un CFrame che è posizionato a cameraPosition e puntato verso 1> rootPosition1> .


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

Sincronizza la telecamera

L'ultimo passo è eseguire questa funzione ripetutamente per mantenere la fotocamera in sincronia con l'utente. L'immagine che l'utente vede si aggiorna costantemente. Il secondo split secondo che si esegue per eseguire tutti i calcoli necessari è chiamato il passo di rendering .

RunService:BindToRenderStep() rende semplice eseguire una funzione su ogni frame accettando questi tre parametri:

  • name - Il nome di questo binding, che dovrebbe essere unico in modo che non si scontrino con altre funzioni dello stesso nome.
  • priority - Più il numero è alto, maggiore è la priorità. Questa funzione dovrebbe essere eseguita dopo l'Aggiornarmentodella fotocamera predefinito di Roblox, in modo che la priorità sia impostata al livello 1 rispetto alla rendering priority interna della Telecamera.
  • function - La funzione per essere legata al passaggio di rendering.
  1. Usa RunService:BindToRenderStep() per associare la funzione updateCamera alla fase di rendering.


    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. Prova il tuo codice. Usa le chiavi A e D per spostare il tuo personaggio da un lato all'altro.

Creazione di una telecamera isometrica

La struttura di base per ottenere la posizione dell'utente e aggiornare la posizione della Telecameraogni frame può essere adattato a molti altri stili di fotocamera, come una telecamera isometrica . Un'isometrica camera è una vista 3D che punta leggermente verso l'angolo fisso verso il personaggio utente.

Modifica posizione e visuale

  1. Usando il codice dall'esempio precedente, modifica cameraPosition per aggiungere la stessa quantità a tutte le 3 dimensioni.


    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. Cambiare la proprietà FieldOfView della Telecamerasimula lo zoom in e out, che può dare alla visuale un aspetto appena sufficiente. Prova a impostarlo su un valore di 20 per ingrandire, e aumenta la distanza della Telecameradall'utente per compensare.


    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()

Cambiando il modo in cui la fotocamera si comporta, puoi ottenere un nuovo aspetto per la tua esperienza. Vedere se puoi modificare il cameraPosition per ottenere una fotocamera a doppia visione con lo stesso script. Prova a modificare le impostazioni per ottenere un risultato che ti piace!