![]() +- 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 - 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 ยังไงก็ติดตามละกันครับ |