HUD หรือ Heads-Up Display คือชุดขององค์ประกอบ UI ที่มองเห็นได้หรือเข้าถึงได้ตลอดระยะเวลาในการเล่นเกม เช่น การแสดงคะแนน มิเตอร์สุขภาพ และปุ่มเมนู การรวม HUD เป็นสิ่งสำคัญสำหรับเกมส่วนใหญ่เพราะมันแสดงข้อมูลที่ช่วยให้ผู้เล่นประสบความสำเร็จในวัตถุประสงค์การเล่นเกมของพวกเขา
องค์ประกอบ HUD ที่พบบ่อยคือมิเตอร์สุขภาพที่มีไอคอนอยู่ทางซ้ายซึ่งสามารถปรับให้เป็นแถบจับเวลา แถบความก้าวหน้า หรือสิ่งที่คล้ายกัน

โดยใช้ Hazardous Space Station เป็นจุดเริ่มต้นและ UI Fundamentals - HUD Meter เป็นจุดอ้างอิงที่เสร็จสมบูรณ์ บทช่วยสอนนี้จะแสดงให้เห็นถึง:
- การตั้งค่าและการใช้ Device Emulator เพื่อตรวจสอบการออกแบบของคุณบนหน้าจอที่จำลองหลายจอ
- การใช้ StarterGui เป็นทั้งที่ออกแบบและที่เก็บข้อมูล
- วิธีการจัดตำแหน่ง/ขนาดองค์ประกอบ UI รอบการควบคุม Roblox ที่สร้างไว้ล่วงหน้าและรอยบาก/เกาะของอุปกรณ์ เช่น รอยบากกล้องบนโทรศัพท์รุ่นใหม่
- วิธีการแทนที่มิเตอร์สุขภาพเริ่มต้นของ Roblox ด้วยมิเตอร์ของคุณเองและเชื่อมต่อกับระดับสุขภาพของตัวละคร
- วิธีการทำให้ส่วนกลางของมิเตอร์สุขภาพเคลื่อนไหวและตั้งค่าสีระหว่างจุดกุญแจสีห้าจุด (แดง ส้ม เหลือง ไลม์ เขียว)
เปิดใช้งาน Device Emulator
Roblox มีความสามารถในการ ข้ามแพลตฟอร์ม โดยผู้เล่นสามารถค้นหาและเข้าร่วมเกมบนโทรศัพท์หรือแท็บเล็ตของพวกเขา จากนั้นกลับมาทำต่อจากที่พวกเขาหยุดไว้บน PC หรือคอนโซลของพวกเขา อุปกรณ์เคลื่อนที่ (โทรศัพท์และแท็บเล็ต) มีพื้นที่หน้าจอน้อยที่สุด ดังนั้นจึงสำคัญที่องค์ประกอบ UI ของคุณจะต้องพอดีกับหน้าจอขนาดเล็กและมองเห็นได้ชัดเจนสำหรับผู้เล่น
วิธีที่ดีที่สุดในการทดสอบการออกแบบ UI ข้ามแพลตฟอร์มคือ Device Emulator ของ Studio เครื่องมือนี้มีการเลือกอุปกรณ์ที่ตั้งไว้ล่วงหน้าและอนุญาตให้คุณเพิ่มการตั้งค่าที่กำหนดเองของคุณเอง
เปิดเทมเพลต Hazardous Space Station ใน Studio
จากเมนู Test ของ Studio ให้เปิดใช้งาน Device Emulator
จากแถบที่อยู่เหนือมุมมองหลัก ให้เลือกการจำลองโทรศัพท์ เช่น iPhone X หรือ Samsung Galaxy A51 จากนั้นตั้งค่าขนาดมุมมองเป็น Fit to Window เพื่อใช้พื้นที่สูงสุดใน Studio

สร้างคอนเทนเนอร์หน้าจอ
คอนเทนเนอร์ ScreenGui จะเก็บวัตถุ UI (GuiObjects) เพื่อแสดงบนหน้าจอของผู้เล่น (ในบทช่วยสอนนี้คือมิเตอร์สุขภาพทั้งหมด) เพื่อแสดง ScreenGui และวัตถุเด็กของมันให้กับผู้เล่นทุกคนที่เข้าร่วมเกม ให้วางมันไว้ภายในคอนเทนเนอร์ StarterGui เมื่อผู้เล่นเข้าร่วมและตัวละครของพวกเขาเกิดขึ้นครั้งแรก ScreenGui และเนื้อหาของมันจะถูกโคลนไปยังคอนเทนเนอร์ PlayerGui สำหรับผู้เล่นนั้น ซึ่งตั้งอยู่ภายในคอนเทนเนอร์ Players

เพื่อแทรก ScreenGui ที่ว่างเปล่า:
ในหน้าต่าง Explorer ให้ค้นหาคอนเทนเนอร์ StarterGui

เลื่อนเมาส์ไปที่คอนเทนเนอร์ คลิกที่ปุ่ม ⊕ และแทรก ScreenGui

เปลี่ยนชื่อคอนเทนเนอร์ใหม่เป็น HUDContainer เพื่อสะท้อนถึงวัตถุประสงค์ของมัน

ใช้พื้นที่ปลอดภัย
โทรศัพท์รุ่นใหม่ใช้ประโยชน์จากหน้าจอทั้งหมด แต่โดยทั่วไปจะมีรอยบาก การตัด และองค์ประกอบอื่น ๆ ที่ใช้พื้นที่หน้าจอ เกม Roblox ทุกเกมยังรวมถึง การควบคุมแถบด้านบน สำหรับการเข้าถึงเมนูหลักอย่างรวดเร็ว แชท, กระดานผู้นำ และอื่น ๆ

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

ในขณะที่ค่าเริ่มต้นของ CoreUISafeInsets ทำให้แน่ใจว่าวัตถุ UI ทั้งหมดจะอยู่ห่างจาก UI ของ Roblox และการตัดของอุปกรณ์ DeviceSafeInsets อาจเป็นตัวเลือกที่ดีกว่าในการใช้พื้นที่หน้าจอที่จำกัด ตามที่แสดงด้านล่าง

ในหน้าต่าง Explorer ให้เลือก HUDContainer

ในหน้าต่าง Properties ให้ตั้งค่าคุณสมบัติ ScreenInsets เป็น DeviceSafeInsets

ตั้งค่าการpadding ขอบ
เมื่อ ScreenInsets ตั้งค่าเป็น DeviceSafeInsets เนื้อหาสามารถขยายไปยังขอบด้านบนของหน้าจอได้โดยตรง อย่างไรก็ตาม การมี padding เล็กน้อยสามารถช่วยดันมิเตอร์สุขภาพ (และวัตถุอื่น ๆ ภายในคอนเทนเนอร์) ออกห่างจากขอบหน้าจอเพื่อให้มีลักษณะที่สะอาดขึ้นและป้องกันไม่ให้ถูกตัดออก

วิธีหนึ่งในการใช้ padding กับคอนเทนเนอร์ UI คือการแทรกตัวปรับ UIPadding:
แทรกตัวปรับ UIPadding ลงใน HUDContainer

เมื่อเลือกวัตถุ UIPadding ใหม่ ให้ป้อนค่า 0, 16 สำหรับขอบทั้งหมดของคอนเทนเนอร์ (PaddingBottom, PaddingLeft, PaddingRight, PaddingTop) ซึ่งจะใช้ padding ขนาด 16 พิกเซลรอบ ๆ คอนเทนเนอร์ โดยไม่คำนึงถึงความละเอียดของหน้าจอ

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

สร้างกรอบหลัก
คล้ายกับแอปพลิเคชันการออกแบบเช่น Figma และ Photoshop Frame ใน Roblox ทำหน้าที่เป็นคอนเทนเนอร์สำหรับวัตถุ UI อื่น ๆ สำหรับบทช่วยสอนนี้ มิเตอร์สุขภาพทั้งหมดจะถูกเก็บไว้ในกรอบหลักเดียว ทำให้สามารถเปลี่ยนตำแหน่งได้ง่ายในเลย์เอาต์ HUD ที่หลากหลาย
เปลี่ยนชื่ออินสแตนซ์กรอบใหม่เป็น MeterBar

จัดตำแหน่งกรอบ
ใน Roblox ตำแหน่งของวัตถุ UI จะถูกแทนที่ด้วยชุดพิกัด UDim2 ที่ประกอบด้วยค่า Scale และ Offset สำหรับทั้งแกน X และ Y:


เพื่อจัดตำแหน่งวัตถุ UI ในมุมขวาบนของคอนเทนเนอร์หน้าจอ Scale เป็นวิธีที่ดีที่สุดเพราะค่า X ที่เป็น 1 (100%) แสดงถึงขอบด้านขวาของคอนเทนเนอร์ โดยไม่คำนึงถึงขนาดพิกเซลจริงของหน้าจอ ในทำนองเดียวกัน ค่า Y ที่เป็น 0 (0%) แสดงถึงขอบด้านบนของคอนเทนเนอร์

นอกจากนี้ คุณจะต้องตั้งค่าจุด จุดยึด มุมขวาบนสำหรับกรอบหลักเพื่อกำหนดจุดกำเนิดของมัน ค่าที่ยอมรับได้อยู่ระหว่าง 0 และ 1 ซึ่งสัมพันธ์กับขนาดของวัตถุ ดังนั้นค่าจุดยึด 1, 0 จะทำให้จุดยึดของกรอบอยู่ในมุมขวาบนของมัน

ในหน้าต่าง Explorer ให้เลือกกรอบ MeterBar ที่คุณแทรกไว้ก่อนหน้านี้

ป้อน 1, 0 สำหรับคุณสมบัติ AnchorPoint กรอบควรอยู่ในมุมขวาบนของ พื้นที่ปลอดภัยของอุปกรณ์ โดยมีการเว้นระยะเล็กน้อยจากขอบเนื่องจาก padding

เปลี่ยนขนาดกรอบ
เช่นเดียวกับตำแหน่ง ขนาดของ Size ของวัตถุ UI จะถูกแทนที่ด้วยชุดพิกัด UDim2 ที่ประกอบด้วยค่า Scale และ Offset สำหรับทั้งแกน X และ Y
โดยค่าเริ่มต้น ขนาดของกรอบใหม่คือ {0, 100},{0, 100} ซึ่งหมายถึง 100 พิกเซล ทั้งในความกว้าง (X) และความสูง (Y) ในขณะที่ค่าพิกเซลที่เข้มงวดมีประโยชน์ในบางกรณี แต่หลายองค์ประกอบ UI จะปรับขนาดได้อย่างตอบสนองมากขึ้นข้ามหน้าจอหลายขนาดเมื่อกำหนดเป็น เปอร์เซ็นต์ ของขนาดคอนเทนเนอร์หน้าจอทั้งหมด
เมื่อเลือกกรอบ MeterBar ให้เข้าถึงหน้าต่าง Properties และไปที่คุณสมบัติ Size
ป้อนค่า 0.35, 0, 0.05, 0 เพื่อกำหนดขนาดเปอร์เซ็นต์เป็น 35% กว้างและ 5% สูงโดยไม่มีการเลื่อนพิกเซลเพิ่มเติม

สไตล์กรอบ
โดยค่าเริ่มต้น Frames จะถูกเติมด้วยสีขาวทึบ มิเตอร์สุขภาพสุดท้ายควรมีการเติมที่มืดกว่าและมีความทึบเล็กน้อย รวมถึงขอบมืด เพื่อให้มันโดดเด่นมากขึ้นบนพื้นหลังที่สว่างและมืด

เมื่อเลือกกรอบ MeterBar ให้ป้อน 0 สำหรับคุณสมบัติ BackgroundColor3 Studio จะเปลี่ยนเป็นค่า RGB ของ [0, 0, 0] โดยอัตโนมัติ
ป้อน 0.75 สำหรับคุณสมบัติ BackgroundTransparency ใน Roblox ความทึบจะอยู่ในช่วง 0 สำหรับทึบสนิทถึง 1 สำหรับโปร่งใสสนิท ดังนั้น 0.75 จึงเท่ากับ 25% ความทึบในแอปพลิเคชันอื่น ๆ เช่น Figma หรือ Photoshop

แทรกวัตถุ UIStroke ซึ่งเป็นตัวปรับ UI ที่ทรงพลังซึ่งเพิ่ม เส้นขอบที่ปรับแต่งได้ ให้กับกรอบ

เมื่อเลือก UIStroke ใหม่ ให้ตั้งค่าคุณสมบัติดังต่อไปนี้:
- Thickness = 3
- Transparency = 0.25 (ทึบ 75%)

เพื่อทำให้การออกแบบกรอบมิเตอร์เสร็จสมบูรณ์ คุณสามารถทำให้มุมโค้งเพื่อสร้างรูปร่าง "แผ่น" แทนที่จะเป็นสี่เหลี่ยมมุมแหลม
แทรกอินสแตนซ์ UICorner ลงในกรอบ MeterBar

เมื่อเลือกตัวปรับ UICorner ใหม่ ให้ตั้งค่าคุณสมบัติ CornerRadius เป็น 0.5, 0 การใช้ค่า สเกล ที่เป็น 0.5 (50%) แทนค่าพิกเซลนั้นสะดวกโดยเฉพาะสำหรับแถบมิเตอร์เพราะมันทำให้แน่ใจว่ามีการโค้งที่สมบูรณ์ไม่ว่าจะสูงหรือต่ำเพียงใด

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

แทรก Frame เป็นลูกลงในกรอบ MeterBar
เปลี่ยนชื่ออินสแตนซ์กรอบใหม่เป็น InnerFill

เมื่อเลือก InnerFill ให้ตั้งค่าคุณสมบัติดังต่อไปนี้:
- AnchorPoint = 0, 0.5 (ขอบซ้ายและศูนย์แนวตั้ง)
- Position = 0, 0, 0.5, 0
- Size = 1, 0, 1, 0
เนื่องจากลูกของกรอบจะถูกจัดตำแหน่งและขนาดสัมพันธ์กับพ่อแม่ การใช้สเกลทำให้กรอบภายในเติมเต็มความกว้างและความสูงทั้งหมดของพ่อแม่ โดยเริ่มจากขอบซ้ายของพ่อแม่

เพื่อให้ตรงกับรูปร่าง "แผ่น" ของกรอบหลัก ให้แทรก UICorner เพิ่มเติมลงใน InnerFill

เมื่อเลือกตัวปรับ UICorner ใหม่ ให้ตั้งค่าคุณสมบัติ CornerRadius เป็น 0.5, 0 เพื่อให้ตรงกับรูปร่าง "แผ่น" ของกรอบหลัก MeterBar

เพื่อแสดงให้เห็นว่ามิเตอร์เต็มหมายถึงสุขภาพที่ดี ให้เลือก InnerFill และตั้งค่าคุณสมบัติ BackgroundColor3 เป็น [0, 225, 50] (ในงานถัดไป คุณจะ เขียนสคริปต์ สีนี้ให้เปลี่ยนตามสุขภาพที่แท้จริง)

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

แทรก ImageLabel ลงในกรอบ MeterBar วัตถุนี้ช่วยให้คุณใช้แอสเซ็ตภาพ 2D ที่ถูกอัปโหลดเป็น decal ไปยัง Roblox
เปลี่ยนชื่ออินสแตนซ์ป้ายใหม่เป็น Icon

เมื่อเลือก Icon ให้ตั้งค่าคุณสมบัติ ZIndex เป็น 2 ในขณะที่วัตถุ UI ที่แทรกใหม่จะอยู่ด้านหน้าของวัตถุที่แทรกก่อนหน้านี้เสมอ การเปลี่ยนแปลงนี้ทำให้แน่ใจว่าไอคอนจะแสดงอยู่ด้านหน้าขององค์ประกอบกรอบมิเตอร์เสมอ

เพื่อให้แน่ใจว่า ImageLabel ของไอคอนจะคงอัตราส่วน 1:1 เสมอ ให้แทรก UIAspectRatioConstraint แม้ว่าตัว ข้อจำกัด นี้มีคุณสมบัติที่ปรับแต่งได้เพื่อควบคุมอัตราส่วน แต่คุณสามารถปล่อยให้ค่าดีฟอลต์อยู่ในสถานะเดิมได้

เมื่อเลือก Icon ให้ทำให้รูปลักษณ์และตำแหน่งเสร็จสมบูรณ์โดยการเปลี่ยนคุณสมบัติดังต่อไปนี้:
- AnchorPoint = 0.5, 0.5 (จุดยึดกลาง)
- BackgroundTransparency = 1 (โปร่งใส 100%)
- Position = 0, 0, 0.5, 0 (ด้านซ้ายของมิเตอร์และศูนย์แนวตั้ง)

จำกัดขนาด
ในขณะที่ ความสูงสเกล ของ 0.05 (5%) ดูดีบนหน้าจอโทรศัพท์รุ่นใหม่และจอเกมที่มีอัตราส่วน 16:9 หรือกว้างกว่า มิเตอร์อาจดูสูงเกินไปเล็กน้อยบนหน้าจอแท็บเล็ตและโทรศัพท์รุ่นเก่า คุณสามารถตรวจสอบสิ่งนี้ได้โดยการจำลองแท็บเล็ตเช่น iPad 7th Generation จาก Device Emulator


เพื่อให้ความสูงของแถบมิเตอร์มีความสอดคล้องมากขึ้นกับหน้าจอที่กว้างขึ้น คุณสามารถใช้ UISizeConstraint เพื่อจำกัดความสูงพิกเซลสูงสุด
แทรก UISizeConstraint ลงในกรอบ MeterBar

เมื่อเลือกข้อจำกัดใหม่ ให้ตั้งค่าคุณสมบัติ MaxSize เป็น inf, 20 เพื่อจำกัดความสูงไว้ที่ 20 พิกเซลในขณะที่บังคับไม่ให้มีการจำกัดความกว้าง

ตอนนี้ แถบมิเตอร์จะรักษาความสูงที่สอดคล้องกันมากขึ้นระหว่างหน้าจอที่กว้างและสูง

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

ปิดมิเตอร์เริ่มต้น
เพื่อปิดมิเตอร์สุขภาพเริ่มต้น คุณจะใช้ สคริปต์ไคลเอนต์ (LocalScript) ภายใน StarterPlayerScripts ที่เรียกใช้ StarterGui:SetCoreGuiEnabled()
ในหน้าต่าง Explorer ขยายคอนเทนเนอร์ StarterPlayer และค้นหาคอนเทนเนอร์ StarterPlayerScripts ภายใน

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

เมื่อคุณแทรกสคริปต์ใหม่ มันจะเปิดในแท็บตัวแก้ไขสคริปต์ใหม่โดยอัตโนมัติ (หากไม่เปิด ให้ดับเบิลคลิกที่สคริปต์ในหน้าต่าง Explorer)
วางโค้ดต่อไปนี้ภายในสคริปต์ HideDefaultHealthMeter:
HideDefaultHealthMeterlocal StarterGui = game:GetService("StarterGui")-- ซ่อนมิเตอร์สุขภาพเริ่มต้นStarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Health, false)คำอธิบายโค้ดบรรทัด วัตถุประสงค์ 1 ได้รับการอ้างอิงถึง บริการ หลัก StarterGui ซึ่งแสดงถึงคอนเทนเนอร์เดียวกันที่คุณสร้างมิเตอร์สุขภาพที่กำหนดเองและเนื้อหาของมันจะถูกโคลนไปยังคอนเทนเนอร์ PlayerGui สำหรับผู้เล่นแต่ละคนที่เข้าร่วมเกม 4 เรียกใช้วิธี SetCoreGuiEnabled() ของบริการและสั่งให้มิเตอร์สุขภาพเริ่มต้นถูกปิดใช้งาน (false)
หากคุณทดสอบเกมตอนนี้และได้รับความเสียหาย คุณจะสังเกตเห็นว่ามิเตอร์เริ่มต้นถูกปิดใช้งานและซ่อน (คุณจะเขียนสคริปต์มิเตอร์ที่กำหนดเองเพื่อ สะท้อนการเปลี่ยนแปลงสุขภาพ ในส่วนถัดไป)

ฟังการเปลี่ยนแปลงสุขภาพ
โมเดลตัวละครเริ่มต้นของ Roblox ทุกตัวมีคลาส Humanoid ซึ่งให้พฤติกรรมและฟังก์ชันพิเศษแก่ตัวละคร เช่น การตั้งค่าความเร็วในการเดิน/วิ่งและการจัดการสุขภาพ Health จะเปลี่ยนแปลงบนเซิร์ฟเวอร์ ทำซ้ำ ไปยังไคลเอนต์ของผู้เล่นแต่ละคนและคุณสามารถตรวจจับการเปลี่ยนแปลงเหล่านี้เพื่ออัปเดตทั้งขนาดและสีของมิเตอร์สุขภาพที่กำหนดเอง
ในหน้าต่าง Explorer ให้ค้นหาคอนเทนเนอร์ StarterCharacterScripts ภายใน StarterPlayer

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

ในหน้าต่างแก้ไขสำหรับสคริปต์ UpdateCustomMeter ให้วางโค้ดต่อไปนี้:
UpdateCustomMeterlocal Players = game:GetService("Players")-- อ้างอิงถึงผู้เล่นท้องถิ่น ตัวละคร และมนุษย์local player = Players.LocalPlayerlocal character = player.Characterlocal humanoid = character:WaitForChild("Humanoid")-- อ้างอิงถึงกรอบการเติมมิเตอร์local playerGui = player:WaitForChild("PlayerGui")local meterBarInner = playerGui.HUDContainer.MeterBar.InnerFill-- สีในลำดับเกรเดียนต์ (แดง ส้ม เหลือง ไลม์ เขียว)local gradient = {Color3.fromRGB(225, 50, 0),Color3.fromRGB(255, 100, 0),Color3.fromRGB(255, 200, 0),Color3.fromRGB(150, 225, 0),Color3.fromRGB(0, 225, 50)}-- ฟังก์ชันเพื่อรับสีในลำดับเกรเดียนต์จากจุดเศษส่วนlocal function getColorFromSequence(fraction: number): Color3-- สีแต่ละสีในเกรเดียนต์กำหนดจุดเริ่มต้นและ/หรือจุดสิ้นสุดของส่วนlocal numSections = #gradient - 1-- แต่ละส่วนแสดงถึงส่วนหนึ่งของ 1local sectionSize = 1 / numSections-- กำหนดว่าส่วนใดที่เศษส่วนที่ร้องขออยู่ในlocal sectionStartIndex = 1 + math.clamp(fraction, 0, 1) // sectionSize-- รับสีที่จุดเริ่มต้นและสิ้นสุดของส่วนlocal sectionColorStart = gradient[sectionStartIndex]local sectionColorEnd = gradient[sectionStartIndex + 1] or sectionColorStart-- ทำให้เศษส่วนเป็นหมายเลขจาก 0 ถึง 1 ภายในส่วนlocal fractionOfSection = math.clamp(fraction, 0, 1) % sectionSize / sectionSize-- Lerp ระหว่างจุดเริ่มต้นและจุดสิ้นสุดตามเศษส่วนที่ทำให้เป็นปกติreturn sectionColorStart:Lerp(sectionColorEnd, fractionOfSection)endlocal function onHealthChanged()-- คำนวณสุขภาพใหม่เป็นเปอร์เซ็นต์ของสูงสุดlocal healthFraction = math.max(0, humanoid.Health / humanoid.MaxHealth)-- ตั้งค่ามิเตอร์ให้มีขนาด/สีใหม่meterBarInner.Size = UDim2.new(healthFraction, 0, 1, 0)meterBarInner.BackgroundColor3 = getColorFromSequence(healthFraction)end-- ฟังการเปลี่ยนแปลงสุขภาพของมนุษย์humanoid.HealthChanged:Connect(onHealthChanged)-- ตั้งค่าขนาด/สีของมิเตอร์ให้ตรงกับสุขภาพปัจจุบันonHealthChanged()คำอธิบายโค้ดบรรทัด วัตถุประสงค์ 4‑6 ได้รับการอ้างอิงถึง Player ท้องถิ่น โมเดล Character ของพวกเขา และคลาส Humanoid ภายใน 9‑10 ได้รับการอ้างอิงถึงวัตถุ InnerFill ของมิเตอร์ซึ่งต้องปรับขนาดและเปลี่ยนสีเมื่อสุขภาพของตัวละครเปลี่ยนแปลง 13‑19 ประกาศอาร์เรย์ของสีห้าสี (แดง ส้ม เหลือง ไลม์ เขียว) เพื่อเปลี่ยนสีมิเตอร์ที่จุดต่าง ๆ เช่น สีเขียวสำหรับสุขภาพ 100% สีเหลืองสำหรับ 50% สีแดงสำหรับ 0% หรือการผสมที่ใด ๆ ระหว่างจุดกุญแจ 22‑41 ฟังก์ชันช่วยซึ่งส่งคืนการผสมสีระหว่างจุดสีในเกรเดียนต์ใด ๆ 43‑50 ฟังก์ชันที่จัดการการเปลี่ยนแปลงใด ๆ ในสุขภาพ ที่นี่มันคำนวณสุขภาพใหม่เป็นเปอร์เซ็นต์ของ MaxHealth ของตัวละคร ปรับขนาด InnerFill ให้ตรงกับเปอร์เซ็นต์นั้น และเปลี่ยนสีให้ตรงกับสีที่ส่งคืนจากฟังก์ชัน getColorFromSequence() 53 การเชื่อมต่อ เหตุการณ์ หลักที่ตรวจจับการเปลี่ยนแปลง Health ที่ทำซ้ำจากเซิร์ฟเวอร์และเรียกใช้ฟังก์ชัน onHealthChanged() 56 ตั้งค่า (หรือรีเซ็ต) ขนาด/สีของมิเตอร์ให้ตรงกับสุขภาพปัจจุบันในตอนแรก (เมื่อเกิดตัวละครหรือเกิดใหม่) โดยปกติจะเป็นความกว้างเต็มและสีเขียว
หากคุณทดสอบเกมตอนนี้ คุณจะสังเกตเห็นว่ามิเตอร์ที่กำหนดเองจะอัปเดตทั้งขนาดและสีเมื่อได้รับความเสียหาย:
ทำให้มิเตอร์บาร์เคลื่อนไหว
เพื่อเพิ่มระดับความเรียบร้อยให้กับมิเตอร์ที่กำหนดเอง คุณสามารถทำให้การเปลี่ยนแปลงสุขภาพเคลื่อนไหวผ่าน tweening โดยค่อย ๆ เปลี่ยนขนาดและสีของมิเตอร์บาร์ในช่วงเวลา ½ วินาที
เข้าถึงแท็บตัวแก้ไขสคริปต์สำหรับสคริปต์ UpdateCustomMeter ที่คุณแก้ไขไว้ก่อนหน้านี้
เลือกบรรทัดทั้งหมด (CtrlA หรือ ⌘A) และจากนั้นวางทับด้วย (CtrlV หรือ ⌘V) ด้วยโค้ดต่อไปนี้:
UpdateCustomMeterlocal Players = game:GetService("Players")local TweenService = game:GetService("TweenService")-- อ้างอิงถึงผู้เล่นท้องถิ่น ตัวละคร และมนุษย์local player = Players.LocalPlayerlocal character = player.Characterlocal humanoid = character:WaitForChild("Humanoid")-- คุณสมบัติของ Tweenlocal tweenInfo = TweenInfo.new(0.5, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out)-- อ้างอิงถึงกรอบการเติมมิเตอร์local playerGui = player:WaitForChild("PlayerGui")local meterBarInner = playerGui.HUDContainer.MeterBar.InnerFill-- สีในลำดับเกรเดียนต์ (แดง ส้ม เหลือง ไลม์ เขียว)local gradient = {Color3.fromRGB(225, 50, 0),Color3.fromRGB(255, 100, 0),Color3.fromRGB(255, 200, 0),Color3.fromRGB(150, 225, 0),Color3.fromRGB(0, 225, 50)}-- ฟังก์ชันเพื่อรับสีในลำดับเกรเดียนต์จากจุดเศษส่วนlocal function getColorFromSequence(fraction: number): Color3-- สีแต่ละสีในเกรเดียนต์กำหนดจุดเริ่มต้นและ/หรือจุดสิ้นสุดของส่วนlocal numSections = #gradient - 1-- แต่ละส่วนแสดงถึงส่วนหนึ่งของ 1local sectionSize = 1 / numSections-- กำหนดว่าส่วนใดที่เศษส่วนที่ร้องขออยู่ในlocal sectionStartIndex = 1 + math.clamp(fraction, 0, 1) // sectionSize-- รับสีที่จุดเริ่มต้นและสิ้นสุดของส่วนlocal sectionColorStart = gradient[sectionStartIndex]local sectionColorEnd = gradient[sectionStartIndex + 1] or sectionColorStart-- ทำให้เศษส่วนเป็นหมายเลขจาก 0 ถึง 1 ภายในส่วนlocal fractionOfSection = math.clamp(fraction, 0, 1) % sectionSize / sectionSize-- Lerp ระหว่างจุดเริ่มต้นและจุดสิ้นสุดตามเศษส่วนที่ทำให้เป็นปกติreturn sectionColorStart:Lerp(sectionColorEnd, fractionOfSection)endlocal function onHealthChanged()-- คำนวณสุขภาพใหม่เป็นเปอร์เซ็นต์ของสูงสุดlocal healthFraction = math.max(0, humanoid.Health / humanoid.MaxHealth)-- Tween มิเตอร์ไปยังขนาด/สีใหม่local tweenGoal = {Size = UDim2.new(healthFraction, 0, 1, 0),BackgroundColor3 = getColorFromSequence(healthFraction)}local meterBarTween = TweenService:Create(meterBarInner, tweenInfo, tweenGoal)meterBarTween:Play()end-- ฟังการเปลี่ยนแปลงสุขภาพของมนุษย์humanoid.HealthChanged:Connect(onHealthChanged)-- ตั้งค่าขนาด/สีของมิเตอร์ให้ตรงกับสุขภาพปัจจุบันonHealthChanged()การเพิ่ม/เปลี่ยนแปลงที่สำคัญบรรทัด วัตถุประสงค์ 2 ได้รับการอ้างอิงถึง TweenService เพื่อใช้ฟังก์ชันการทำให้เคลื่อนไหวภายในสคริปต์ 10 สร้างตัวสร้าง TweenInfo ซึ่งกำหนดระยะเวลาของการทำให้เคลื่อนไหว สไตล์การทำให้เคลื่อนไหว และ ทิศทางการทำให้เคลื่อนไหว 52‑57 แทนที่จะตั้งค่าขนาดและสีของมิเตอร์อย่างง่าย ๆ ตาม เวอร์ชันก่อนหน้า ประกาศตาราง tweenGoal ที่มีขนาด/สีเป้าหมาย สร้างการทำให้เคลื่อนไหวใหม่โดยใช้พารามิเตอร์ tweenInfo และ tweenGoal และเล่นการทำให้เคลื่อนไหวใหม่
หากคุณทดสอบเกมตอนนี้ คุณจะสังเกตเห็นว่ามิเตอร์ที่กำหนดเองจะเคลื่อนไหวระหว่างการเปลี่ยนแปลงสุขภาพแต่ละครั้ง:
เพิ่มเอฟเฟกต์ความเสียหาย
ระบบมิเตอร์สุขภาพเริ่มต้นรวมถึงการเปลี่ยนสีแดงที่ละเอียดอ่อนที่ขอบหน้าจอเมื่อได้รับความเสียหาย โดยการ ปิดมิเตอร์เริ่มต้น เอฟเฟกต์นี้จะถูกลบออก แต่คุณสามารถแทนที่ด้วยการใช้งานของคุณเอง
เข้าถึงแท็บตัวแก้ไขสคริปต์สำหรับสคริปต์ UpdateCustomMeter ที่คุณแก้ไขไว้ก่อนหน้านี้
เลือกบรรทัดทั้งหมดและวางทับด้วยโค้ดต่อไปนี้:
UpdateCustomMeterlocal Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local TweenService = game:GetService("TweenService")-- อ้างอิงถึงผู้เล่นท้องถิ่น ตัวละคร และมนุษย์local player = Players.LocalPlayerlocal character = player.Characterlocal humanoid = character:WaitForChild("Humanoid")-- คุณสมบัติของ Tweenlocal tweenInfo = TweenInfo.new(0.5, Enum.EasingStyle.Exponential, Enum.EasingDirection.Out)-- ตัวแปรเพื่อเก็บ/แคชสุขภาพของตัวละครlocal cachedHealth = humanoid.Health / humanoid.MaxHealth-- รับ (หรือสร้างใหม่) เอฟเฟกต์การปรับสีภายในกล้องของผู้เล่นlocal colorCorrection = Workspace.CurrentCamera:FindFirstChildWhichIsA("ColorCorrectionEffect") or Instance.new("ColorCorrectionEffect", Workspace.CurrentCamera)colorCorrection.Name = "DamageColorEffect"-- อ้างอิงถึงกรอบการเติมมิเตอร์local playerGui = player:WaitForChild("PlayerGui")local meterBarInner = playerGui.HUDContainer.MeterBar.InnerFill-- สีในลำดับเกรเดียนต์ (แดง ส้ม เหลือง ไลม์ เขียว)local gradient = {Color3.fromRGB(225, 50, 0),Color3.fromRGB(255, 100, 0),Color3.fromRGB(255, 200, 0),Color3.fromRGB(150, 225, 0),Color3.fromRGB(0, 225, 50)}-- ฟังก์ชันเพื่อรับสีในลำดับเกรเดียนต์จากจุดเศษส่วนlocal function getColorFromSequence(fraction: number): Color3-- สีแต่ละสีในเกรเดียนต์กำหนดจุดเริ่มต้นและ/หรือจุดสิ้นสุดของส่วนlocal numSections = #gradient - 1-- แต่ละส่วนแสดงถึงส่วนหนึ่งของ 1local sectionSize = 1 / numSections-- กำหนดว่าส่วนใดที่เศษส่วนที่ร้องขออยู่ในlocal sectionStartIndex = 1 + math.clamp(fraction, 0, 1) // sectionSize-- รับสีที่จุดเริ่มต้นและสิ้นสุดของส่วนlocal sectionColorStart = gradient[sectionStartIndex]local sectionColorEnd = gradient[sectionStartIndex + 1] or sectionColorStart-- ทำให้เศษส่วนเป็นหมายเลขจาก 0 ถึง 1 ภายในส่วนlocal fractionOfSection = math.clamp(fraction, 0, 1) % sectionSize / sectionSize-- Lerp ระหว่างจุดเริ่มต้นและจุดสิ้นสุดตามเศษส่วนที่ทำให้เป็นปกติreturn sectionColorStart:Lerp(sectionColorEnd, fractionOfSection)endlocal function onHealthChanged()-- คำนวณสุขภาพใหม่เป็นเปอร์เซ็นต์ของสูงสุดlocal healthFraction = math.max(0, humanoid.Health / humanoid.MaxHealth)-- Tween มิเตอร์ไปยังขนาด/สีใหม่local tweenGoal = {Size = UDim2.new(healthFraction, 0, 1, 0),BackgroundColor3 = getColorFromSequence(healthFraction)}local meterBarTween = TweenService:Create(meterBarInner, tweenInfo, tweenGoal)meterBarTween:Play()-- แสดงเอฟเฟกต์ความเสียหายหากสุขภาพใหม่ต่ำกว่าค่าที่เก็บไว้if healthFraction < cachedHealth then-- แคชค่าความเสียหายใหม่cachedHealth = healthFraction-- ตั้งค่าให้การปรับสีเป็นสีแดงในฐานะการเปลี่ยนสีเริ่มต้นก่อนการทำให้เคลื่อนไหวcolorCorrection.TintColor = Color3.fromRGB(255, 25, 25)colorCorrection.Saturation = 2.5-- Tween การเปลี่ยนสีกลับไปที่สีขาว (เป็นกลางและไม่มีการเปลี่ยนสีจากปกติ)local colorCorrectionTweenGoal = {TintColor = Color3.fromRGB(255, 255, 255),Saturation = 0}local colorCorrectionTween = TweenService:Create(colorCorrection, tweenInfo, colorCorrectionTweenGoal)colorCorrectionTween:Play()endend-- ฟังการเปลี่ยนแปลงสุขภาพของมนุษย์humanoid.HealthChanged:Connect(onHealthChanged)-- ตั้งค่าขนาด/สีของมิเตอร์ให้ตรงกับสุขภาพปัจจุบันonHealthChanged()การเพิ่ม/เปลี่ยนแปลงที่สำคัญบรรทัด วัตถุประสงค์ 14 ตั้งค่าการอ้างอิงชั่วคราว (cachedHealth) เพื่อติดตามจำนวนสุขภาพของตัวละครระหว่างการเปลี่ยนแปลง เพื่อให้คุณสามารถเปรียบเทียบว่าการเปลี่ยนแปลงนั้นต่ำกว่า (ความเสียหาย) 17‑18 เมื่อเกิดตัวละครครั้งแรก สร้าง ColorCorrectionEffect ใหม่ภายใน Camera ของผู้เล่น หรือรับการอ้างอิงถึงอินสแตนซ์เดียวกันในระหว่างการเกิดใหม่ในภายหลัง โดยการตั้งค่าตัว เอฟเฟกต์การประมวลผลหลัง นี้ให้กับกล้องของผู้เล่น มันจะใช้เฉพาะกับหน้าจอท้องถิ่นของพวกเขา ไม่ใช่หน้าจอของผู้เล่นทุกคนในเซิร์ฟเวอร์ 68‑83 ทำการตรวจสอบเงื่อนไขเพื่อยืนยันว่าการเปลี่ยนแปลงสุขภาพต่ำกว่าค่าที่เก็บไว้ (cachedHealth) ซึ่งบ่งบอกถึงความเสียหาย หากเป็นเช่นนั้น ให้ตั้งค่า cachedHealth เป็นค่าที่ใหม่ ถัดไป ตั้งค่า ColorCorrectionEffect ให้เป็นสีแดง ([255, 25, 25]) พร้อมความอิ่มตัวที่สูงขึ้น จากนั้นทำให้การเปลี่ยนสีกลับไปที่สีขาวที่เป็นกลาง (([255, 255, 255])) โดยไม่มีความอิ่มตัว
หากคุณทดสอบเกมตอนนี้ คุณจะสังเกตเห็นว่าหน้าจอจะกระพริบเป็นสีแดงชั่วคราวเมื่อใดก็ตามที่ตัวละครได้รับความเสียหาย:

