Triển khai hành vi của blaster là quá trình lập trình một hành vi hạt nhân trong trải nghiệm người chơi thứ nhất. Khi người chơi có thể nổ tung với một cú nhấp chuột hoặc nhấn của nút, tạo ra một hành vi hạt nhân hài lòng và chính xác là quan trọng bởi vì nó tăng hứng th
Sử dụng trang kinh nghiệm laser trượt qua như một tham khảo, bài này của hướng dẫn cho bạn về những kịch bản sau khi thực hiện hành vi laser cho hai loại blaster khác nhau, bao gồm hướng dẫn về các kịch bản sau đây:
- Phát hiện khi người chơi nhấn nút nổ.
- Kiểm tra xem người chơi có thể sử dụng súng phun nổ của họ nếu họ đã gần đây nhấn vào nút "Blast" không.
- Tạo dữ liệu nổ cho phép máy chủ biết ai đã khởi xướng nổ, nguồn gốc nó đến và mục tiêu cuối cùng của mỗi tia laser.
- Thông báo cho máy chủ về dữ liệu nổ để nó có thể thực hiện các hành động phù hợp nếu nổ va chạm với một người chơi khác.
- Đặt lại blaster giữa mỗi ngọn lửa để cho phép blaster có thời gian đủ để nguộm mình trước khi nó có thể nổ tung một lần nữa.
Sau khi hoàn thành mục này, bạn sẽ biết về các script cho phép blaster phát hiện khi các hạt nổ va chạm với nhau, sau đó trừ số lượng tương ứng tương ứng tương ứng tương ứng tương ứng tương ứng tương ứng tương ứng tương ứng tương ứng tương ứng tương ứng tương ứng tương ứng tương ứng tương
Nhận dữ liệu người chơi
Bước đầu tiên để thực hiện hành vi người chơi là lắng nghe khi một người chơi nhấn nút nổ. Loại nhập mà người chơi sử dụng để nhấn nút nổ phụ thuộc vào thiết bị mà họ đang sử dụng để truy cập trải n
Script này sử dụng ContextActionService để liên kết MouseButton1 và ButtonR2 đến hành động phóng hạt nhân. Điều này có nghĩa là mỗi khi một người chơ
Người điều khiển người dùng
ContextActionService:BindAction("_", onBlasterActivated, false,Enum.UserInputType.MouseButton1,Enum.KeyCode.ButtonR2)
Một ghi chú quan trọng khác là sử dụng Enum.UserInputState.Begin trong định nghĩa onBlasterActivated(). Nhiều tương tác người dùng, chẳng hạn như chọn một blaster trong ví dụ này, k
Để thực hiện, bạn có thể thay đổi Enum.UserInputState.Begin thành Enum.UserInputState.End , sau đó thử nghiệm để xem cách phản hồi của bom ảnh hưởng đến trải nghiệm của trò chơi. Ví dụ, nếu người chơi có thể giữ nút mà không g
Người điều khiển người dùng
local function onBlasterActivated(_actionName: string,
inputState: Enum.UserInputState, _inputObject: InputObject)
if inputState == Enum.UserInputState.End then -- đã cập nhật dòng, hãy chắc chắn để thay đổi quay lại
attemptBlastClient()
end
end
Kiểm tra xem Người chơi có thể nổ tung
Sau khi UserInputHandler phát hiện một gõnhấn hoặc màn hình cảm ứng, n
có thể nổ tung người chơi
local function canLocalPlayerBlast(): boolean
return localPlayer:GetAttribute(PlayerAttribute.blasterStateClient) == BlasterState.Ready
end
Độ dừng này nhẹ làm cho bạn không thể nổ tung nhanh như thể bạn có thể nhấp chuột. Ví dụ, nếu bạn thay đổi chức năng để luôn luôn trả lời true, bạn có thể nổ tung nhanh chóng blaster của bạn mà không có bất kỳ độ trễ nào, điều này là không thực tế cho laser tag trải nghiệm trò chơi.
có thể nổ tung người chơi
local function canLocalPlayerBlast(): boolean
return true -- đã cập nhật dòng, hãy chắc chắn để thay đổi quay lại
end
Tạo Dữ Liệu Nổ
Sau khi xác minh rằng máy bay của người chơi đang ở trong trạng thái Ready , attemptBlastClient gọi ReplicatedStorage > 1> attemptB
Bước tiếp theo là tạo dữ liệu nổ. Nếu bạn xem xét ReplicatedStorage > Blaster > BlastData , bạn có thể thấy rằng mỗi cuộc nổ có ba mảnh thông tin:
- Người chơi khởi xướng vụ nổ.
- Một DataType.CFrame đại diện cho điểm xuất phát của nổ.
- Một bảng RayResult chứa mục tiêu cuối cùng của mỗi tia laser và người chơi trúng, nếu đánh một người chơi khác.
Để tạo ra dữ liệu này, blastClient gọi ReplicatedStorage > attemptBlastClient > 1> blastClient1> > 4> generateBlastData4>, which bạn có thể xem xét dưới đây.
tạo raBlastData
local function generateBlastData(): BlastData.Type
local blasterConfig = getBlasterConfig()
local rayDirections = getDirectionsForBlast(
currentCamera.CFrame, blasterConfig)
local rayResults = castLaserRay(
localPlayer, currentCamera.CFrame.Position, rayDirections)
local blastData: BlastData.Type = {
player = localPlayer,
originCFrame = currentCamera.CFrame,
rayResults = rayResults,
}
return blastData
end
Hành funzione này bắt đầu bằng cách sử dụng getBlasterConfig để lấy lại đánh máyblaster của người chơi. Mẫu cung cấp hai loại blaster: một sản xuất nhiều tia với chiếu rộng, và một sản xuất một tia. Bạ
Hàm này sau đó sử dụng currentCamera.CFrame như điểm xuất phát cho vụ nổ, đưa nó đến getDirectionsForBlast</
Thông báo với Server
Khi blastClient có dữ liệu hoàn chỉnh cho cuộc nổ tung, nó kích hoạt hai sự kiện:
bịtClient
local laserBlastedBindableEvent = ReplicatedStorage.Instances.LaserBlastedBindableEventlocal laserBlastedEvent = ReplicatedStorage.Instances.LaserBlastedEventlaserBlastedBindableEvent:Fire(blastData)laserBlastedEvent:FireServer(blastData)
The BindableEvent notifies other client scripts of the blast. For example, ReplicatedStorage > FirstPersonBlasterVisuals uses this event to know when to display visual effects, such as the blast animation and cooldown bar. similarly, the 1> Class.RemoteEvent
LaserBlastHandler
local function onLaserBlastedEvent(playerBlasted: Player, blastData: BlastData.Type)
local validatedBlastData = getValidatedBlastData(playerBlasted, blastData)
if not validatedBlastData then
return
end
if not canPlayerBlast(playerBlasted) then
return
end
blastServer(playerBlasted)
processTaggedPlayers(playerBlasted, blastData)
for _, replicateToPlayer in Players:GetPlayers() do
if playerBlasted == replicateToPlayer then
continue
end
replicateBlastEvent:FireClient(replicateToPlayer, playerBlasted, blastData)
end
end
Để giúp ngăn chặn gian lận, máy chủ phải xác minh tất cả các dữ liệu mà mỗi khách hàng gửi. Các kiểm tra này bao gồm:
- Có phải BlastData là một bảng? Có chứa một Class.CFrame và một bảng khác có tên là rayResults không?
- Liệu người chơi có sử dụng một blaster được trang bị không?
- Liệu người chơi có một nhân vật và một vị trí trong thế giới không?
- Sau khi gửi dữ liệu nổ, liệu người chơi đã di chuyển một khoảng cách dư thừa khỏi nơi họ phóng laser?
Bước kiểm tra cuối cùng này có sự tham gia của một hành động phán xét, và theo thời gian thực tế và tốc độ di chuyển của người chơi, bạn có thể quyết định rằng các giá trị khác nhau quá mức cho trải nghiệm của riêng bạn. Để biểu tình cách th
nhận ra dữ liệu đã được xác minh
local distanceFromCharacterToOrigin = blastData.originCFrame.Position - rootPartCFrame.Positionprint(distanceFromCharacterToOrigin.Magnitude) -- cập nhật dòng, hãy chắc chắn để loại bỏif distanceFromCharacterToOrigin.Magnitude > ToleranceValues.DISTANCE_SANITY_CHECK_TOLERANCE_STUDS thenwarn(`Player {player.Name} failed an origin sanity check while blasting`)returnend
Khi bạn di chuyển và phun, hãy ghi lại kết quả. Nó có thể trông như thế này:
1.90196299552917483.15495586395263672.57428836822509774.80445861816406252.6434271335601807
Nếu bạn tăng tốc độ di chuyển cho người chơi trong ReplicatedStorage > PlayerStateHandler > PlayerMovement > 1> test lại1>, bạn sẽ có thể gặp nhiều lỗi không thành công do di chuyển quá nhiều giữa các ngày phát sóng.
Bật/Tắt Di Chuyển Người Chơi
local ENABLED_WALK_SPEED = 60 -- updated line, be sure to change back
Máy chủ sau đó làm theo những gì theo dõi:
- Xác nhận rayResults .
- Kiểm tra xem người chơi có thể nổ tung.
- Đặt lại trạng thái của máy bay siêu thanh.
- Giảm sức khỏe cho bất kỳ người chơi được gắn nhãn.
- Tái tạo vụ nổ để tất cả người chơi khác có thể thấy hình ảnh người thứ ba.
Để biết thêm thông tin về các hoạt động của máy chủ này, xem mục Phát hiện đòn đánh trong hướng dẫn.
Đặt lại Blaster
Trong trải nghiệm Laser Tag mẫu, các kẻ sử dụng một máy phun nhiệt. Thay vì tái tải sau một loạt các trận đấu, họ cần thời gian để "thư giãn" giữa mỗi trận đấu. Độ trễ này tương tự như nhau trên client ( blastClient
Server nổ
local blasterConfig = getBlasterConfig(player)
local secondsBetweenBlasts = blasterConfig:GetAttribute("secondsBetweenBlasts")
task.delay(secondsBetweenBlasts, function()
local currentState = player:GetAttribute(PlayerAttribute.blasterStateServer)
if currentState == BlasterState.Blasting then
player:SetAttribute(PlayerAttribute.blasterStateServer, BlasterState.Ready)
end
end)
Thuộc tính secondsBetweenBlasts là một phần của cấu hình blaster trong ReplicatedStorage > Instances > 1> LaserBlastersFolder1> . Sau khi hết thời gian trễ giữ 4> secondsBetweenBlasts4>, người ch
Tại thời điểm này, người chơi có thể gọi xe và phát triển, ngắm bắn và nổ tung, nhưng trải nghiệm vẫn phải xác định kết quả của mỗi ngọn lửa nổ tung. Trong phần tiếp theo của hướng dẫn, bạn sẽ học cách lập trình khả năng cho blaster để phát hiện khi