irpg Community
[วิเคราะห์] ไฟล์ข้อมูลที่ได้จาก 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 โฟลเดอร์มีรายละเอียดดังนี้

  1. map : เก็บไฟล์ scene ของแผนที่ในเกม ตรงนี้ใช้ในการตกแต่งหรือเพิ่มแสงเงาให้ฉากแผนที่ได้
  2. Resource: เก็บไฟล์ข้อมูลทั้งหมดของเกม
  3. src: เก็บโค้ดของเอนจิ้นที่จะรันบน Unity (C#)

[Image: fAvHBE7.png]

สำหรับบทความนี้เราจะมาวิเคราะห์สิ่งที่อยู่ในโฟลเดอร์ Resource กัน
ภายใน Resource นั้นจะมีโฟลเดอร์อีก 2 โฟลเดอร์ ได้แก่

  1. map : เก็บไฟล์ข้อมูลของแผนที่ในเกม (ไม่ใช่ไฟล์ scene ที่ใช้กับ Unity ได้โดยตรง)
  2. samples: เก็บไฟล์ทรัพยากรในเกม เช่นไฟล์รูปภาพ ไฟล์เพลง

[Image: 0f8XfIG.png]

เราจะไม่สนใจสิ่งที่อยู่ในโฟลเดอร์ 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
[Image: o8DHKk3.png]

common\Catalog.cs
เป็นคลาสที่สำคัญอย่างมาก เพราะเป็นส่วนที่นำ byte data มาแปลงให้เป็นไฟล์ที่สามารถอ่านได้
หลังจากวิเคราะห์วิเคราะห์ดูสรุปได้ดังนี้

1.ทุกไฟล์ข้อมูลจะมีหัว header ขึ้นต้นด้วย YUKAR เสมอ ดังภาพด้านล่าง
[Image: nqevVtD.png]

ในคลาสมีอ้างอิงถึง YUKAR ให้เป็นตัวแปร ROM_HEADER
[Image: B3jDHln.png]

มีการตรวจว่าไฟล์ต้องขึ้นต้นด้วย Header นี้เสมอ
[Image: cOh7s04.png]


2.ถัดจากนั้นจะเป็นขนาด chunk และ signature โดยเป็นตัวแปร Int32 และ Int16 ตามลำดับ
[Image: P33LWkx.png]


3.Signature ดูเหมือนจะเป็น byte data ที่ระบุว่าข้อมูลนี้เป็นข้อมูลชนิดใด ดังภาพด้านล่าง
[Image: DJZKwsR.png]

นอกเหนือจากนี้มีการจับคู่ signature กับ object type ด้วย โดยใส่ไว้ในตัวแปร dictionary
[Image: HGaovCh.png]

4.มี method ชื่อ load มีการเรียกใช้ฟังก์ชั่น createItem โดยใช้ dictionary
[Image: dchi4gi.png]
ฟังก์ชั่น createItem จะให้ผลลัพธ์เป็น Object RomItem
[Image: BUSMIVh.png]

5.object Hero มี base class เป็น RomItem เช่นกัน
[Image: Ojl4bFf.png]


แล้วยังไงต่อ?
จากที่กล่าวมาข้างต้น ทำให้มีความเป็นไปได้ที่เราจะแปลงไฟล์ข้อมูลมาอยู่ในรูปที่เราเข้าใจได้ โดยการแปลงมันเป็น object ตาม signature ของมัน
ส่วนวิธีการแก้ไขข้อมูล ก็ให้แก้ไขที่ตัว object นั้นเลย แล้วแปลงกลับไปเป็น byte data

อย่างไรก็นี่เป็นการวิเคราะห์จากการมองโค้ดแบบผ่านๆ ที่เหลือคงต้องไปศึกษาในเชิงลึกดูอีกที

ครั้งหน้าอาจจะวิเคราะห์การทำงานของเอนจิ้นหลังแปลงมาอยู่บน Unity ยังไงก็ติดตามละกันครับ