Điều khiển máy ảnh của người dùng

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Cái nhìn của người dùng về thế giới được đại diện bởi một đối tượng Camera.Bạn có thể thay đổi hành vi của camera phù hợp với trải nghiệm của bạn theo nhiều cách khác nhau.Ví dụ, máy ảnh có thể phản ứng với các sự kiện trên thế giới, chẳng hạn như rung khi một con quái vật đi qua, hoặc bị khóa vào bên cạnh nhân vật người dùng, như trong một side-scroller.

Tạo một máy ảnh người thứ nhất

Một máy ảnh người thứ nhất là một góc nhìn mà máy ảnh được giữ khóa với đầu của nhân vật, mà là chính xác hơn với cuộc sống thực.Nó phổ biến trong các trải nghiệm bắn súng và câu chuyện nơi mục tiêu là làm cho người dùng cảm thấy chìm đắm vào thế giới.

Máy ảnh người thứ nhất
>

Máy ảnh Roblox cổ điển
>

Trong Studio, đối tượng StarterPlayer bao gồm một số thuộc tính ảnh hưởng đến camera của người dùng.Thuộc tính CameraMode xác định cách camera hoạt động.

  1. Chọn Người chơi khởi động .

  2. Thay đổi CameraMode thành LockFirstPerson . Điều này đảm bảo camera của người dùng không di chuyển ra khỏi đầu họ.

  3. Thử nghiệm để xem camera người đầu tiên trong hành động.

Tạo một máy ảnh cuộn bên

Một cửa sổ cuộn bên giữ camera ở một vị trí cố định so với bên của nhân vật, mang lại cho thế giới cảm giác hai chiều.

Lập trình máy ảnh

  1. Mở rộng StarterPlayer, và trong StarterPlayerScripts thêm một LocalScript có tên là CameraManager.

  2. Ở đầu của kịch bản, sao chép và dán mẫu mã sau đây để có được dịch vụ người chơi , và sau đó trong một biến mới lấy người dùng địa phương.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
  3. Tạo một chức năng có tên là updateCamera. Nó giữ logic cần thiết để lấy và đặt một vị trí mới cho máy ảnh.


    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local function updateCamera()
    end
  4. Bên trong chức năng, lấy mô hình nhân vật của người dùng và kiểm tra xem nó có tồn tại bằng cách sử dụng một câu lệnh if.


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

Chỉ vào máy ảnh

Tất cả các mô hình nhân vật đều có một phần tên là HumanoidRootPart , có thể được sử dụng để lấy vị trí của nhân vật trong thế giới.Điều này đặt vị trí mà điểm máy ảnh hướng tới.

  1. Sử dụng FindFirstChild để lấy HumanoidRootPart và kiểm tra nó có tồn tại bằng cách sử dụng một câu lệnh 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. Vị trí của HumanoidRootPart thực sự là 2 đinh tán dưới đầu của người dùng.Để sửa lỗi này, thêm một cái mới Vector3 với chiều cao 2 đinh tán vào vị trí của rễ.


    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

Đặt vị trí máy ảnh

Máy ảnh cũng cần một vị trí.Để cho người dùng có cái nhìn 2D về cuộn bên, camera cần nhìn trực tiếp vào bên cạnh của nhân vật.Đặt máy ảnh bên cạnh người dùng bằng cách thêm chiều sâu cho chỉ trục Z của vị trí máy ảnh bằng một 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

Cập nhật Camera hiện tại

Bây giờ khi các biến cho vị trí của camera và mục tiêu của camera đã sẵn sàng, đã đến lúc cập nhật vị trí của camera.Bạn có thể truy cập máy ảnh của người dùng thông qua thuộc tính CurrentCamera của Workspace.Camera có một thuộc tính CFrame để xác định vị trí của nó.

Bạn có thể sử dụng CFrame.lookAt() để cập nhật máy ảnh.Nó cần hai vị trí và tạo ra một CFrame ở vị trí đầu tiên chỉ về phía thứ hai.Sử dụng CFrame.lookAt() để tạo một CFrame được đặt tại cameraPosition và chỉ vào 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

Sao lưu máy ảnh

Bước cuối cùng là chạy chức năng này lặp lại để giữ cho máy ảnh đồng bộ với người dùng.Hình ảnh mà người dùng nhìn thấy liên tục làm mới.Giây chia nhỏ cần thiết để thực hiện tất cả các phép tính cần thiết được gọi là bước render .

RunService:BindToRenderStep() làm cho việc thực hiện chức năng trên mỗi khung trở nên đơn giản bằng cách chấp nhận ba tham số này:

  • name - Tên của kết nối này, nên duy nhất để không xung đột với các chức năng khác cùng tên.
  • priority - Càng có số cao, ưu tiên càng cao.Chức năng này nên chạy sau khi cập nhật camera mặc định của Roblox, vì vậy ưu tiên được đặt ở cấp độ 1 cao hơn so với RenderPriority của camera nội bộ.
  • function - Chức năng được gắn vào bước render.
  1. Sử dụng RunService:BindToRenderStep() để gắn chức năng updateCamera vào bước render.


    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. Thử nghiệm mã của bạn. Sử dụng các phím AD để di chuyển nhân vật của bạn từ bên này sang bên kia.

Tạo một máy ảnh isometric

Cấu trúc cơ bản của việc nhận vị trí của người dùng và cập nhật vị trí của máy ảnh mỗi khung có thể được thích ứng với nhiều kiểu máy ảnh khác, chẳng hạn như một máy ảnh isometric .Một máy ảnh isometric là một cái nhìn 3D hướng xuống một góc cố định về phía nhân vật người dùng.

Sửa vị trí và xem

  1. Sử dụng mã từ ví dụ trước, sửa cameraPosition để thêm cùng một số lượng cho tất cả 3 chiều.


    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. Thay đổi thuộc tính FieldOfView của máy ảnh mô phỏng việc phóng to và thu nhỏ, có thể làm cho khung nhìn trông phẳng hơn.Thử đặt nó thành giá trị 20 để phóng to, và tăng khoảng cách của máy ảnh từ người dùng để bù đắp.


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

Bằng cách thay đổi cách camera hoạt động, bạn có thể đạt được một diện mạo hoàn toàn mới cho trải nghiệm của mình.Xem xem bạn có thể thay đổi cameraPosition để đạt được một máy ảnh ở trên cùng với cùng một kịch bản.Hãy thử thay đổi cài đặt để có được kết quả bạn thích!