Tạo bằng ModulScript

*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.

Để áp dụng kiến thức của bạn về script module, tạo một script module cho phép người chơi nhặt chìa khóa và sử dụng chúng để mở rương kho báu.

Cài đặt dự án

Dự án này bao gồm một bản đồ khởi đầu với bảng xếp hạng và các thể hiện lựa chọn kịch bản để cho các chìa khóa và rương kho báu.

Tải Dự án Khởi Đầu

  1. Tải dự án khởi đầu.

  2. Trong Roblox Studio, mở file đã tải: Tài liệu hướng dẫn - Dự án khởi động.rbxl .

Tạo một mô-đun

Vì vậy, người chơi có thể nhận hào quang từ rương, tạo một mô-đun script tên là TreasureManager . Sử dụng một mô-đun script sẽ kết nối các pickups và bảng xếp hạng.

  1. Trong ServerStorage , tạo một mới ModuleScript và đổi tên nó thành TreasureManager .

  2. Trong TreasureManager, đổi tên bảng mô-đun mặc định bằng cách thay thế module bằng TreasureManager ở cả hai nơi.


    local TreasureManager = {}
    return TreasureManager

Sử dụng chức năng trong Script Modul

Để kiểm tra cách các hàm hoạt động trong các tập lệnh modul, tạo một tên hàm mới có tên getKey() . Khi hàm getKey() được gọi từ một tập lệnh khác, nó sẽ nhận một phần chìa khóa để phá huỷ và thêm 1 vào số lượng các chìa khóa trong kho

Tạo một Chức Năng Mô-Đun cho các khóa

  1. Script module này sẽ sử dụng một kết hợp của module và các hàm local, nhập hai dòng hai để giúp bạn giữ chúng được riêng biệt.


    local TreasureManager = {}
    ------------------ Hành động địa phương
    ------------------ Chức Năng Modul
    return TreasureManager
  2. Trong phần Hành Functions của module, thêm một chức năng mới cho module đó được gọi là TreasureManager có tên là getKey() .

    Sử dụng hai tham số:

    • keyPart - là phần để tiêu diệt.
    • whichCharacter - người chơi đã chạm vào phần chìa khóa.

    local TreasureManager = {}
    ------------------ Hành động địa phương
    ------------------ Chức Năng Modul
    function TreasureManager.getKey(keyPart, whichCharacter)
    end
    return TreasureManager
  3. Trong getKey() , hủy keyPart .


    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end

Sử dụng chức năng của modul

Bây giờ, chức năng module getKey() có thể được sử dụng trong các script khác. Để kiểm tra chức năng đó, bạn sẽ mở một script mẫu và gọi nó.

  1. Mở script chìa khóa trong Workspace > Keys > KeyScript .

  2. Trong keyScript, lưu mô-đun script trong một biến tên là treasureManager và đặt nó bằng cách: require(ServerStorage:WaitForChild("TreasureManager"))


    local ServerStorage = game:GetService("ServerStorage")
    -- Yêu cầu script module dưới ⯆
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local keys = script.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
  3. Đã có một chức năng tên là partTouched() để kiểm tra xem một người chạm vào bộ phận. Trong partTouched() :

    • Gọi chức năng getKey() của module Destroy để tiêu diệt chìa khóa.
    • Truy cập trong keyPartwhichCharacter .

    local ServerStorage = game:GetService("ServerStorage")
    -- Yêu cầu script module dưới ⯆
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local keys = script.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
    local function partTouched(otherPart, keyPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- Đưa người chơi một chìa khóa và phá hủy bộ phận chìa khóa
    -- =====================================
    treasureManager.getKey(keyPart, whichCharacter)
    -- =====================================
    end
    end
  4. Chạy dự án và kiểm tra rằng chạm một nút làm cho nó bị hỏng.

Mẹo dịch vụ

Vấn đề: Nhận một thông điện lỗi bao gồm: "Infinite yield possible" .

  • Kiểm tra chính tả của script của module của bạn trong một script. Nếu một script module, like TreasureManager , được viết khác nhau, sẽ có một lỗi. Vấn đề: Nhận một thông điện lỗi bao gồm: "attempt to index global" .

  • Kiểm tra dòng có chứa yêu cầu đối với script module trong keyScript . Nếu module không có yêu cầu, nó không thể sử dụng các hàm và biến đổi từ script module đó. Vấn đề: Skript không chạy hoặc không thể nhặt lên chìa khóa.

  • Trong kịch bản module, hãy đảm bảo rằng tất cả các mã đều ở giữa local TreasureManager = {}return TreasureManager . The return must be the last line of code in aModule Script.

  • Hãy kiểm tra có hai dấu chấm câu ở cuối dòng với yêu cầu, như ở WaitForChild("TreasureManager")) .

Tạo một chức năng địa phương

Hiện tại, bảng xếp hạng theo dõi các chìa khóa và kho báu của một người chơi. Để thay đổi số bảng xếp hạng, hãy sử dụng một hàm địa phương trong script module. Một hàm địa phương được sử dụng vì thay đổi giá trị chìa khóa hoặc giá trị kho báu của một người ch

  1. Trong ServerStorage , mở trang TreasureManager .

  2. Tạo biến đổi địa phương để làm theo những gì theo dõi:

    • Lấy dịch vụ Người chơi để cho phép script hoạt động với các chỉ số bảng xếp hạng người chơi.

    • Lưu số lượng các nút mà người chơi nhận sau khi chạm vào keyPart .


    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    ------------------ Hành động địa phương
    ------------------ Chức Năng Modul
    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end
    return TreasureManager
  3. Bắt chước và vẽ những hàm này vào trong phần Hàm nhân bản địa của bạn.

    • getPlayerKeys() trả lại giá trị của leaderstat của người chơi Lockpicks.

    • getPlayerTreasure() trả lại giá trị của lãnh đạo Treasure của người chơi.


    ------------------ Hành động địa phương
    local function getPlayerKeys(whichCharacter)
    local player = Players:GetPlayerFromCharacter(whichCharacter)
    local leaderstats = player:FindFirstChild("leaderstats")
    return leaderstats:WaitForChild("Lockpicks")
    end
    local function getPlayerTreasure(whichCharacter)
    local player = Players:GetPlayerFromCharacter(whichCharacter)
    local leaderstats = player:FindFirstChild("leaderstats")
    return leaderstats:WaitForChild("Treasure")
    end
    ------------------ Module Functions
  4. Để thêm vào các phím của người chơi, trong chức năng getKey() của module:

    • Tạo một biến local để gọi getPlayerKeys(whichCharacter) .

    • Thêm giá trị của keyDrop vào playerKeys .


    ------------------ Chức Năng Modul
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  5. Chạy dự án. Kiểm tra rằng chạm vào một nút phá hủy nó và thêm 1 vào các nút của người chơi trên bảng xếp hạng.

Nếu cần thiết, kiểm tra script của bạn đối với dưới đây cho bất kỳ vấn đề nào của trợ giúp.

Current TreasureManager Script

local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
------------------ Hành động địa phương
local function getPlayerKeys(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Lockpicks")
end
local function getPlayerTreasure(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Treasure")
end
------------------ Chức Năng Modul
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager

Lấy Thông Tin Từ Các Mô-Đun Script

Script TreasureManager sẽ được sử dụng khi người chơi chạm vào một rương kho báu để kiểm tra có phải họ có ít nhất một chìa khóa trước khi mở nó và cho họ vàng.

Kiểm tra xem hộp có thể được mở

  1. Đầu tiên trong ServerStorage > TreasureManager script, cài đặt biến cho số lượng các chìa khóa cần thiết để mở một rương và bao nhiêu vàng mỗi rương.


    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    local chestPickCost = 1
    local chestReward = 100
    ------------------ Hành động địa phương
    local function getPlayerKeys(whichCharacter)
    local player = Players:GetPlayerFromCharacter(whichCharacter)
    local leaderstats = player:FindFirstChild("leaderstats")
    return leaderstats:WaitForChild("Lockpicks")
    end
  2. Để tạo ra một chức năng kiểm tra nếu một người chơi có thể mở một rương, trong phần Chức Năng Modul , thêm một chức năng mới vào bảng TreasureManager có tên là canOpenChest() với tham số 2> whichCharacter2> .


    ------------------ Chức Năng Modul
    function TreasureManager.canOpenChest(whichCharacter)
    end
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  3. Bạn có thể sao chép và dán mã bên dưới vào canOpenChest() để trả lại true nếu người chơi có đủ chìa khóa, và false nếu họ không.


    function TreasureManager.canOpenChest(whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    if playerKeys.Value >= chestPickCost then
    return true
    else
    return false
    end
    end

Đưa vị kỷ tài cho người chơi

Vì vậy, người chơi có thể mở một rương, tạo một chức năng trong TreasureManager để trao cho họ kho báu.

  1. Thêm một chức năng mới cho TreasureManager có tên openChest() .

    Được truyền bởi hai引数:

    • chestPart - phần rương để tiêu diệt.
    • whichCharacter - người chơi để cho kho báu.

    function TreasureManager.openChest(chestPart, whichCharacter)
    end
  2. Để trừ khối các chìa khóa của một người chơi và trao tặng họ kho báu, sao chép và dán mã bên dưới trong openChest(). This code sử dụng các biến đã tạo trước đó, như chestReward , số lượng kho báu được cho mỗi rương.


    function TreasureManager.openChest(chestPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    local playerTreasure = getPlayerTreasure(whichCharacter)
    playerKeys.Value = playerKeys.Value - chestPickCost
    playerTreasure.Value = playerTreasure.Value + chestReward
    chestPart:Destroy()
    end

Gọi chức năng Rương

Bây giờ hai chức năng module, canOpenChest()openChest() đã được tạo, họ có thể được gọi bởi các bộ phận Chest bất cứ lúc nào một người chạm vào chúng bằng cách sử dụng hành động đặt hàng partTouched() .

  1. Trong Workspace > Chests mở ChestScript .

  2. Tạo một biến mới có tên là treasureManager và yêu cầu script TreasureManager trong ServerStorage .


    local ServerStorage = game:GetService("ServerStorage")
    -- Yêu cầu script módul dưới đây
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local chests = script.Parent
    local chestsFolder = chests.Parts
    local chestsArray = chestsFolder:GetChildren()
  3. Trong partTouched() , dưới câu if humanoid , tạo một biến mới có tên là canOpen và đặt nó bằng cách:

    treasureManager.canOpenChest(whichCharacter)


    local function partTouched(otherPart, chestPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- Kiểm tra xem người chơi có thể mở một rương, sau đó để họ nhận kho báu
    -- =====================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    -- =====================================
    end
    end
  4. Tiếp theo, tạo một if statement để kiểm tra nếu canOpen là sự thật.

    • Nếu vậy, gọi chức năng openChest() của TreasureManager.

    • Sau đó, truyền hai tham số: chestPart , hộp sọ để phá hủy, và whichCharacter , người chơi để trao kho báu.


    local function partTouched(otherPart, chestPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- Kiểm tra xem người chơi có thể mở một rương, sau đó để họ nhận kho báu
    -- =====================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    if canOpen == true then
    treasureManager.openChest(chestPart, whichCharacter)
    end
    -- =====================================
    end
    end
  5. Chạy dự án. Xem xét rằng:

    • Nếu bạn có ít nhất một chìa khóa, việc chạm vào một rương sẽ phá hủy nó và trao vận may.
    • Nếu bạn có 0 chìa khóa, bạn không thể mở một rương kho báu.

Mẹo dịch vụ

  • Trong ChestScript, hãy đảm bảo rằng các chức năng được gọi từ script module như canOpenChest() được viết chính xác như chúng được tìm thấy trong TreasureManager script. Bất kỳ sự khác biệt nào cũng sẽ gây ra một lỗi.

  • Kiểm tra các chức năng sao chép và dán, như treasureManager.openChest(), đều được hiển thị chính xác như trong bài học. Bất kỳ sự khác biệt nào cũng có thể gây ra những lỗi nhỏ nhưng khó chịu trong script.

Các Kịch Bản Đã Hoàn Thành

Đã kết thúc mã TreasureManager

local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
------------------ Hành động địa phương
local function getPlayerKeys(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Lockpicks")
end
local function getPlayerTreasure(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Treasure")
end
------------------ Chức Năng Modul
function TreasureManager.openChest(chestPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
local playerTreasure = getPlayerTreasure(whichCharacter)
playerKeys.Value = playerKeys.Value - chestPickCost
playerTreasure.Value = playerTreasure.Value + chestReward
chestPart:Destroy()
end
function TreasureManager.canOpenChest(whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
if playerKeys.Value >= chestPickCost then
return true
else
return false
end
end
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager
Hoàn thành ChestScript

local ServerStorage = game:GetService("ServerStorage")
-- Yêu cầu script module dưới ⯆
local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
local chests = script.Parent
local chestsFolder = chests.Parts
local chestsArray = chestsFolder:GetChildren()
local function partTouched(otherPart, chestPart)
local whichCharacter = otherPart.Parent
local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- Kiểm tra xem người chơi có thể mở một rương, sau đó để họ nhận kho báu
-- =====================================
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- =====================================
end
end
-- Làm cho mọi phần của rương đến chức năng chạm để nó hoạt động trên tất cả các bộ phận
for chestIndex = 1, #chestsArray do
local chestPart = chestsArray[chestIndex]
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
end
Đã kết thúc keyScript

local ServerStorage = game:GetService("ServerStorage")
-- Yêu cầu script module dưới ⯆
local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
local keys = script.Parent
local keysFolder = keys.Parts
local keysArray = keysFolder:GetChildren()
local function partTouched(otherPart, keyPart)
local whichCharacter = otherPart.Parent
local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- Đưa người chơi một chìa khóa và phá hủy bộ phận chìa khóa
-- =====================================
treasureManager.getKey(keyPart, whichCharacter)
-- =====================================
end
end
-- Gắn mọi phần chìa khóa đến chức năng chạm để nó hoạt động trên tất cả các bộ phận
for keyIndex = 1, #keysArray do
local keyPart = keysArray[keyIndex]
keyPart.Touched:Connect(function(otherPart)
partTouched(otherPart, keyPart)
end)
end

Tổng kết

Một ứng dụng phổ biến khác của việc sử dụng script module trong trò chơi Roblox là xử lý các nhiệm vụ thông thường được sử dụng bởi người chơi, chẳng hạn như cấp cho họ điểm. Đối với ví dụ này, một script module tên là TreasureManager đã được tạo để xử lý cấp cho người chơi và kho báu mọi lú