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.
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.
Seleziona StarterPlayer .
Cambia CameraMode in LockFirstPerson . Ciò garantisce che la fotocamera dell'utente non si muova dalla loro testa.
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
Expand StarterPlayer, and in StarterPlayerScripts add a Script locale named CameraManager .
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.LocalPlayerCrea 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.LocalPlayerlocal function updateCamera()endDentro 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.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenendend
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.
Usa FindFirstChild per ottenere il HumanoidRootPart e verificare che esiste usando una dichiarazione if.
local Players = game:GetService("Players")local player = Players.LocalPlayerlocal function updateCamera()local character = player.Characterif character thenlocal root = character:FindFirstChild("HumanoidRootPart")if root thenendendendLa 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.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
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.
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.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)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
Usando il codice dall'esempio precedente, modifica cameraPosition per aggiungere la stessa quantità a tutte le 3 dimensioni.
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)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.LocalPlayerlocal camera = workspace.CurrentCameralocal CAMERA_DEPTH = 64local HEIGHT_OFFSET = 2camera.FieldOfView = 20local 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!