Với bản đồ đã tạo, là thời gian để bắt đầu xây dựng các script. Phần còn lại của khóa học này sẽ tập trung nhiều vào việc xây dựng tất cả các thành phần khác nhau của chuỗi trò chơi.
Tùy chỉnh các Tập lệnh
Trận chiến sẽ sử dụng một kết hợp của các script module và các script thường. Dưới đây là các script và chức năng của chúng.
GameManager. | Script. Sử dụng chức năng từ Match Manager bằng cách sử dụng biến đổi từ Game Settings |
MatchManager | Script Hành Tây. Thực hiện các chức năng như gửi người chơi vào một đấu trường hoặc theo dõi thời gian trong một tương thích. |
GameSettings | Module Script. Lưu trữ các biến đổi thông thường được sử dụng bởi các script khác. |
Script GameSettings
Tạo một script mô-đun tên là GameSettings để lưu các biến đổi được sử dụng bởi các script khác, chẳng hạn như thời gian trận đấu và thời gian nhiệm vụ. Các biến này sẽ được sử dụng bởi script Quản lý trò chơi sau đó.
Trong ServerStorage , tạo một thư mục tên là ModuleScripts. Trong thư mục đó, tạo một mô-đun mới tên là GameSettings.
Mở GameSettings và đổi tên bảng module để phù hợp với tên của script.
local GameSettings = {}return GameSettingsTrong bảng mô-đun, thêm biến cho các mục sau đây. Hãy đoán tốt nhất cho mỗi giá trị, bạn luôn có thể thay đổi nó sau đó khi bạn thử nghiệm.
- Thời gian gián đoạn - Thời gian người chơi chờ trước khi bắt đầu tương thích.
- Thời gian trận đấu - Độ dài của trận đấu bằng giây.
- Người chơi tối thiểu - Số người chơi nhỏ nhất cần thiết để bắt đầu.
- Thời gian chuyển tiếp - Thời gian trước và sau một trận đấu trong giây lát. Làm cho quá trình chuyển tiếp giữa các bộ phận của game loop ít bất ngờ hơn.
local GameSettings = {}-- Biến trò chơiGameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
Tập lệnh MatchManager
Script thứ hai kết nối với GameManager là MatchManager. Script này quản lý các nhiệm vụ như khởi động thời gian thực hoặc đặt lại người chơi một lần khi kết thúc trận đấu.
Trong MatchManager có một chức năng tên là prepareGame() khởi động trò chơi bằng cách chuyển người chơi vào tương thích.
Trong ServerStorage > ModuleScripts > thêm một mô-đun script tên là MatchManager. Đổi tên bảng mô-đun.
local MatchManager = {}return MatchManagerThêm một chức năng mới cho MatchManager tên là prepareGame() . Bao gồm một tuyên bố in để kiểm tra script sau đó.
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
Lập trình Game Loop
Vòng lặp chính sẽ được mã hóa trong script GameManager bằng các biến đã tạo. Hãy nhớ rằng, có ba giai đoạn trong vòng lặp trò chơi: tiết kiệm, cạnh tranh và làm trả về mặc địnhvà thiết lập lại.
Script GameManager
Đây là một trình tạo máy chủ bình thường, vì vậy hãy đặt nó vào ServerScriptService, chứ không phải vào tập tin máy chủ script. Loop trò chơi thực sẽ được thực hiện trong một khoảng thời gian nào đó, thay vì trong tập tin máy chủ script.
Trong ServerScriptService, tạo một mô-đun mới có tên là GameManager.
Thêm một biến đổi cho dịch vụ "ServerStorage", nơi các Modulescripts được. Sau đó, thêm một biến đổi cho dịch vụ "Players", sẽ cần để kiểm tra số lượng người chơi trong gián đoạn.
-- Dịch Vụlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")Để sử dụng các mô-đun đã tạo trước đó:
- Đặt biến tên là moduleScripts đến vị trí của thư mục ModuleScripts.
- Thêm biến tên là matchManager và gameSettings . Tùy chỉnh mỗi biến để yêu cầu mỗi một tập tin.
-- 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"))Sau các biến, thêm một while true do lặp. Tất cả các giai đoạn của chuỗi game sẽ đi vào để lặp lại vô tận.
-- Script Mô-đunlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Vòng lặp chính gamewhile true doend
Lập trình Nhiệm vụ
Khi game loop chạy vô tận, intermission nên tạm dừng vòng lặp và chỉ tiếp tục khi có đủ người chơi cho một tương thích. Để code intermission này, hãy bao gồm một vòng lặp lặp lại cho intermission trong vòng lặp chính. Vòng lặp này sẽ lặp lại cho đến khi có đủ người chơi, sau đó
Với một lặp lại , mã trong lặp sẽ chạy ít nhất một lần. Ngược với một vòng lặp, nó không kiểm tra điều kiện cho đến khi vòng lặp kết thúc. Điều này đảm bảo người chơi luôn đến sảnh trước khi một tương thíchbắt đầu.
Trong while true do lượt lặp, hãy nhập repeat và nhấn Enter để tự động hoàn thành với nhãn 1> until1> .
while true dorepeatuntilendKiểm tra xem số lượng người chơi hiện tại (#Players:GetPlayers()) đã lớn hơn hay bằng minimumPlayers biến đổi đã tạo trước ở mục GameSettings.
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersendTrong lặp lặp lặp lặp, thêm một lời in nói rằng kỳ nghỉ đang bắt đầu. Sử dụng task.wait() để tạm dừng cho kỳ nghỉ bằng cách sử dụng intermissionDuration từ GameSettings.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersendChơi thử và kiểm tra rằng tuyên bố in "Starting intermission" được hiển thị ít nhất hai lần. Xem thông điệp hai lần chứng minh rằng hàng dừng lại không tìm đủ người chơi và chạy lại. Bạn sẽ phải đợi thời gian dừng lại trước khi xem thông điệ
Mẹo dịch vụ
Tại thời điểm này, nếu bạn không sinh sản như ý muốn, hãy thử một trong những lựa chọn dưới đây.
- task.wait() nên ở trong vòng lặp lặp lại. Mà không có đợi, script sẽ chạy quá nhiều lần trong một giây, quá tải Roblox Studio và gây ra lỗi.
- Trong mô-đun Cài đặt trò chơi, biến intermissionDuration nên lớn hơn 1. Nếu thấp hơn, script có thể lặp lại quá nhiều, gây ra các vấn đề chậm.
Kết thúc Phần tạm dừng
Khi có đủ người chơi, hãy để họ đợi một thời gian chuyển dịch ngắn. Sau đó, gửi họ vào trận bằng cách gọi chức năng prepareGame() trong MatchManager. Nhớ rằng, chức năng này chỉ in một dòng, nhưng bạn sẽ thêm mã sau đó.
Ở cuối của lặp lặp lại, thêm một tuyên bố in nói rằng hiện đã kết thúc để kiểm tra mã của bạn. Sau đó, theo nó với một task.wait() đang dùng biến transitionTime của GameSettings.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)endSau khi đợi, gọi prepareGame() từ mô-đun MatchManager. Khi mã được chạy, nó sẽ chỉ in chữ vào cửa sổ ra력. Đợi cho đến phần tiếp theo để kiểm tra mã này.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Thử nghiệm các trò chơi nhiều người chơi
Hiện tại, để có được mã chạy prepareGame() , nó cần phải thoát khỏi vòng lặp lặp lại. Nhưng, để làm điều đó, cần phải có nhiều hơn một người chơi trong trò chơi (ngoại trừ nếu bạn sử dụng nút playtest).
Bắt đầu một máy chủ địa phương
Để kiểm tra mã cần sử dụng nhiều hơn một người chơi, tạo một máy chủ địa phương. Mặc dù các trò chơi được xuất bản trên các máy chủ Roblox thường là trên các máy chủ địa phương, một máy chủ địa phương simulate một trò chơi nhiều người chơi trên máy tính của bạn với những ngườ
Để bắt đầu một máy chủ địa phương, trong trang Thử nghiệm > Clients and Servers > set player dropdown to number of players in GameSettings's variable minimumPlayers. This lesson uses 2 players.
Nhấp vào Bắt đầu để bắt đầu máy chủ.
Chờ vài giây cho máy chủ khởi động. Nhiều cửa sổ sẽ mở ra bên cạnh cửa sổ Studio của bạn. Bạn có thể cần phải cho phép quyền truy cập vào Roblox Studio từ các bức tường lửa hoặc các bộ dịch vụ an toàn khác.
Mẹo dịch vụ
Tại thời điểm này, bạn không thể thấy các máy chủ thử nghiệm, hãy thử một trong những lựa chọn dưới đây.
- Nếu bạn có bất kỳ vấn đề với máy chủ khởi động, hãy kiểm tra lại bài viết Vấn đề bảo mật và bảng điều khiển.
- Đặt số lượng người chơi xuống một số nhỏ, ví dụ như 2 hoặc 3.
- Nếu vấn đề này không được giải quyết, hãy thử khởi động lại Studio hoặc khởi động lại máy tính của bạn.
Thử nghiệm trên máy chủ địa phương
Bạn sẽ thấy nhiều cửa sổ khi máy chủ khởi động. Mỗi cái đại diện cho một phần khác nhau của mối quan hệ máy chủ/khách hàng.
- Server (biên giới xanh) chạy trò chơi.
- Client (các biểu tượng màu xanh) simulates a người chơi's experience.
Với máy chủ hoạt động, bạn có thể kiểm tra xem mã có hoạt động không.
Tìm cái Máy chủ window với biên giới xanh. Kiểm tra các tuyên bố in từ script MatchManager. Vì có một lặp lại, bạn sẽ thấy các tuyên bố in tương tự.
Một khi bạn đã hoàn thành kiểm tra, ở bất kỳ cửa sổ nào, đóng máy chủ bằng nút Cleanup. Điều này đóng tất cả các cửa sổ Server và Client và dẫn bạn trở về cửa sổ Studio bình thường của bạn.
Mẹo dịch vụ
Tại thời điểm này, nếu các tuyên bố in định không xuất hiện, hãy thử một trong những lựa chọn dưới đây.
- Kiểm tra xem các chức năng như prepareGame() đang nằm trong phạm vi while true do loop.
- Nếu in từ MatchManager không hoạt động, hãy kiểm tra một số lỗi hỗ trợ thông thường với các script modul, chẳng hạn như đảm bảo rằng script MatchManager được yêu cầu trong GameManager hoặc prepareGame() được thêm vào bảng của module đó.
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"))-- Vòng lặp chính gamewhile true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Tập lệnh MatchManager
local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager
Script GameSettings
local GameSettings = {}-- Biến trò chơiGameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings