[วิเคราะห์] ไฟล์ข้อมูลที่ได้จาก SGB Exporter for Unity #1 - Printable Version +- irpg Community (https://irpg.in.th) +-- Forum: irpg Other Game Engines School (https://irpg.in.th/forum-47.html) +--- Forum: Others (https://irpg.in.th/forum-48.html) +--- Thread: [วิเคราะห์] ไฟล์ข้อมูลที่ได้จาก SGB Exporter for Unity #1 (/thread-3294.html) |
[วิเคราะห์] ไฟล์ข้อมูลที่ได้จาก SGB Exporter for Unity #1 - XthemeCore - 06-23-2018 SMILE GAME BUILDER Exporter for Unity เป็น DLC ของโปรแกรมสร้างเกมสำเร็จรูป Smile Game Builder (SGB) ใช้ในการแปลงไฟล์เกมเพื่อนำไปพัฒนาต่อบน Unity บทความนี้จะวิเคราะห์ไฟล์ข้อมูลต่างๆที่ถูกแปลงมาลงใน Unity ว่าพอมีแนวทางในการที่จะอ่าน/เแก้ไข ไฟล์เหล่านั้นได้อย่างไร หมายเหตุ: บทความนี้ เหมาะสำหรับผู้ที่มีพื้นฐาน Unity และโปรแกรมมิ่งในระดับหนึ่ง เมื่อทำการกด export โปรเจคจาก SGB ไปเป็นโปรเจคบน Unity แล้ว จะได้โฟลเดอร์โปรเจคของ Unity มา ซึ่งจะมาพร้อมด้วยโฟลเดอร์ Assets เสมอ ภายในจะมีโฟลเดอร์ที่น่าสนใจอยู่ 3 โฟลเดอร์มีรายละเอียดดังนี้
สำหรับบทความนี้เราจะมาวิเคราะห์สิ่งที่อยู่ในโฟลเดอร์ Resource กัน ภายใน Resource นั้นจะมีโฟลเดอร์อีก 2 โฟลเดอร์ ได้แก่
เราจะไม่สนใจสิ่งที่อยู่ในโฟลเดอร์ samples เพราะเป็นไฟล์ที่สามารถเปิดมาแก้ไขได้โดยตรงอยู่แล้ว สิ่งที่น่าสนใจคือไฟล์นามสกุล .sgr.bytes จริงๆแล้วไฟล์นี้คือ binary file นั่นแหละ ซึ่งการอ่านหรือเขียนไฟล์เหล่านี้ จะต้องรู้ pattern ของมันว่ามีวิธีการอ่านหรือเขียนอย่างไร วิเคราะห์จากโค้ดของเอนจิ้น ในโฟลเดอร์ src มีไฟล์โค้ดที่น่าสนใจอยู่ 2 ไฟล์คือ FileUtil.cs และ common\Catalog.cs FileUtil.cs เป็นคลาสที่รวบรวมฟังก์ชั่นในการจัดการไฟล์ มี method ที่น่าสนใจคือ getFileStream ซึ่งจะอ่านไฟล์นามสกุล .bytes ที่ลงท้ายด้วย .sgr (.sgr.bytes) มาเป็น byte data TextAsset: https://docs.unity3d.com/ScriptReference/TextAsset-bytes.html common\Catalog.cs เป็นคลาสที่สำคัญอย่างมาก เพราะเป็นส่วนที่นำ byte data มาแปลงให้เป็นไฟล์ที่สามารถอ่านได้ หลังจากวิเคราะห์วิเคราะห์ดูสรุปได้ดังนี้ 1.ทุกไฟล์ข้อมูลจะมีหัว header ขึ้นต้นด้วย YUKAR เสมอ ดังภาพด้านล่าง ในคลาสมีอ้างอิงถึง YUKAR ให้เป็นตัวแปร ROM_HEADER มีการตรวจว่าไฟล์ต้องขึ้นต้นด้วย Header นี้เสมอ 2.ถัดจากนั้นจะเป็นขนาด chunk และ signature โดยเป็นตัวแปร Int32 และ Int16 ตามลำดับ 3.Signature ดูเหมือนจะเป็น byte data ที่ระบุว่าข้อมูลนี้เป็นข้อมูลชนิดใด ดังภาพด้านล่าง นอกเหนือจากนี้มีการจับคู่ signature กับ object type ด้วย โดยใส่ไว้ในตัวแปร dictionary 4.มี method ชื่อ load มีการเรียกใช้ฟังก์ชั่น createItem โดยใช้ dictionary ฟังก์ชั่น createItem จะให้ผลลัพธ์เป็น Object RomItem 5.object Hero มี base class เป็น RomItem เช่นกัน แล้วยังไงต่อ? จากที่กล่าวมาข้างต้น ทำให้มีความเป็นไปได้ที่เราจะแปลงไฟล์ข้อมูลมาอยู่ในรูปที่เราเข้าใจได้ โดยการแปลงมันเป็น object ตาม signature ของมัน ส่วนวิธีการแก้ไขข้อมูล ก็ให้แก้ไขที่ตัว object นั้นเลย แล้วแปลงกลับไปเป็น byte data อย่างไรก็นี่เป็นการวิเคราะห์จากการมองโค้ดแบบผ่านๆ ที่เหลือคงต้องไปศึกษาในเชิงลึกดูอีกที ครั้งหน้าอาจจะวิเคราะห์การทำงานของเอนจิ้นหลังแปลงมาอยู่บน Unity ยังไงก็ติดตามละกันครับ |