วิธีแปลเกม Unity เป็นภาษาอังกฤษ
แปลเกม Unity ด้วย RuneTranslate — อ่าน TextAssets, ฟิลด์ MonoBehaviour (Mono และ IL2CPP) และ StreamingAssets ทำไมมันแปลได้เฉพาะข้อความที่ถูกดึงออกภายนอก และตัวป้องกันตัวระบุช่วยไม่ให้คุณทำเกมพังอย่างไร
Unity เป็นเอนจินที่อยู่เบื้องหลังส่วนแบ่งที่เพิ่มขึ้นของเกมอินดี้และวิชวลโนเวลญี่ปุ่น — และเป็นเอนจินที่แปลยากที่สุดในบรรดาเอนจินทั่วไป เพราะ Unity ไม่มีรูปแบบข้อความเดียว บทสนทนาอาจอยู่ในบล็อบ TextAsset ในฟิลด์สตริง MonoBehaviour ในสคริปต์ StreamingAssets แบบหลวม หรือคอมไพล์ตรงลงใน C# DLL คู่มือนี้พาผ่านการแปลเกม Unity ด้วย RuneTranslate และที่สำคัญไม่แพ้กัน อธิบายกฎข้อหนึ่งที่ทำให้ Unity ต่างออกไป: เฉพาะข้อความที่ถูกดึงออกภายนอก
ข้อควรระวังใหญ่ก่อน: เฉพาะข้อความที่ถูกดึงออกภายนอก
RuneTranslate แปลข้อความ Unity ที่อยู่ใน ข้อมูล — ไฟล์แอสเซ็ตที่เอนจินโหลดตอนรันไทม์ รวมถึงฟิลด์สตริงบนคอมโพเนนต์ MonoBehaviour (บทสนทนา ชื่อ ป้าย) มันอ่านฟิลด์เหล่านั้นบนบิลด์ ทั้ง Mono และ IL2CPP: เลย์เอาต์ชนิดข้อมูลมาจาก DLL ของเกมเองบน Mono หรือถูกสร้างขึ้นใหม่จากเมทาดาทา IL2CPP เมื่อไม่มีโฟลเดอร์ Managed/ สิ่งที่มัน เข้าไม่ถึง คือข้อความที่ฮาร์ดโค้ดลงในโค้ด C# ที่คอมไพล์แล้วเอง (Assembly-CSharp.dll) ในทางปฏิบัติ เกมที่เก็บสคริปต์ไว้ในแอสเซ็ตและคอมโพเนนต์แปลได้ดี — และการเปิดโปรเจกต์ ซึ่งเป็นขั้นตอนแรก บอกคุณว่าคุณมีอะไร
สิ่งที่คุณต้องมี
- RuneTranslate สำหรับ Windows — ฟรี ทุกเอนจินและผู้ให้บริการถูกปลดล็อก
- โฟลเดอร์เกม Unity — ไดเรกทอรีที่มีไฟล์
.exeของเกมและโฟลเดอร์<GameName>_Data/(ที่มีglobalgamemanagers,resources.assets,data.unity3dและไฟล์level*) - ภาษาปลายทาง — อังกฤษ สเปน ฝรั่งเศส เยอรมัน โปรตุเกส รัสเซีย จีน อิตาลี ตุรกี เวียดนาม และอีก 20+ ภาษา
- ผู้ให้บริการแปลหนึ่งราย Google Translate ฟรีใช้ได้เลย; DeepL มีระดับฟรี; OpenAI, Anthropic, โมเดลบนเครื่อง และ API ที่เข้ากันได้กับ OpenAI ต้องใช้คีย์ของคุณเอง
ขั้นที่ 1: เปิดโฟลเดอร์เกม
เปิด RuneTranslate คลิก New project แล้วชี้ไปที่ไดเรกทอรีเกม Unity การตรวจจับเอนจินมองหาโฟลเดอร์ _Data/ และจำแนกโปรเจกต์เป็น Unity UnityPy Python sidecar ที่รวมมา (ส่งมาในตัวติดตั้ง) เปิดไฟล์แอสเซ็ตและแสดงสตริงที่อ่านได้ลงในพื้นที่ทำงานต่อโปรเจกต์ใต้ %APPDATA%/RuneTranslate/unity-workspace/<projectId>/ โฟลเดอร์เกมต้นฉบับของคุณจะไม่ถูกแก้ไขเลย Unity เป็นเอนจินแบบ พยายามอย่างเต็มที่ — ตรวจสอบว่าบิลด์ที่ส่งออกรันได้ก่อนแจกจ่ายต่อ
ขั้นที่ 2: สตริงถูกดึงออกอย่างไร
RuneTranslate อ่านข้อความจากทุกที่ที่ Unity ดึงออกภายนอก:
- TextAssets — บล็อบ JSON / CSV / สคริปต์ที่ฝังใน
.assetsและ AssetBundles ตัดออกด้วยตัวดึงที่รู้จักรูปแบบ - ฟิลด์สตริง MonoBehaviour — ข้อความที่แสดงบนคอมโพเนนต์ (บทสนทนา ชื่อ ป้าย) บนบิลด์ทั้ง Mono และ IL2CPP (ข้อมูลชนิดมาจาก DLL ของเกม หรือถูกสร้างขึ้นใหม่จากเมทาดาทา IL2CPP)
- StreamingAssets — ไฟล์สคริปต์แบบหลวมที่เดินไล่บนดิสก์โดยตรง (
.json,.txt,.csv,.tsv,.xml,.yaml,.ksและอื่น ๆ) - บันเดิล Addressable ที่เข้ารหัส — เกมที่เข้ารหัส AES บันเดิลแอสเซ็ต Addressable ของตนถูกถอดรหัสโดยอัตโนมัติ (คีย์ได้จากชื่อไฟล์ของบันเดิลเอง) ข้อความของมันจึงดึงออกได้เหมือนบันเดิลอื่น
Unity ยังเป็นที่ที่การแปลเกินทำความเสียหายมากที่สุด RuneTranslate จึงมาพร้อมตัวป้องกันสำหรับมัน สตริง MonoBehaviour จำนวนมากไม่ใช่ข้อความที่แสดงเลย — มันเป็น ตัวระบุควบคุม และ ตัวถูกดำเนินการโฟลว์: ชื่อฉากที่การเรียก LoadScene แก้ไขด้วยสตริง คีย์กำหนดเส้นทางข้อความ ชื่อแอนิเมเตอร์ / คลิปเสียง ชื่อชิ้นส่วน Live2D และค่าเปรียบเทียบภายในตรรกะ Fungus If / SetVariable (เช่น แฟล็กอย่าง 村落出口) แปลสิ่งเหล่านั้นแล้วเกมพังเงียบ ๆ — อาการคลาสสิกคือหน้าจอ "loading" ไม่รู้จบโดยไม่มีข้อผิดพลาด RuneTranslate จำแนกสิ่งเหล่านี้เป็น excluded โดยอัตโนมัติ (แสดงเป็นสีแดง เลือกเข้าเท่านั้น) ตัวแก้ไขจึงนำเสนอบทสนทนาและป้ายจริงและปล่อยกลไกไว้ตามลำพัง การแทนที่ {$var} ของ Fungus และมาร์กอัป {color=...} / TMP <...> ถูกปิดบังไว้หลังตัวยึดตำแหน่งเพื่อให้มันรอดผ่านการแปลครบถ้วน
ขั้นที่ 3: แปลและตรวจทาน
เลือกผู้ให้บริการแล้วรัน DeepL หรือ LLM อ่านได้ดีที่สุดสำหรับบทสนทนา; Google Translate ฟรีครอบคลุมเมนูและชื่อไอเทม ใส่นักแสดงและคำศัพท์ที่ปรากฏซ้ำลงอภิธานศัพท์ก่อน ดู Glossary 101 ทุกบรรทัดลงในตัวแก้ไขข้างต้นฉบับ; แก้แบบอินไลน์ (บันทึกเมื่อคลิกออกหรือ Ctrl+Enter) และรัน ตัวขัดเกลาด้วย AI แบบไม่บังคับสำหรับการตรวจทานรอบสอง ระดับฟรีทำงานที่การจำกัดความเร็วเล็กน้อย (ช้ากว่าประมาณ 2 เท่าบนผู้ให้บริการ AI น้อยกว่านั้นบนตัวดึง) — เอนจินเดียวกัน คุณภาพผลลัพธ์เดียวกัน; แบบเสียเงินแค่ทำงานความเร็วเต็มที่
ขั้นที่ 4: ส่งออกบิลด์ที่เล่นได้
คลิก Export RuneTranslate คัดลอกเกม แล้วแพตช์สตริงที่แปลแล้วกลับเข้าไฟล์แอสเซ็ตในที่เดิม ตัวป้องกันการยกเว้นเดียวกันทำงานตอนเขียนกลับด้วย โปรเจกต์เก่าจึงไม่บังเอิญดันชื่อฉากหรือตัวถูกดำเนินการโฟลว์ที่แปลแล้วตอนส่งออกซ้ำ ผลลัพธ์คือสำเนาที่รันได้เต็มของเกมในตำแหน่งที่คุณเลือก — เปิด .exe แล้วมันก็เล่นในภาษาปลายทางของคุณ
กำลังแปลเป็นภาษาที่ไม่ใช่ละติน (จีน ญี่ปุ่น เกาหลี ไทย อาหรับ) ที่ฟอนต์ในตัวของเกมเรนเดอร์กลิฟไม่ได้เหรอ? RuneTranslate ฉีดฟอนต์สำรองเข้าไปในสแตกฟอนต์ TextMeshPro ตอนส่งออก ข้อความที่แปลแล้วจึงแสดงแทนที่จะเป็นกล่องกลิฟที่หายไป
ข้อจำกัดที่ทราบ
- เฉพาะข้อความที่ถูกดึงออกภายนอก: สตริงที่ฮาร์ดโค้ดลงในโค้ด C# ที่คอมไพล์แล้ว (
Assembly-CSharp.dllบน Mono หรือไบนารี IL2CPP) ไม่ถูกแปล ฟิลด์ ข้อมูล MonoBehaviour ถูกแปล — บนบิลด์ทั้ง Mono และ IL2CPP - การอ่าน MonoBehaviour ของ IL2CPP ต้องการ
global-metadata.datที่แยกวิเคราะห์ได้; เมทาดาทาที่ทำให้อ่านยากอย่างหนักอาจสร้างขึ้นใหม่ไม่ได้ (พยายามอย่างเต็มที่) - พยายามอย่างเต็มที่: ยืนยันว่าเกมที่ส่งออกเปิดขึ้นและอ่านได้ถูกต้องก่อนแชร์
- ข้อความในภาพ (โลโก้ UI ที่วาดมือ คำบรรยาย CG) ไม่ถูกแปล — อยู่นอกขอบเขตการแปลด้วยเครื่อง
ทำไมมันง่ายกว่าวิธีเดิม
การแปล Unity ด้วยมือหมายถึงการแกะแอสเซ็ตด้วย UABE หรือ AssetStudio ตามล่าว่า TextAssets และฟิลด์ MonoBehaviour ใดถือข้อความจริง หลีกเลี่ยงสตริงตัวระบุที่ทำให้เกมแครชด้วยมือ แล้วนำเข้าใหม่โดยไม่ทำตารางแอสเซ็ตเสียหาย RuneTranslate พับการดึงออก จำแนก (เพื่อไม่ให้คุณแปลกลไก) แปล และแพตช์ในที่เดิม เข้าเป็นไม่กี่คลิก — โดยเปิดตัวแก้ไขไว้เพื่อให้คุณควบคุมการใช้คำ
ดูหน้าเอนจิน Unity สำหรับรายการฟีเจอร์เต็ม อ่าน คู่มือ TyranoBuilder สำหรับเอนจินที่อิง HTML หรือ ดาวน์โหลด RuneTranslate แล้วลองบนเกมจริง
พร้อมลอง RuneTranslate ไหม
ระดับฟรีปลดล็อกทุกเอนจิน + ทุกผู้ให้บริการแปล Supporter ($3/mo) ปลดล็อกความเร็วเต็ม
ดาวน์โหลดสำหรับ Windows