การใช้งานพฤติกรรมของ 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.LaserBlastedBindableEventlocal laserBlastedEvent = ReplicatedStorage.Instances.LaserBlastedEventlaserBlastedBindableEvent: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
เพื่อช่วยป้องกันการโกง เซิร์ฟเวอร์ต้องตรวจสอบข้อมูลทั้งหมดที่ส่งโดยลูกค้าแต่ละราย การตรวจสอบนี้รวมถึง:
- BlastData เป็นตารางหรือไม่? มี Class.CFrame และตารางอื่นที่มีชื่อว่า rayResults หรือไม่?
- ผู้เล่นมีเครื่องยิงหินอ่อนหรือไม่?
- ผู้เล่นมีตัวละครและสถานที่ในโลกหรือไม่?
- หลังจากส่งข้อมูลระเบิดแล้วผู้เล่นย้ายไปที่ระยะไกลเกินไปจากที่พวกเขาระเบิดลำแสง?
การตรวจสอบครั้งสุดท้ายนี้มีการเรียกใช้การพิพากษา และตามความล่าช้าของเซิร์ฟเวอร์และความเร็วในการเคลื่อนไหวของผู้เล่นคุณอาจตัดสินใจว่ามีค่าที่แตกต่างก
รับรหัสระเบียบัตร
local distanceFromCharacterToOrigin = blastData.originCFrame.Position - rootPartCFrame.Positionprint(distanceFromCharacterToOrigin.Magnitude) -- เส้นที่ปรับปรุงแล้วให้แน่ใจว่าจะลบif distanceFromCharacterToOrigin.Magnitude > ToleranceValues.DISTANCE_SANITY_CHECK_TOLERANCE_STUDS thenwarn(`Player {player.Name} failed an origin sanity check while blasting`)returnend
เมื่อคุณเคลื่อนที่และระเบิด โปรดสังเกตการออกมา มันอาจดูเหมือนนี้:
1.90196299552917483.15495586395263672.57428836822509774.80445861816406252.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> หลังจากการลดความแลคของก
ในขณะนี้ผู้เล่นสามารถเรียกผลิตและรีสปอร์น เล็งและระเบิด แต่ประสบการณ์ยังต้องกำหนดผลของแต่ละระเบิด ในส่วนต่อไปของการฝึกซ้อมคุณจะเรียนรู้วิธีการโปรแกรมความสามารถส