Contrôler la caméra de l'utilisateur

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

La vision de l'utilisateur du monde est représentée par un objet Camera. Vous pouvez modifier le comportement de la caméra pour correspondre à votre expérience à travers une variété de méthodes. Par exemple, la caméra peut réagir aux événements dans le monde, tels que les secousses lorsqu'un monstre marche, ou verrouillées sur le côté du personnage de l'utilisateur, comme dans un side-scroller.

Créer une caméra de première personne

Une caméra à première personne est une vue où la caméra reste verrouillée avec la tête du personnage, ce qui est plus précis pour la vie réelle. Il est courant dans les expériences de tir à la première personne et dans les expériences de histoire où le but est de faire sentir l'utilisateur immersé dans le monde.

Caméra de première personne
Caméra classique Roblox

Dans Studio, l'objet StarterPlayer contient plusieurs propriétés qui affectent la caméra de l'utilisateur. La propriété Mode de caméra détermine comment la caméra se comporte.

  1. Sélectionnez StarterPlayer .

  2. Changez le mode de caméra en verrouiller la première personne . Cela garantit que la caméra de l'utilisateur ne se déplace pas de leur tête.

  3. Testez le jeu pour voir la première caméra de la personne en action.

Créer une caméra côté

Une vue côté défile maintient la caméra à une position fixe par rapport au côté du personnage, ce qui donne au monde un sentiment deux fois dimensionnel.

Scripter la caméra

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

  2. Au sommet du script, copiez et collez le code suivant pour obtenir le service des joueurs , puis dans une nouvelle variable, obtenez l'utilisateur local.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
  3. Créez une fonction appelée updateCamera . Ceci contient la logique nécessaire pour obtenir et définir une nouvelle position pour la caméra.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local function updateCamera()
    end
  4. Dans la fonction, obtenez le modèle de caractère de l'utilisateur et vérifiez s'il existe en utilisant une if statement.


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

Pointer la caméra

Tous les modèles de personnages contiennent une partie nommée HumanoidRootPart , qui peut être utilisée pour obtenir la position du personnage dans le monde. Cela définit la position des points de caméra.

  1. Utilisez FindFirstChild pour obtenir la partie racine humanoïde et vérifier qu'elle existe en utilisant une if statement.


    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 position de la partie racine humanoïde est en fait à 2 studs sous la tête de l'utilisateur. Pour résoudre cela, ajoutez un nouveau Vector3 avec une hauteur de 2 studs à la position de la racine.


    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

Définir la position de la caméra

La caméra a également besoin d'une position. Pour donner à l'utilisateur une vue 2D côté latéral, la caméra doit regarder directement sur le côté du personnage. Placez la caméra sur le côté de l'utilisateur en ajoutant de la profondeur à l'axe Z de la position de la caméra en utilisant un Datatype.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

Mettre à jour la caméra actuelle

Maintenant que les variables pour la position de la caméra et la cible de la caméra sont prêtes, il est temps de mettre à jour la position de la caméra. Vous pouvez accéder à la caméra via la propriété CurrentCamera de Workspace. La caméra a une propriété CFrame pour déterminer sa position.

Vous pouvez utiliser CFrame.lookAt() pour mettre à jour la caméra. Il prend deux positions et crée un CFrame situé à la première position pointée vers la deuxième. Utilisez CFrame.lookAt() pour créer un CFrame qui est positionné à cameraPosition et pointé vers 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

Synchronisation de la caméra

La dernière étape est de exécuter cette fonction à plusieurs reprises pour garder la caméra en sincron avec l'utilisateur. L'image que l'utilisateur voit est en constante rafraîchissement. Le second diviseur qu'il prend pour effectuer tous les calculs nécessaires est appelé le étape de rendu .

RunService:BindToRenderStep() rend il simple d'exécuter une fonction sur chaque cadre en acceptant ces trois paramètres :

  • name - Le nom de ce lien, qui doit être unique pour ne pas se heurter à d'autres fonctions du même nom.
  • priority - Plus le nombre est élevé, plus la priorité est élevée. Cette fonction s'exécute après la mise à jour de la caméra par défaut de Roblox, afin que la priorité soit réglée sur 1 niveau plus élevé que le rendu de la caméra interne.
  • function - La fonction à laquelle le rendu est lié.
  1. Utilisez RunService:BindToRenderStep() pour lier la fonction updateCamera à la étape de rendu.


    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. Testez votre code. Utilisez les touches A et D pour déplacer votre personnage d'un côté à l'autre.

Créer une caméra isométrique

La structure de base pour obtenir la position de l'utilisateur et mettre à jour la position de la caméra chaque cadre peut être adaptée à de nombreux autres styles de caméra, tels qu'une caméra isométrique. Une caméra isométrique est une vue 3D pointée légèrement vers le bas vers le personnage de l'utilisateur.

Modifier la position et la vue

  1. En utilisant le code de l'exemple précédent, modifiez cameraPosition pour ajouter la même quantité à toutes les 3 dimensions.


    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. Changer la propriété FieldOfView de la caméra simule le zoom dans et hors, ce qui peut donner à la vue un look flatter. Essayez de la définir sur une valeur de 20 pour zoomer dans, et augmenter la distance de la caméra de l'utilisateur pour compenser.


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

En changeant la façon dont la caméra se comporte, vous pouvez obtenir un tout nouveau look pour votre expérience. Voyez si vous pouvez modifier le cameraPosition pour obtenir une caméra de haut en bas avec le même script. Essayez de modifier les paramètres pour obtenir un résultat que vous aimez!