Hiện tại, một phần lớn của thông tin trò chơi đang ở Cửa sổ Thoát, không được hiển thị cho người chơi. Vì vậy, người chơi có thể được thông báo về những gì đang xảy ra trong trò chơi, bạn sẽ tạo một giao diện người dùng thông thường (GUI) và lập trình nó.
Hiển thị thông tin với một GUI
Đối với trò chơi này, một nhãn văn bản sẽ hiển thị tình trạng trò chơi hiện tại cũng như số lượng người chơi còn lại và thời gian.
Cài đặt GUI
Đầu tiên, tạo một Screen GUI đối tượng để giữ các thành phần chữ khác nhau. Khi người chơi di chuyển máy ảnh, screen GUI sẽ ở cùng một vị trí trên màn hình.
Để đảm bảo tất cả người chơi thấy cùng một hiển thị, hãy đặt GUI vào thư mục StarterGui . Khi bắt đầu trò chơi, thư mục này sẽ được sao chép cho tất cả người chơi.
Trong thư mục StarterGui, tạo một ScreenGUI mới. Sau đó trong ScreenGUI, thêm một TextLabel mới tên là StatusText.
Để di chuyển nhãn, trong Explorer, hãy chọn StatusText. Sau đó, trong view game, kéo nhãn nơi bạn muốn nó. Số của bạn có thể khác với video. Thẻ cũng có thể được thay đổi kích thước bằng cách sử dụng các điểm dựa trên góc.
Lập trình GUI
Để phản ánh các thay đổi trong trò chơi, các tập lệnh sẽ cần phải cập nhật các thành phần GUI. Ví ví dụ / trường hợp, trạng thái trò chơi, dù là một hiệp đấu hoạt động hay một hiệp đấu đang diễn ra, sẽ được lưu trong một giá trị chuỗi và được cập nhật bằng các tập lệnh địa phương.
Cài đặt Script
Cuộn sách StatusDisplaysẽ được sử dụng để cập nhật GUI của người chơi mỗi khi trạng thái trò chơi thay đổi.
Trong ReplicatedStorage , tạo một thư mục tên là DisplayValues. Trong thư mục đó, thêm một giá trị chuỗi tên là Status. Để kiểm tra giá trị sau đó, cho nó một giá trị tạm thời, như "Welcome to the Battle!".
Trong StarterGui > ScreenGUI > Status, thêm một mô-đun mới tên là StatusDisplay. Các mô-đun ảnh hưởng đến GUI thường được phụ huynh cho mô-đun đó.
Mở StatusDisplay và định nghĩa các biến sau đây cho theo dõi:
Dịch vụ lưu trữ ReplicatedStorage
Mục DisplayValues
Giá trị dòng chỉnh thể
TextLabel - sử dụng script.Parent .
local ReplicatedStorage = game:GetService("ReplicatedStorage")local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")local textLabel = script.Parent
Thay đổi nhãn chữ
Để thay đổi văn bản trong nhãn, hãy sử dụng một sự kiện Đã thay đổi để mỗi khi chuỗi Tình trạng được thay đổi bởi một script khác, thì văn bản trong nhãn sẽ được cập nhật.
Lập một chức năng mới có tên là updateText() . Trong chức năng đó, set Text property of textLabel to status.Value .
local textLabel = script.Parentlocal function updateText()textLabel.Text = status.ValueendKết nối chức năng với sự kiện đã thay đổi.
local function updateText()textLabel.Text = status.Valueendstatus.Changed:Connect(updateText)Vì vậy, người chơi thấy tình trạng mới nhất đến khi bắt đầu trò chơi, chạy updateText() ở cuối script.
local function updateText()textLabel.Text = status.Valueendstatus.Changed:Connect(updateText)updateText()Chạy trò chơi và xác nhận rằng bạn thấy giá trị tạm thời trong hiển thị.
Tạo Quản Lý Hiển Thị
Trong một trò chơi, nhãn chữ cần phải lấy thông tin từ GameManager, MatchManager và có thể là những người khác. Vì vậy, những người khác này có thể cập nhật nhãn chữ khi cần thiết, tạo một mô-đun tên là DisplayManager.
Cài đặt Script
Vì DisplayManager cần phải truyền đạt với các script khác, nó sẽ là một mô-đun script.
Trong ServerStorage > ModuleScripts , tạo một script modul mới tên là DisplayManager. Đổi tên bảng modul để phù hợp với tên script.
Thêm biến địa phương cho các điều theo dõi: Replicated Storage, DisplayValues夹, Status.
local DisplayManager = {}-- Dịch Vụlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- Hiển thị giá trị được sử dụng để cập nhật GUI Người chơilocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")-- Hàm chức năng địa phương-- Hàm chức năngreturn DisplayManagerTạo một chức năng mới tên là updateStatus() để cập nhật giá trị trong trạng thái. Các script khác sẽ có thể gọi chức năng này.
-- Hàm chức năng địa phương-- Hàm chức năngfunction DisplayManager.updateStatus(newStatus)status.Value = newStatusend
Cập nhật Tình trạng Văn bản
Với màn hình quản lý được cài đặt, nó có thể được sử dụng trong các script khác để cập nhật nhãn văn bản GUI. Là thông điện thứ nhất trong GUI, hiển thị khởi đầu và kết thúc của gián đoạn qua màn hình GameManager.
Trong ServerScriptService > GameManager, tạo một biến tên là displayManager và yêu cầu module DisplayManager ở ServerStorage.
-- Dịch Vụlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Script Mô-đunlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local roundManager = require(moduleScripts:WaitForChild("RoundManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))Là dòng đầu tiên sau khi thực hiện while true do statement , call displayManager > updateStatus() và truyền một thông điệp về việc chờ người chơi.
-- Sự kiệnlocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")while true dodisplayManager.updateStatus("Waiting for Players")repeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayerstask.wait(gameSettings.transitionTime)matchManager.prepareGame()matchEnd.Event:Wait()endSau khi kết thúc vòng lặp lặp lại cho giải laoim, gọi updateStatus() và truyền một chuỗi báo cáo cho match đang bắt đầu. Vì bạn sẽ đang kiểm tra với GUI, xóa hai dòng in cho ghi nhớ sự bắt đầu và kết thúc của giải laoim.
while true dodisplayManager.updateStatus("Waiting for Players")repeattask.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersdisplayManager.updateStatus("Get ready!")task.wait(gameSettings.transitionTime)matchManager.prepareGame()matchEnd.Event:Wait()endThử nghiệm trò chơi với và wo của bạn. Tin nhắn nên đọc như theo dõi:
- Without the minimum players: "Waiting for Players" .
- Với những người chơi tối thiểu: "Get ready" .
Mẹo dịch vụ
Tại thời điểm này, nếu nhãn chữ không hiển thị thông tin nhắnđầu tiên hoặc vẫn hiển thị "Label", hãy thử một trong những lựa chọn dưới đây.
- Hãy đảm bảo trong các tập lệnh local StatusDisplay rằng updateText() được gọi ở cuối cùng của tập lệnh. Điều này đảm bảo rằng người chơi nhận được thông tin nhắnmới nhất.
- Kiểm tra dữ liệu tình trạng được đặt trong ReplicatedStorage. Vì tính độc đáo của mối quan hệ client-server, nếu nó ở trong ServerStorage, một script local sẽ không thể tìm thấy nó.
Hiển thị Tình trạng trận đấu
Trong một tương thích, GUI sẽ hiển thị hai số: số lượng người chơi còn lại và thời gian. Khi các số này thay đổi, nhãn văn bản sẽ thay đổi cũng.
Tạo giá trị và chức năng
IntValues sẽ được sử dụng để lưu số lượng người chơi và thời gian còn lại.
Trong ReplicatedStorage > DisplayValues, tạo hai IntValues tên PlayersLeft và TimeLeft.
Trong DisplayManager, thêm biến để lưu giữ giá trị người chơi đã để và thời gian đã để.
local DisplayManager = {}-- Dịch Vụlocal ReplicatedStorage = game:GetService("ReplicatedStorage")-- Hiển thị giá trị được sử dụng để cập nhật GUI Người chơilocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")local playersLeft = displayValues:WaitForChild("PlayersLeft")local timeLeft = displayValues:WaitForChild("TimeLeft")Tạo một chức năng địa phương có tên là updateMatchStatus() . Sau đó, thiết lập giá trị trạng thái để hiển thị số lượng người chơi còn lại và thời gian còn lại.
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local status = displayValues:WaitForChild("Status")local playersLeft = displayValues:WaitForChild("PlayersLeft")local timeLeft = displayValues:WaitForChild("TimeLeft")-- Hàm chức năng địa phươnglocal function updateRoundStatus()status.Value = "Players Left: " .. playersLeft.Value .. " / Time Left: " .. timeLeft.ValueendĐối với cả hai biến IntValue , kết nối updateRoundStatus() với sự kiện đã thay đổi.
-- Hàm chức năngfunction DisplayManager.updateStatus(newStatus)status.Value = newStatusendplayersLeft.Changed:Connect(updateRoundStatus)timeLeft.Changed:Connect(updateRoundStatus)return DisplayManager
Hiển thị Người chơi
Tiếp theo, thêm mã để hiển thị số lượng người chơi ở đầu một trò chơi. Các bài học sau sẽ cập nhật giá trị PlayerLeft khi người chơi được loại bỏ khỏi trò chơi.
Trong PlayerManager, thêm biến đổi địa phương cho dịch vụ ReplicatedStorage, thư mục DisplayValues và PlayersLeft IntValue.
local PlayerManager = {}-- Dịch Vụlocal Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Biến maplocal lobbySpawn = workspace.Lobby.StartSpawnlocal arenaMap = workspace.Arenalocal spawnLocations = arenaMap.SpawnLocations-- Giá trịlocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local playersLeft = displayValues:WaitForChild("PlayersLeft")Hiển thị số lượng người chơi bắt đầu bằng cách đặt giá trị của playersLeft lên kích thước của hàng đợi người chơi đang chơi.
Sau đó, trong sendPlayersToMatch() , dưới for lặp, hệ thống kiểm tra, hãy kiểm tra: playersLeft.Value = #activePlayers
function PlayerManager.sendPlayersToMatch()local availableSpawnPoints = spawnLocations:GetChildren()for playerKey, whichPlayer in Players:GetPlayers() dotable.insert(activePlayers, whichPlayer)local spawnLocation = table.remove(availableSpawnPoints, 1)preparePlayer(whichPlayer, spawnLocation)endplayersLeft.Value = #activePlayersend
Hiển thị đồng hồ bấm giờ
Hãy nhớ rằng các script module được sử dụng để tập trung các mã tương tự. Khi thời gian được theo dõi trong MatchManager, cập nhật giá trị TimeLeft bằng các hàm từ script Timer. Người quản lý hiển thị sẽ lắng nghe các thay đổi về TimeLeft và cập nhật để bù trùng với giá trị mới.
Trong MatchManager, tạo các biến để lưu ReplicatedStorage dịch vụ, thư mục DisplayValues và TimeLeft.
local MatchManager = {}-- Dịch Vụlocal ServerStorage = game:GetService("ServerStorage")local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Script Mô-đunlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Sự kiệnlocal events = ServerStorage:WaitForChild("Events")local matchStart = events:WaitForChild("MatchStart")-- Giá trịlocal displayValues = ReplicatedStorage:WaitForChild("DisplayValues")local timeLeft = displayValues:WaitForChild("TimeLeft")local myTimer = timer.new()Tìm chức năng startTimer() . Sau khi có sự kiện Finished của sự kiện timer, sao chép toàn bộ, được Highlight trong khi lặp dưới. Mã chạy một lần lượt để cập nhật giá trị Finished bằng cách kiểm soát thời gian cho đến khi timer v��
while myTimer:isRunning() do-- Thêm +1 đảm bảo hiển thị thời gian cuối cùng ở 1 thay vì 0.timeLeft.Value = (math.floor(myTimer:getTimeLeft() + 1))-- Bằng cách không thiết lập thời gian chờ, nó cung cấp lặp lại chính xác hơntask.wait()endKhi được thêm vào, mã nên trông giống như mẫu bên dưới.
local function startTimer()print("Timer started")myTimer:start(gameSettings.matchDuration)myTimer.finished:Connect(timeUp)while myTimer:isRunning() do-- Thêm +1 đảm bảo hiển thị thời gian cuối cùng ở 1 thay vì 0.timeLeft.Value = (math.floor(myTimer:getTimeLeft() + 1))-- Bằng cách không thiết lập thời gian chờ, nó cung cấp lặp lại chính xác hơntask.wait()endendChạy trò chơi với những người chơi tối thiểu. Kiểm tra rằng chỉ số textStatus hiển thị:
- Số lượng người chơi khởi đầu chính xác. Nhớ rằng, con số này sẽ không thay đổi cho đến khi mã bổ sung được thêm vào một bài học tương lai.
- Thời gian giảm mỗi giây cho đến khi nó dừng lại ở 1.
Các Kịch Bản Đã Hoàn Thành
Dưới đây là các script đã hoàn thành để kiểm tra lại công việc của bạn.
Script GameManager
-- Dịch Vụlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Script Mô-đunlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))-- Sự kiệnlocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")while true dodisplayManager.updateStatus("Waiting for Players")repeattask.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersdisplayManager.updateStatus("Get ready!")task.wait(gameSettings.transitionTime)matchManager.prepareGame()matchEnd.Event:Wait()end
Tập lệnh DisplayManager
local DisplayManager = {}
-- Dịch Vụ
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Hiển thị giá trị được sử dụng để cập nhật GUI Người chơi
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local status = displayValues:WaitForChild("Status")
local playersLeft = displayValues:WaitForChild("PlayersLeft")
local timeLeft = displayValues:WaitForChild("TimeLeft")
-- Hàm chức năng địa phương
local function updateRoundStatus()
status.Value = "Players Left: " .. playersLeft.Value .. " / Time Left: " .. timeLeft.Value
end
-- Hàm chức năng
function DisplayManager.updateStatus(newStatus)
status.Value = newStatus
end
playersLeft.Changed:Connect(updateRoundStatus)
timeLeft.Changed:Connect(updateRoundStatus)
return DisplayManager
Tập lệnh MatchManager
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Script Mô-đun
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Sự kiện
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Giá trị
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local timeLeft = displayValues:WaitForChild("TimeLeft")
local myTimer = timer.new()
-- Hàm chức năng địa phương
local function timeUp()
print("Time is up!")
end
local function startTimer()
print("Timer started")
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
while myTimer:isRunning() do
-- Thêm +1 đảm bảo hiển thị thời gian cuối cùng ở 1 thay vì 0.
timeLeft.Value = (math.floor(myTimer:getTimeLeft() + 1))
-- Bằng cách không thiết lập thời gian chờ, nó cung cấp lặp lại chính xác hơn
task.wait()
end
end
-- Hàm chức năng
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager
Script Hiển Thị Tình Trạng
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local status = displayValues:WaitForChild("Status")
local textLabel = script.Parent
local function updateText()
textLabel.Text = status.Value
end
status.Changed:Connect(updateText)
updateText()