ห้องสมุดที่อนุญาตให้เขียนสคริปต์ Unity ในรหัสดั้งเดิม: C, C ++, Assembly
โครงการนี้มีจุดมุ่งหมายเพื่อให้คุณมีทางเลือกให้กับ C# การเขียนสคริปต์ใน C ++ ไม่ถูกต้องสำหรับทุกส่วนของทุกโครงการ แต่ตอนนี้มันเป็นตัวเลือก
การเปลี่ยนรหัส C# หนึ่งบรรทัดคุณต้องสร้างบิลด์ใหม่ของเกม เวลาในการสร้าง Android ทั่วไปมีแนวโน้มที่จะใช้เวลาอย่างน้อย 10 นาทีเพราะ IL2CPP ต้องทำงานและจากนั้นจะต้องรวบรวม C ++ จำนวนมาก
ด้วยการใช้ C ++ เราสามารถรวบรวมเกมเป็นปลั๊กอิน C ++ ในเวลาประมาณ 1 วินาทีสลับปลั๊กอินเป็น APK จากนั้นติดตั้งและเรียกใช้เกมทันที นั่นคือการเพิ่มประสิทธิภาพการผลิตอย่างมาก!
C ++ รวบรวมได้เร็วกว่า C# การสร้างที่เพิ่มขึ้นเมื่อมีการเปลี่ยนแปลงเพียงไฟล์เดียว- การสร้างที่พบบ่อยที่สุด- สามารถเร็วกว่า C#15 เท่า การรวบรวมเร็วขึ้นเพิ่มขึ้นเมื่อเวลาผ่านไปเพื่อเพิ่มประสิทธิภาพการผลิต เวลาวนซ้ำเร็วขึ้นทำให้ง่ายต่อการอยู่ใน "การไหล" ของการเขียนโปรแกรม
นักสะสมขยะของ Unity เป็นสิ่งจำเป็นและมีปัญหามากมาย มันช้าวิ่งบนด้ายหลักรวบรวมขยะทั้งหมดในครั้งเดียวเศษชิ้นส่วนและไม่เคยหดกอง ดังนั้นเกมของคุณจะได้สัมผัสกับ "Frame Hitches" และในที่สุดคุณก็จะหมดความทรงจำและผิดพลาด
ต้องใช้ความพยายามอย่างมากในการแก้ไข GC และรหัสผลลัพธ์นั้นยากที่จะรักษาและช้า ซึ่งรวมถึงเทคนิคต่าง ๆ เช่นพูลวัตถุซึ่งทำให้คู่มือการจัดการหน่วยความจำเป็นหลัก นอกจากนี้คุณยังต้องหลีกเลี่ยงประเภทของชกมวยเช่น int ถึงประเภทที่มีการจัดการเช่น object ไม่ใช้ foreach loops ในบางสถานการณ์และ gotchas อื่น ๆ อีกมากมาย
C ++ ไม่มีตัวรวบรวมขยะและคุณสมบัติการจัดการหน่วยความจำอัตโนมัติที่เป็นตัวเลือกผ่านประเภท "ตัวชี้อัจฉริยะ" เช่น Shared_ptr มันมีทางเลือกที่ยอดเยี่ยมสำหรับนักสะสมขยะดั้งเดิมของ Unity
ในขณะที่ใช้. NET APIs บางส่วนจะยังคงเกี่ยวข้องกับการสร้างขยะปัญหานั้นมีอยู่เฉพาะ API เหล่านั้นเท่านั้นแทนที่จะเป็นปัญหาที่แพร่หลายสำหรับรหัสทั้งหมดของคุณ
โดยการใช้ C ++ โดยตรงคุณจะสามารถควบคุมรหัส CPU ได้อย่างสมบูรณ์ มันง่ายกว่ามากที่จะสร้างรหัสที่ดีที่สุดด้วยคอมไพเลอร์ C ++ มากกว่าด้วยคอมไพเลอร์ C#, IL2CPP และในที่สุดคอมไพเลอร์ C ++ ตัดคนกลางออกและคุณสามารถใช้ประโยชน์จากคอมไพเลอร์อินทราสหรือชุดประกอบเพื่อเขียนรหัสเครื่องโดยตรงโดยใช้คุณสมบัติ CPU ที่ทรงพลังเช่น SIMD และการเข้ารหัสฮาร์ดแวร์ AES เพื่อการเพิ่มประสิทธิภาพการทำงานจำนวนมาก
C ++ เป็นภาษาที่มีขนาดใหญ่กว่า C# และนักพัฒนาบางคนจะชอบมีเครื่องมือมากขึ้นในการกำจัดของพวกเขา นี่คือความแตกต่างเล็กน้อย:
ในขณะที่ IL2CPP แปลง C# เป็น C ++ ไปแล้ว แต่ก็สร้างค่าใช้จ่ายจำนวนมาก มีความประหลาดใจมากมายหากคุณอ่าน C ++ ที่สร้างขึ้น ตัวอย่างเช่นมีค่าใช้จ่ายสำหรับฟังก์ชั่นใด ๆ โดยใช้ตัวแปรสแตติกและพอยน์เตอร์สองตัวพิเศษจะถูกเก็บไว้ที่จุดเริ่มต้นของทุกคลาส เช่นเดียวกันกับคุณสมบัติทุกประเภทเช่น sizeof() , การตรวจสอบโมฆะบังคับและอื่น ๆ แต่คุณสามารถเขียน C ++ ได้โดยตรงและไม่จำเป็นต้องแก้ไข IL2CPP
C ++ เป็นภาษามาตรฐานสำหรับวิดีโอเกมและฟิลด์อื่น ๆ อีกมากมาย โดยการเขียนโปรแกรมใน C ++ คุณสามารถถ่ายโอนทักษะและรหัสของคุณไปและกลับจากโครงการที่ไม่ใช่มหาวิทยาลัยได้ง่ายขึ้น ตัวอย่างเช่นคุณสามารถหลีกเลี่ยงการล็อคอินโดยใช้ภาษาเดียวกัน (C ++) ที่คุณใช้ในเครื่องยนต์ Unreal หรือ Lumberyard
GameObject go;
Transform transform = go.GetTransform();
Vector3 position(1.0f, 2.0f, 3.0f);
transform.SetPosition(position);
MonoBehaviour ใน C ++ void MyScript::Start()
{
String message("MyScript has started");
Debug::Log(message);
}
#if TARGET_OS_ANDROID )หลักของโครงการนี้คือตัวสร้างรหัส มันสร้างรหัส C# และ C ++ ที่เรียกว่า "การผูก" ที่ทำให้ C# APIs พร้อมใช้งานสำหรับรหัสเกม C ++ รองรับคุณสมบัติภาษาที่หลากหลาย:
classstructenumAction )decimalget และ set เหมือน obj.x )get และ set เหมือน obj[x] )add และ remove ผู้ได้รับมอบหมาย)int ไปยัง object และ Visa Versa)out และ ref พารามิเตอร์โปรดทราบว่าเครื่องกำเนิดรหัสยังไม่รองรับ:
Array , string และวิธีการ object (เช่น GetHashCode )params โดยนัย (aka "var args") ผ่าน ในการกำหนดค่าตัวสร้างรหัสให้เปิด Unity/Assets/NativeScriptTypes.json และสังเกตตัวอย่างที่มีอยู่ เพิ่มในไฟล์นี้เพื่อเปิดเผย C# APIs เพิ่มเติมจาก Unity, .NET หรือ DLL ที่กำหนดเองไปยังรหัส C ++ ของคุณ
ในการเรียกใช้เครื่องกำเนิดรหัสให้เลือก NativeScript > Generate Bindings จากตัวแก้ไข Unity
เกือบทุกโครงการจะเห็นการชนะการปฏิบัติงานสุทธิโดยการลดคอลเลกชันขยะกำจัดค่าใช้จ่าย IL2CPP และการเข้าถึงคอมไพเลอร์ที่แท้จริงและการประกอบ การโทรจาก C ++ ไปยัง C# มีเพียงบทลงโทษเล็กน้อย ในกรณีที่หายากว่ารหัสเกือบทั้งหมดของคุณคือการโทรไปยัง. NET API จากนั้นคุณอาจประสบกับการสูญเสียประสิทธิภาพสุทธิ
บทความการทดสอบและมาตรฐาน
บทความการเพิ่มประสิทธิภาพ
เมื่อสคริปต์ใน C ++ C# จะใช้เป็นเลเยอร์ "การผูก" เท่านั้นเพื่อให้ความสามัคคีสามารถเรียกฟังก์ชั่น C ++ และฟังก์ชั่น C ++ สามารถเรียก API Unity ได้ เครื่องกำเนิดรหัสใช้เพื่อสร้างการผูกเหล่านี้ส่วนใหญ่ตามความต้องการของโครงการของคุณ
รหัสทั้งหมดของคุณรวมถึงการผูกบางอย่างจะมีอยู่ในปลั๊กอิน "เนทีฟ" C ++ เดียว เมื่อคุณเปลี่ยนรหัส C ++ คุณจะสร้างปลั๊กอินนี้แล้วเล่นเกมในตัวแก้ไขหรือในการสร้างที่ปรับใช้ (เช่นอุปกรณ์ Android) จะไม่มีรหัส C# สำหรับความสามัคคีในการรวบรวมเว้นแต่คุณจะเรียกใช้ตัวสร้างรหัสซึ่งไม่บ่อยนัก
เวิร์กโฟลว์ C# มาตรฐานมีลักษณะเช่นนี้:
ด้วย C ++ เวิร์กโฟลว์จะเป็นแบบนี้:
Unity/Assets ไปยังไดเรกทอรี Assets ของโครงการ Unity Project ของคุณNativeScriptTypes.json และระบุส่วนใดของ Unity, .NET และ DLL ที่กำหนดเองที่คุณต้องการเข้าถึงจาก C ++Unity/Assets/CppSource/Game/Game.cpp และ Unity/Assets/CppSource/Game/Game.h เพื่อสร้างเกมของคุณ มีรหัสตัวอย่างบางอย่าง แต่อย่าลังเลที่จะลบออก คุณสามารถเพิ่มไฟล์ C ++ เพิ่มเติม ( .cpp ) และไฟล์ส่วนหัว ( .h ) ได้ที่นี่เมื่อเกมของคุณเติบโตขึ้น/Applications/Utilitiescd /path/to/your/build/directorycmake -G MyGenerator -DCMAKE_TOOLCHAIN_FILE=/path/to/your/project/CppSource/iOS.cmake /path/to/your/project/CppSource แทนที่ MyGenerator ด้วยเครื่องกำเนิดไฟฟ้าที่คุณเลือก หากต้องการดูตัวเลือกให้ดำเนินการ cmake --help และดูที่รายการที่ด้านล่าง ตัวเลือกทั่วไปรวมถึง "UNIX MakeFiles" เพื่อสร้างจากบรรทัดคำสั่งหรือ "XCode" เพื่อใช้ IDE ของ Applemake หากคุณเลือก Unix Makefiles เป็นเครื่องกำเนิดไฟฟ้าของคุณหรือ Open NativeScript.xcodeproj และคลิก Product > Build หากคุณเลือก XCode /Applications/Utilitiescd /path/to/your/build/directorycmake -G "MyGenerator" -DEDITOR=TRUE /path/to/your/project/CppSource แทนที่ MyGenerator ด้วยเครื่องกำเนิดไฟฟ้าที่คุณเลือก หากต้องการดูตัวเลือกให้ดำเนินการ cmake --help และดูที่รายการที่ด้านล่าง ตัวเลือกทั่วไปรวมถึง "UNIX MakeFiles" เพื่อสร้างจากบรรทัดคำสั่งหรือ "XCode" เพื่อใช้ IDE ของ Apple ลบ -DEDITOR=TRUE สำหรับการสร้างแบบสแตนด์อโลนmake หากคุณเลือก Unix Makefiles เป็นเครื่องกำเนิดไฟฟ้าของคุณหรือ Open NativeScript.xcodeproj และคลิก Product > Build หากคุณเลือก XCode cd /path/to/your/build/directorycmake -G "Visual Studio VERSION YEAR Win64" -DEDITOR=TRUE /path/to/your/project/CppSource แทนที่ VERSION และ YEAR ด้วย Visual Studio ที่คุณต้องการใช้ หากต้องการดูตัวเลือกให้ดำเนินการ cmake --help และดูที่รายการที่ด้านล่าง ตัวอย่างเช่นใช้ "Visual Studio 15 2017 Win64" สำหรับ Visual Studio 2017 ทุกรุ่นรวมถึงชุมชนทำงานได้ดี ลบ -DEDITOR=TRUE สำหรับการสร้างแบบสแตนด์อโลน หากคุณใช้ Visual Studio 2019 ให้ดำเนินการ cmake -G "Visual Studio 16" -A "x64" -DEDITOR=TRUE /path/to/your/project/CppSource แทนNativeScript.sln และคลิก Build > Build Solution cd /path/to/your/build/directorycmake -G "MyGenerator" -DEDITOR=TRUE /path/to/your/project/CppSource แทนที่ MyGenerator ด้วยเครื่องกำเนิดไฟฟ้าที่คุณเลือก หากต้องการดูตัวเลือกให้ดำเนินการ cmake --help และดูที่รายการที่ด้านล่าง ตัวเลือกที่พบบ่อยที่สุดคือ "UNIX MakeFiles" เพื่อสร้างจากบรรทัดคำสั่ง แต่มีตัวเลือก IDE ด้วย ลบ -DEDITOR=TRUE สำหรับการสร้างแบบสแตนด์อโลนmake หากคุณเลือก Unix Makefiles เป็นเครื่องกำเนิดของคุณ cd /path/to/your/build/directorycmake -G MyGenerator -DANDROID_NDK=/path/to/android/ndk /path/to/your/project/CppSource แทนที่ MyGenerator ด้วยเครื่องกำเนิดไฟฟ้าที่คุณเลือก หากต้องการดูตัวเลือกให้ดำเนินการ cmake --help และดูที่รายการที่ด้านล่าง ในการสร้างบิลด์สำหรับแพลตฟอร์มใด ๆ นอกเหนือจาก Android ให้ละเว้นส่วนที่ -DANDROID_NDK=/path/to/android/ndkmake หากคุณเลือก Unix Makefiles เป็นเครื่องกำเนิดของคุณ หากต้องการอัปเดตเป็นเวอร์ชันใหม่ของโครงการนี้เขียนทับไดเรกทอรี Assets/NativeScript ของโครงการ Unity ของโครงการของคุณด้วยไดเรกทอรี Unity/Assets/NativeScript ของโครงการนี้และเรียกใช้ตัวสร้างรหัสอีกครั้ง
บทความโดยผู้เขียนอธิบายการพัฒนาของโครงการนี้
Jackson Dunstan
โปรดอย่าลังเลที่จะแยกและส่งคำขอดึงหรือเพียงแค่ส่งปัญหาสำหรับคุณสมบัติหรือการแก้ไขข้อบกพร่อง
รหัสทั้งหมดเป็น MIT ที่ได้รับใบอนุญาตซึ่งหมายความว่าโดยปกติจะสามารถใช้งานได้ง่ายในแอปพลิเคชันเชิงพาณิชย์และไม่ใช่เชิงพาณิชย์
การเขียนทั้งหมดได้รับใบอนุญาต CC โดย 4.0 ซึ่งหมายความว่าสามารถใช้งานได้ตราบใดที่ได้รับการระบุแหล่งที่มา