Fallingเบื้องหลังการสร้าง
จากไอเดีย ภาพ และเสียง สู่ตัวเกมและการเผยแพร่ เลือกดูแต่ละช่วง พร้อมปัญหาที่เจอและวิธีที่ใช้แก้
ภาพประกอบภาพคอนเซปต์ที่แก้ชื่อและหน้าที่ของ Booster แล้ว ตัวเลขในภาพเป็นส่วนหนึ่งของ concept
สื่อประกอบ
แปลงภาพคอนเซปต์ให้เป็น asset ที่ตรงกับเกม
เริ่มจากอะไร
เริ่มจากเมืองและสิ่งของที่มีเรื่องราว แยกภาพคอนเซปต์เป็นฉาก ปุ่ม และรูปไอเทมที่เกมเรียกใช้งานได้จริง
ปัญหาที่เจอ
ภาพคอนเซปต์ใส่ Booster ที่ไม่มีในเกม เช่น Magnet และ Shield ถ้าทำตามภาพทันที จะได้กติกาที่ไม่ตรงกับแบบ
วิธีแก้
เทียบภาพกับกติกาก่อน แก้ Booster ให้ตรงของจริง แล้วจัดไอเทมแต่ละชิ้นลงช่องภาพที่กำหนดอย่างแน่นอน
- ตรวจ concept กับรายการ mechanic และ Booster จริงก่อนใช้เป็นแบบสร้าง UI
- สร้าง item เป็น transparent cutout รายชิ้น กำหนด art box และ padding ตามขนาด
- pack ลงกริด 5×5 แบบ deterministic แล้วส่ง rect และ pivot ที่แน่นอนให้ Unity
รายละเอียดเทคนิคและผลตรวจ
กระบวนการพัฒนา
งานภาพเริ่มจากเมืองอุตสาหกรรมและสิ่งของที่มีเรื่องราว ก่อนแยกออกเป็นฉาก ปุ่ม ไอคอน และ sprite ของ 452 items ที่อ้างอิงด้วย ID
- ตรวจ concept กับรายการ mechanic และ Booster จริงก่อนใช้เป็นแบบสร้าง UI
- สร้าง item เป็น transparent cutout รายชิ้น กำหนด art box และ padding ตามขนาด
- pack ลงกริด 5×5 แบบ deterministic แล้วส่ง rect และ pivot ที่แน่นอนให้ Unity
ปัญหาที่บันทึกไว้
ภาพ concept มี Magnet, Slow Time และ Shield ซึ่งไม่มีในเกม รวมถึงข้อความแต่งบนผนัง หากนำภาพไปสร้าง UI ตรง ๆ จะเพิ่ม mechanic ที่ไม่ได้ออกแบบไว้
วิธีแก้ในระบบ
แก้เฉพาะเนื้อหาที่ผิดเป็น 2× Coins, Soft Liner และ Contract Radar รักษาทิศทางภาพเดิม และไม่ให้ image model จัด sprite sheet สุดท้ายแทนตัว pack
ผลและขอบเขตการตรวจ
มี correction prompts และ manifest 22 sheets รองรับ 452 items ภาพประกอบเป็น concept หลังปรับ ไม่ใช่ screenshot ของ runtime
อ้างอิง: Docs/DesignConcepts/StoryGrounded/correction-prompts.md + Docs/SpriteSheets/item_sprite_sheet_manifest.md
เปลี่ยน UI แล้ว ต้องตามเสียงกลับมาให้ครบ
เริ่มจากอะไร
กำหนดเสียงให้แต่ละเหตุการณ์ ทั้งของตก เปิดเรื่องราว และตัวนับรางวัล แล้วตรวจว่า UI ใหม่เรียกเสียงเหล่านั้นจริง
ปัญหาที่เจอ
หลังเปลี่ยนระบบ UI เสียงบางเหตุการณ์ไม่ดัง แม้ไฟล์เสียงยังอยู่ เช่น สรุปไอเทม เปิดโบนัส และตัวนับรางวัล
วิธีแก้
ต่อเสียงกลับเข้ากับเหตุการณ์ของ UI ใหม่ รักษาจังหวะเสียงเดิม และแยกช่องที่ว่างตั้งแต่ต้นออกจากเสียงที่หายไป
- เทียบ SoundCueCatalog เดิมกับ cue ที่หน้าใหม่เรียกใช้งานจริง
- ตรวจไฟล์ว่า decode ได้ มีสัญญาณเสียง และ volume, pitch, cooldown ยังตรงต้นฉบับ
- ทดสอบว่า event เปิด AudioSource จริง พร้อม mute แยกเพลง/SFX และ duck/recovery
รายละเอียดเทคนิคและผลตรวจ
กระบวนการพัฒนา
การย้าย frontend ไป UI Toolkit ต้องรักษา cue เดิมทั้งเพลง เอฟเฟกต์ story และตัวนับรางวัล การมีไฟล์เสียงอยู่ในโปรเจกต์ไม่ได้แปลว่าหน้าใหม่เรียกใช้อยู่
- เทียบ SoundCueCatalog เดิมกับ cue ที่หน้าใหม่เรียกใช้งานจริง
- ตรวจไฟล์ว่า decode ได้ มีสัญญาณเสียง และ volume, pitch, cooldown ยังตรงต้นฉบับ
- ทดสอบว่า event เปิด AudioSource จริง พร้อม mute แยกเพลง/SFX และ duck/recovery
ปัญหาที่บันทึกไว้
เสียงบางเหตุการณ์ขาดการเชื่อมต่อ เช่น เปิดข้อความ story, แสดง item summary, ตัวนับยอดจ่าย และ panel โบนัส แม้ไฟล์กับ catalog เดิมยังอยู่
วิธีแก้ในระบบ
ต่อ cue กลับที่ state/event ของ UI ใหม่ ใช้ cooldown เดิมสำหรับตัวนับ และแยก 19 ช่องที่ว่างมาตั้งแต่ต้นออกจากเสียงที่หายเพราะ migration
ผลและขอบเขตการตรวจ
Audio audit 6 ต.ค. ระบุ 63 assigned cues จาก 36 ไฟล์ และผลรวม 32 passing tests แต่การบันทึกเสียงจาก A17 ไม่สำเร็จเพราะแบตเตอรี่ จึงไม่ใช้ผลนี้รับรองเสียงจากลำโพงมือถือ
อ้างอิง: Docs/AudioAudit-20261006.md
หมดเวลาแล้ว ฟิสิกส์ยังอยู่ในจังหวะสรุป
เริ่มจากอะไร
แยกช่วงรับของ หมดเวลา และรับรางวัล แล้วตรวจว่าฟิสิกส์กับของที่นับได้ยังสัมพันธ์กันตลอดรอบ
ปัญหาที่เจอ
ผู้เล่นพบของเด้งออกตอนลากตะกร้าตรงจังหวะหมดเวลา ตรวจพบว่าแรงประคองหยุดทันที แต่ฟิสิกส์ยังทำงานต่ออีกสามวินาทีก่อนนับของ
วิธีแก้
ให้แรงประคองของตะกร้าปกติและ Soft Liner ทำงานต่อในช่วงสรุป แล้วทดสอบต่อจนรับรางวัลและอัปเกรดได้
- แยกช่วงเล่น ช่วงหมดเวลา และการรับรางวัลเป็น state ที่ตรวจซ้ำได้
- ตรวจแรงชนและแรงประคองทั้งตะกร้าปกติและ Soft Liner ระหว่างเปลี่ยน state
- รันเส้นทางจากเล่นจน claim และ upgrade บน production scene
รายละเอียดเทคนิคและผลตรวจ
กระบวนการพัฒนา
เมื่อหมดเวลา ตะกร้าหยุดรับ input แต่ฟิสิกส์ของไอเทมยังทำงานอีกสามวินาทีก่อนนับของที่เหลือ งานแก้จึงต้องรักษาแรงประคองให้ต่อเนื่องตลอดช่วงนี้
- แยกช่วงเล่น ช่วงหมดเวลา และการรับรางวัลเป็น state ที่ตรวจซ้ำได้
- ตรวจแรงชนและแรงประคองทั้งตะกร้าปกติและ Soft Liner ระหว่างเปลี่ยน state
- รันเส้นทางจากเล่นจน claim และ upgrade บน production scene
ปัญหาที่บันทึกไว้
งานแก้รุ่น 18 ระบุให้แรงประคองตะกร้าคงทำงานตลอดช่วง ending presentation สามวินาที ไม่ให้ความรู้สึกของตะกร้าเปลี่ยนทันทีเพราะ timer หมด
วิธีแก้ในระบบ
รักษา normal/Soft Liner damping ในช่วงสรุป พร้อมเก็บค่า tuning ของ horizontal, upward และ angular retention ไว้กับ release source
ผลและขอบเขตการตรวจ
รายงานรุ่น 18 ระบุ regression และ production-scene journey ผ่าน 3/3 โดยไม่มีผลติดตั้งและวัด cold start บนเครื่องจริงใหม่ในรุ่นนี้
อ้างอิง: Docs/RunEndingPhysics-20261012.md + Docs/ProductionRelease-v18-20261013.md
ภาพประกอบภาพ QA ของหน้า Settings ภาษาไทยหลังปรับแถวปุ่ม ใช้ค่าในฉากทดสอบ
สื่อประกอบ
แก้แนวปุ่มที่คลาดกันจากกติกา layout
เริ่มจากอะไร
วางแนวปุ่มข้ามหน้าให้ใช้ขอบและช่องว่างเดียวกัน แล้วตรวจทั้งภาษาไทย อังกฤษ และหลายความกว้างจอ
ปัญหาที่เจอ
ปุ่ม Story ยื่นเกิน Workshop เพราะแต่ละแถวใช้ระยะห่างต่างกัน และปุ่มสุดท้ายยังมีขอบว่างเกินมา
วิธีแก้
แก้กติกาที่ใช้ร่วมกัน ให้คอลัมน์เท่ากันและเว้นระยะเฉพาะระหว่างปุ่ม จึงได้แนวตรงกันทั้งหลายหน้า
- ตรวจขอบซ้าย–ขวา ความกว้างคอลัมน์ และช่องว่างของแต่ละแถว
- ให้แต่ละคอลัมน์ flex เท่ากัน ใช้ minimum width เป็นศูนย์ และเว้น gap เฉพาะระหว่างปุ่ม
- ตรวจ geometry ข้ามหน้า ภาษา และความกว้าง รวมทั้งภาพที่รอ animation จบแล้ว
รายละเอียดเทคนิคและผลตรวจ
กระบวนการพัฒนา
เมนู Story, Workshop และปุ่มด้านล่างต้องใช้ขอบกับสัดส่วนเดียวกันทั้งภาษาไทย อังกฤษ และหลายความกว้าง การขยับเฉพาะปุ่มที่เห็นผิดจะไม่แก้สาเหตุร่วม
- ตรวจขอบซ้าย–ขวา ความกว้างคอลัมน์ และช่องว่างของแต่ละแถว
- ให้แต่ละคอลัมน์ flex เท่ากัน ใช้ minimum width เป็นศูนย์ และเว้น gap เฉพาะระหว่างปุ่ม
- ตรวจ geometry ข้ามหน้า ภาษา และความกว้าง รวมทั้งภาพที่รอ animation จบแล้ว
ปัญหาที่บันทึกไว้
ปุ่ม Story ยื่นเกิน Workshop เพราะแถวใช้ gap 6, 8 และ 10 หน่วยต่างกัน และปุ่มสุดท้ายยังมี right margin ติดอยู่
วิธีแก้ในระบบ
ใช้กติกาคอลัมน์และ inter-column gap เดียวกัน ลบ trailing margin และนำไปใช้กับ tab, ภาษา, analytics และ booster slots
ผลและขอบเขตการตรวจ
บันทึก 12 ต.ค. ตรวจ 42 ชุดหน้า–ภาษา–ความกว้าง และ full run พร้อม gameplay journey ผ่าน 2/2 แยกบันทึก Editor shutdown crash ในรอบเสริมออกจากผล assertion
อ้างอิง: Docs/ButtonRowAlignment-20261012.md
ลดงานที่ทำซ้ำ และรับ callback อย่างปลอดภัย
เริ่มจากอะไร
ทำให้รายการของใช้หน้าตาเดิมซ้ำได้ และจัดการการกลับจากโฆษณาโดยไม่จ่ายรางวัลซ้ำ
ปัญหาที่เจอ
แม้รายการจะสร้างเฉพาะส่วนที่มองเห็น แต่ยังตั้งค่าปุ่มและวัดข้อความเดิมซ้ำ ส่วนโฆษณาอาจส่งผลกลับมาไม่เรียงลำดับ
วิธีแก้
เก็บส่วนที่ใช้ซ้ำ วัดใหม่เมื่อข้อมูลเปลี่ยน และรอทั้งผลรับรางวัลกับการปิดโฆษณาให้ครบเพียงครั้งเดียว
- cache control ของแต่ละแถวเมื่อสร้าง และติด click handler ครั้งเดียว
- ใช้ RefreshItems แทน Rebuild และวัด marquee ใหม่เฉพาะเมื่อข้อความหรือพื้นที่เปลี่ยน
- รอทั้ง reward-earned และ ad-closed โดยไม่สมมติลำดับ และป้องกัน callback ซ้ำ
รายละเอียดเทคนิคและผลตรวจ
กระบวนการพัฒนา
การเลื่อน Collection และการกลับจาก rewarded ad เป็นงานที่ผู้เล่นทำบ่อย จึงต้องตรวจทั้งต้นทุนต่อ frame และความถูกต้องของผลรางวัล
- cache control ของแต่ละแถวเมื่อสร้าง และติด click handler ครั้งเดียว
- ใช้ RefreshItems แทน Rebuild และวัด marquee ใหม่เฉพาะเมื่อข้อความหรือพื้นที่เปลี่ยน
- รอทั้ง reward-earned และ ad-closed โดยไม่สมมติลำดับ และป้องกัน callback ซ้ำ
ปัญหาที่บันทึกไว้
ListView มี virtualization แล้ว แต่ rebind ยังหา control และสร้าง handler ซ้ำ ส่วน marquee วัดทุก 50 ms แม้ข้อมูลเดิม การกลับจากโฆษณายังต้องกันให้ reward ซ้ำไม่ได้
วิธีแก้ในระบบ
เก็บข้อมูลที่ใช้ซ้ำ invalidation เมื่อจำเป็น ล้าง state ของ card ก่อน reuse และให้การจ่ายรางวัลยืนยันจาก callback คู่ครบเพียงครั้งเดียว
ผลและขอบเขตการตรวจ
Collection tests ผ่าน 3/3 และ startup/ad-return ผ่าน 4/4 ตามบันทึก 12 ต.ค. แต่ยังไม่มี native iPad frame-time ใหม่สำหรับชุดแก้นี้
อ้างอิง: Docs/CollectionPerformance-20261012.md + Docs/StartupAndAdReturn-20261012.md
รวมทุกส่วน ก่อนส่งถึงมือผู้เล่น
จากงานแต่ละส่วนสู่แอปเดียว
สร้าง Android รุ่น 0.0.18 (18) ให้มีงานแก้ฟิสิกส์ช่วงหมดเวลา ตรวจ AAB ลายเซ็น และ native libraries ก่อนส่งพร้อม symbols
ตัวแอปและหน้าร้านต้องตรงกัน
ต้องใช้ไฟล์สร้างใหม่ เพราะรุ่น 17 ไม่มีงานแก้ฟิสิกส์นี้ รายงานรุ่น 18 มีผล PlayMode ผ่าน 3/3 แต่ไม่ได้ติดตั้งหรือวัดเวลาเปิดบนเครื่องจริงรอบใหม่
สถานะในบันทึกการเผยแพร่
ส่งรุ่น 18 เข้า Production review แบบ full rollout วันที่ 13 ต.ค. ขณะนั้นรุ่น 17 ยังเป็นรุ่นที่เผยแพร่อยู่ จึงแยกสถานะส่งตรวจออกจากเผยแพร่แล้ว
อ้างอิงวันที่ในบันทึก ไม่ใช่สถานะ Store แบบเรียลไทม์
รายละเอียด Build และหลักฐาน
การรวมระบบ
- เริ่มจากข้อมูล JSON แยก item, story, quest และกติกาดรอป พร้อม JSON Schema และ validator ก่อนสร้าง runtime bundle
- เชื่อมข้อมูลกับ Unity และตรวจ reference ของฉาก ตาราง และคำแปล ไม่แก้ค่าคอนเทนต์กระจัดกระจายในโค้ด
- รุ่น 18 แก้ให้แรงประคองตะกร้าและ Soft Liner ยังทำงานในช่วงแสดงผลสามวินาทีหลังหมดเวลา
ผลตรวจ
รายงานรุ่น 18 วันที่ 13 ต.ค. 2026 บันทึก PlayMode regression และเส้นทางเล่น–รับรางวัล–อัปเกรดผ่าน 3/3 ตรวจข้อมูล 452 items, 24 stories และ 8 scenes ผ่าน แต่ไม่มีการติดตั้งหรือวัด cold start บนเครื่องจริงใหม่สำหรับรุ่นนี้
การส่งขึ้น Store
รุ่น 0.0.18 (18) สร้างด้วย Android IL2CPP ARM64 ตรวจ bundle, ลายเซ็น และ native libraries ก่อนอัปโหลด AAB พร้อม symbols ส่ง Production review แบบ full rollout โดยรุ่น 17 เป็นรุ่นที่เผยแพร่อยู่ ณ วันที่บันทึก รุ่น 18 ยังไม่ยืนยันว่าเปิดใช้งานแล้ว
บันทึกอ้างอิง
- Docs/DesignConcepts/StoryGrounded/correction-prompts.md + Docs/SpriteSheets/item_sprite_sheet_manifest.md
- Docs/AudioAudit-20261006.md
- Docs/RunEndingPhysics-20261012.md + Docs/ProductionRelease-v18-20261013.md
- Docs/ButtonRowAlignment-20261012.md
- Docs/CollectionPerformance-20261012.md + Docs/StartupAndAdReturn-20261012.md
- README.md
- Docs/ProductionRelease-v18-20261013.md