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 du monde de l'utilisateur est représentée par un objet Camera.Vous pouvez modifier le comportement de la caméra pour correspondre à votre expérience de différentes manières.Par exemple, la caméra peut réagir aux événements dans le monde, comme le tremblement lorsqu'un monstre passe, ou être verrouillée sur le côté du personnage utilisateur, comme dans un défileur latéral.

Créer une caméra à la première personne

Une caméra à la première personne est un point de vue où la caméra reste verrouillée avec la tête du personnage, ce qui est plus précis dans la vie réelle.C'est courant dans les expériences de tireur et de récit où l'objectif est de faire en sorte que l'utilisateur se sente immersé dans le monde.

Caméra de première personne
>

Caméra Roblox classique
>

Dans Studio, l'objet StarterPlayer contient un certain nombre de propriétés qui affectent la caméra de l'utilisateur.La propriété Mode de caméra détermine la façon dont 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 loin de sa tête.

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

Créer une caméra à défilement latéral

Une vue en défilement latéral maintient la caméra à une position fixe par rapport au côté du personnage, ce qui donne au monde un sentiment de deux dimensions.

Script la caméra

  1. Développez StarterPlayer, et dans StarterPlayerScripts ajoutez un LocalScript nommé CameraManager.

  2. Au sommet du script, copiez et collez l'exemple de 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. Elle 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. À l'intérieur de la fonction, obtenez le modèle de caractère de l'utilisateur et vérifiez s'il existe en utilisant une déclaration if.


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

Pointe la caméra

Tous les modèles de caractère contiennent une partie nommée partie racine humanoïde , qui peut être utilisée pour obtenir la position du personnage dans le monde.Cela définit la position auxquels les points de la caméra se réfèrent.

  1. Utilisez FindFirstChild pour obtenir la partie racine humanoïde et vérifier qu'elle existe en utilisant une déclaration 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 position de la partie racine humanoïde est en fait à 2 studs au-dessous de la tête de l'utilisateur.Pour corriger cela, ajoutez un nouveau Vector3 avec une hauteur de 2 pointes à 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 à la vue de l'utilisateur un aspect de défilement latéral en 2D, la caméra doit regarder directement du côté du personnage.Placez la caméra à côté de l'utilisateur en ajoutant de la profondeur à seulement l'axe Z de la position de la caméra en utilisant 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

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 de l'utilisateur via la propriété CurrentCamera de l'espace de travail.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é vers la deuxième.Utilisez CFrame.lookAt() pour créer un cadre C qui est positionné à cameraPosition et pointé vers 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

Synchroniser la caméra

La dernière étape consiste à exécuter cette fonction plusieurs fois pour garder la caméra en phase avec l'utilisateur.L'image que voit l'utilisateur se rafraîchit constamment.La seconde d'écart nécessaire pour faire tous les calculs nécessaires s'appelle l'étape de rendu **** .

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

  • name - Le nom de cette interface, 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 doit s'exécuter après la mise à jour par défaut de la caméra de Roblox, la priorité étant donc définie à 1 niveau supérieur de la priorité de rendu de la caméra interne.
  • function - La fonction à lier à l'étape de rendu.
  1. Utilisez RunService:BindToRenderStep() pour lier la fonction updateCamera à l'é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 qui pointe légèrement vers le bas à un angle fixe vers le personnage utilisateur.

Modifier la position et la voir

  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é de la caméra FieldOfView simule le zoom avant et arrière, ce qui peut donner à la vue un aspect plus plat.Essayez de le définir sur une valeur de 20 pour zoomer et d'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.Vérifiez si vous pouvez modifier le cameraPosition pour obtenir une caméra en hauteur avec le même script.Essayez de modifier les paramètres pour obtenir un résultat que vous aimez !