การใช้ Blaster พฤติกรรม

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

การใช้งานพฤติกรรมของ blaster ในประสบการณ์ยิงมุมมองบุคคลที่หนึ่งนั้นเป็นกระบวนการของการเขียนโปรแกรมเครื่องยิงเลเซอร์ในประสบการณ์ผู้เล่นสามารถระเบิดด้วยการคลิกเดียวหรื

โดยใช้ประสบการณ์ เลเซอร์เป้าหมายตัวอย่าง เป็นตัวอ้างอิง ส่วนนี้ของการฝึกสอนให้คุณเกี่ยวกับสคริปต์ที่อยู่เบื้องหลังการใช้งานพฤติกรรมของเลเซอร์สำหรับสองประเภทของเลเซอร์รวมถึงคำแนะน

  • ตรวจจับเมื่อผู้เล่นกดปุ่มระเบิด
  • ตรวจสอบว่าผู้เล่นสามารถใช้ปืนเลเซอร์ของพวกเขาได้หรือไม่ หากพวกเขาเพิ่งกดปุ่มระเบิด
  • การสร้างข้อมูลระเบิดที่บอกผู้เล่นว่าใครเริ่มระเบิด มันมาจากไหน และสิ่งที่เป็นจุดหมายปลายของแต่ละลำแสงเลเซอร์
  • แจ้งให้เซิร์ฟเวอร์ของข้อมูลระเบิดเพื่อให้สามารถดำเนินการตามที่เหมาะสมหากระเบิดชนกับผู้เล่นอื่น
  • รีเซ็ตเครื่องยิงให้กับแต่ละการระเบิดเพื่อให้เครื่องยิงเย็นลงก่อนที่จะสามารถระเบิดได้อีกครั้ง

หลังจากที่คุณเสร็จสิ้นส่วนนี้คุณจะได้เรียนรู้เกี่ยวกับสคริปที่ช่วยให้เครื่องเป่าไฟตรวจจับเมื่อเครื่องเป่าไฟชนกับผู้เล่นคนอื่นแล้วหักเงินสมทบตามแต่ละประเภทของเครื่องเป่าไฟ

ตรวจจับการป้อนข้อมูลผู้เล่น

ขั้นตอนแรกในการใช้งานพฤติกรรมของ blaster คือการฟังเมื่อผู้เล่นกดปุ่มระเบิด ประเภทของการป้อนข้อมูลที่ผู้เล่นใช้เพื่อกดปุ่มระเบิดขึ้นอยู่ก

สคริปต์ลูกค้านี้ใช้ ContextActionService เพื่อผูก MouseButton1 และ ButtonR2 กับการปล่อยระเบิด ซึ่งหมายความว่าทุกค

ผู้จัดการการป้อนข้อมูลผู้ใช้

ContextActionService:BindAction("_", onBlasterActivated, false,
Enum.UserInputType.MouseButton1,
Enum.KeyCode.ButtonR2
)

ข้อควรระวังอื่นคือการใช้ Enum.UserInputState.Begin ในคำอธิบาย onBlasterActivated() หลายปุ่มการใช้งานผู้ใช้เช่นการเลือกบลาสเตอร์ในต

เพื่อแสดงให้เห็น คุณสามารถเปลี่ยน Enum.UserInputState.Begin เป็น Enum.UserInputState.End แล้วทดสอบเพื่อดูว่าการตอบสนองของการระเบิดส่งผลต่อการเล่นเกมของประสบการณ์

ผู้จัดการการป้อนข้อมูลผู้ใช้

local function onBlasterActivated(_actionName: string,
inputState: Enum.UserInputState, _inputObject: InputObject)
if inputState == Enum.UserInputState.End then -- เส้นที่ปรับแก้แล้ว ย้อนกลับ
attemptBlastClient()
end
end

ตรวจสอบว่าผู้เล่นสามารถระเบิดได้

หลังจาก UserInputHandler เซิร์ฟเวอร์

สามารถโจมตีผู้เล่นได้

local function canLocalPlayerBlast(): boolean
return localPlayer:GetAttribute(PlayerAttribute.blasterStateClient) == BlasterState.Ready
end

หา

คลิกเช่น หากคุณเปลี่ยนคุณสมบัติให้เป็น true คุณสามารถระเบิด blaster การเล่นเกมซึ่งเป็

สามารถโจมตีผู้เล่นได้

local function canLocalPlayerBlast(): boolean
return true -- เส้นที่ปรับแก้แล้ว ย้อนกลับ
end

สร้างข้อมูลระเบิด

หลังจากตรวจสอบว่าผู้เล่นของเครื่องปื่อยนั้นอยู่ในสถานะ Ready ผู้เล่นคนแรกที่ bl

ขั้นตอนต่อไปคือการสร้างข้อมูลระเบิด หากคุณตรวจสอบ ReplicatedStorage > Blaster > BlastData คุณสามารถดูได้ว่าแต่ละระเบิดประกอบด้วยสามชิ้นของข้อมูล:

  • ผู้เล่นที่เริ่มการระเบิด
  • A DataType.CFrame ที่เป็นตัวแทนของจุดเริ่มต้นของระเบิด
  • ตาราง RayResult ที่มีลำดับลำแสงแต่ละลำแสงและผู้เล่นที่ติดต่อกันหากติดต่อกับผู้เล่นอื่น

เพื่อสร้างข้อมูลนี้ blastClient เรียก ReplicatedStorage > ลองบลาสท์ลูกค้า > 1> ลองบลาสต์เดท1> , ซึ่งคุณสามารถตรวจทานได้ด้านล่าง

สร้างระเบิดข้อมูล

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

ฟังก์ชันนี้เริ่มต้นด้วยการใช้ getBlasterConfig เพื่อดึงชื่อตัวผู้เล่น ตัวอย่างให้สองประเภทของตัวเลเซอร์: หนึ่งที่ผลิตลำแสงหลายสายพร้

ต่อมาฟังก์ชันใช้ currentCamera.CFrame เป็นจุดเริ่มต้นสำหรับการระเบิด ส่งมันไปที่ <

แจ้งให้เซิร์ฟเวอร์ทราบ

เมื่อ blastClient มีข้อมูลสำหรับการระเบิดเสร็จสิ้น มันจะเปิดตัวสองเหตุการณ์:

ลูกค้าระเบิด

local laserBlastedBindableEvent = ReplicatedStorage.Instances.LaserBlastedBindableEvent
local laserBlastedEvent = ReplicatedStorage.Instances.LaserBlastedEvent
laserBlastedBindableEvent:Fire(blastData)
laserBlastedEvent:FireServer(blastData)

Class.BindableEvent แจ้งสคริปต์ลูกค้าอื่น ๆ ของการระเบิด เช่น ReplicatedStorage ใช้เหตุการณ์นี้เพื่อรู้ว่าเมื่อใดจ

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

เพื่อช่วยป้องกันการโกง เซิร์ฟเวอร์ต้องตรวจสอบข้อมูลทั้งหมดที่ส่งโดยลูกค้าแต่ละราย การตรวจสอบนี้รวมถึง:

  1. BlastData เป็นตารางหรือไม่? มี Class.CFrame และตารางอื่นที่มีชื่อว่า rayResults หรือไม่?
  2. ผู้เล่นมีเครื่องยิงหินอ่อนหรือไม่?
  3. ผู้เล่นมีตัวละครและสถานที่ในโลกหรือไม่?
  4. หลังจากส่งข้อมูลระเบิดแล้วผู้เล่นย้ายไปที่ระยะไกลเกินไปจากที่พวกเขาระเบิดลำแสง?

การตรวจสอบครั้งสุดท้ายนี้มีการเรียกใช้การพิพากษา และตามความล่าช้าของเซิร์ฟเวอร์และความเร็วในการเคลื่อนไหวของผู้เล่นคุณอาจตัดสินใจว่ามีค่าที่แตกต่างก

รับรหัสระเบียบัตร

local distanceFromCharacterToOrigin = blastData.originCFrame.Position - rootPartCFrame.Position
print(distanceFromCharacterToOrigin.Magnitude) -- เส้นที่ปรับปรุงแล้วให้แน่ใจว่าจะลบ
if distanceFromCharacterToOrigin.Magnitude > ToleranceValues.DISTANCE_SANITY_CHECK_TOLERANCE_STUDS then
warn(`Player {player.Name} failed an origin sanity check while blasting`)
return
end

เมื่อคุณเคลื่อนที่และระเบิด โปรดสังเกตการออกมา มันอาจดูเหมือนนี้:


1.9019629955291748
3.1549558639526367
2.5742883682250977
4.8044586181640625
2.6434271335601807

หากคุณเพิ่มความเร็วการเคลื่อนที่สำหรับผู้เล่นใน ReplicatedStorage > PlayerStateHandler > togglePlayerMovement คุณจะเล่นอีกครั้งและคุณอาจเจอผลการทดสอบที่หลายไปเนื่องจากการเคลื่อนที่มากเกินไประหว่างกา

เปิด/ปิดการเคลื่อนที่ของผู้เล่น

local ENABLED_WALK_SPEED = 60 -- updated line, be sure to change back

กำลังติดตาม:

  • ตรวจสอบ rayResults
  • ตรวจสอบว่าผู้เล่นสามารถระเบิดได้หรือไม่
  • รีเซ็ตสถานะของ blaster
  • ลดสุขภาพสำหรับผู้เล่นที่มีชื่อ
  • เรียกร้องความระเบิดให้กับผู้เล่นคนอื่น ๆ เพื่อให้พวกเขาสามารถดูวิดีโอระยะสามคนได้

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการดำเนินงานเซิร์ฟเวอร์เหล่านี้โปรดดูที่ส่วน ตรวจจับการโจมตี ของการฝึกซ้อม

รีเซ็ตเครื่องปั่น

ในประสบการณ์เลเซอร์แท็กตัวอย่าง, เบลาสเตอร์ใช้ความร้อนทางกล. แทนที่จะรีโหลดหลังจากการโจมตีจำนวนตัวอักษรตัวอย่าง, พวกเขาต้องใช้เวลาในการ "คูลดา

ระเบิดServer

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)

ค่านามสกุล secondsBetweenBlasts เป็นส่วนหนึ่งของการกำหนดค่า blaster ใน ReplicatedStorage > Instances > 1> LaserBlastersFolder1> หลังจากการลดความแลคของก

ในขณะนี้ผู้เล่นสามารถเรียกผลิตและรีสปอร์น เล็งและระเบิด แต่ประสบการณ์ยังต้องกำหนดผลของแต่ละระเบิด ในส่วนต่อไปของการฝึกซ้อมคุณจะเรียนรู้วิธีการโปรแกรมความสามารถส