ตัวแปรที่ปลอดภัย
บทนำ¶
หน้านี้อธิบายฟีเจอร์ตัวแปรที่ปลอดภัยของ Hercules.
ก่อนที่จะใช้ฟีเจอร์ตัวแปรที่ปลอดภัย คุณต้องตั้งค่า Hive SDK ก่อน.
ตัวแปรที่ปลอดภัยมีลักษณะดังต่อไปนี้:
- มันเป็นค่าที่เข้ารหัสในหน่วยความจำเพื่อไม่ให้สามารถเรียกคืนได้โดยเครื่องมือภายนอก
- แม้ว่าค่าที่เข้ารหัสจะถูกดัดแปลง จะมีการตรวจสอบเมื่อมันถูกอ่าน
- ภาษาโปรแกรมที่รองรับ ได้แก่ C/C++ และ C# (Unity)
วิธีการใช้ตัวแปรที่ปลอดภัย¶
C# (Unity)¶
- โดยพื้นฐานแล้ว ประเภทข้อมูลที่มีใน C# สามารถใช้เป็นคลาส Generic ได้
- มีประเภทข้อมูลที่ปลอดภัยซึ่งตรงกับแต่ละประเภทข้อมูลดังนี้
- เนื่องจากประเภทพื้นฐานทั้งหมดจะถูกแปลงเป็นประเภท 8 ไบต์ จึงแนะนำให้ใช้ประเภท 8 ไบต์ เช่น การใช้ long แทน int และ double แทน float
ประเภทพื้นฐาน | ประเภทที่ปลอดภัย | ประเภทพื้นฐาน | ประเภทที่ปลอดภัย |
---|---|---|---|
bool | HerculesVar<bool> | int | HerculesVar<int> |
char | HerculesVar<char> | uint | HerculesVar<uint> |
sbyte | HerculesVar<sbyte> | long | HerculesVar<long> |
byte | HerculesVar<byte> | ulong | HerculesVar<ulong> |
short | HerculesVar<short> | float | HerculesVar<float> |
ushort | HerculesVar<ushort> | double | HerculesVar<double> |
string | HerculesString |
// โค้ดทั้งสองด้านล่างทำสิ่งเดียวกันและจัดสรรวัตถุใหม่
HerculesVar x = 100;
HerculesVar y = new HerculesVar(100);
// ค่าจะถูกคัดลอกจากตัวแปรที่ปลอดภัยไปยังตัวแปรปกติ
int a = x;
// วัตถุเก่าที่จัดสรรให้กับ y จะถูกปล่อยและวัตถุใหม่จะถูกจัดสรรใหม่ให้กับ y
y = 300;
// เปลี่ยนค่าของ y (y ควรได้รับการกำหนดค่าแล้วด้วยวัตถุ และการจัดสรรประเภทนี้เร็วกว่าข้างต้น)
y.Set(300);
// y ถูกกำหนดค่าใหม่เป็นค่าของ x. ทั้ง x และ y เริ่มอ้างอิงไปยังวัตถุที่แตกต่างจากวัตถุเดิมที่กำหนดให้กับ x.
y = (int)x;
// คำเตือน: y จะอ้างถึง x หากคุณใช้ฟังก์ชัน Set ค่าทั้งสองจะถูกแทนที่
// หากเกิดข้อผิดพลาดในการสร้างเมื่อดำเนินการกับตัวแปรประเภทไม่ลงนามโดยตรง
// U จะต้องระบุหลังจากค่าคงที่หรือคุณควรใช้การแคสต์แบบชัดเจน (เช่น 1U หรือ (uint)1)
// สำหรับค่าที่มีการอัปเดตบ่อยครั้ง การใช้รูปแบบ obj.Set(v); จะมีประสิทธิภาพดีกว่า
y = x;
// สตริงสามารถใช้ได้แบบนี้: สตริงในหน่วยความจำเท่านั้นที่ได้รับการป้องกัน。
// เมื่อกำหนดสตริงคงที่เช่น “TEST” สตริงต้นฉบับอาจถูกเปิดเผยต่อโค้ด。
HerculesString securityString = <A string value downloaded from the server or generated dynamically>;
string plainString = securityString;
iOS, Android¶
- ในกรณีของ C เมื่อใดก็ตามที่คุณบันทึกหรืออ่านค่าของตัวแปร คุณต้องเรียก API โดยตรง ดังนั้นจึงแนะนำให้ใช้ C++ C++ มีคลาสเทมเพลตที่กำหนดไว้
- หากเป็นไปได้ แนะนำให้ใช้ตัวแปรที่ปลอดภัยเป็นตัวแปรทั่วโลกหรือใช้หลังจากวางไว้ในที่ที่การจัดสรรและการปล่อยไม่เกิดขึ้นบ่อยเกินไป
- อย่าวางคำสั่ง include ภายในบล็อก "C" ที่เป็น exteren
- ควรใช้หลังจากที่ Hive SDK ถูกเริ่มต้นแล้ว
#include "Hercules.h"
class CUserInfo {
public:
CHercules hp;
CHercules mp;
CHercules critical;
};
// หากมันถูกใช้เป็นตัวแปรทั่วโลก จะเกิดปัญหาขึ้นเพราะตัวแปรจะพยายามถูกเริ่มต้นก่อนที่ Hive SDK จะถูกเริ่มต้น
// CHercules g_temp;
// เมื่อใช้เป็นตัวแปรทั่วโลก ให้ประกาศในรูปแบบของพอยน์เตอร์ดังนี้
CUserInfo *g_user;
CHercules *g_var;
CHerculesString *g_string;
void BeginBattle() {
// สร้างตัวแปรที่ปลอดภัย (ตัวอย่าง: ที่จุดเริ่มต้นของการต่อสู้ในเกม)
g_user = new CUserInfo;
g_var = new CHercules;
g_string = new CHerculesString(<A string value downloaded from the server or generated dynamically>);
}
void EndBattle() {
// ลบตัวแปรที่ปลอดภัย (ตัวอย่าง: ที่สิ้นสุดการต่อสู้ในเกม)
delete g_user;
delete g_var;
delete g_string;
g_user = nullptr;
…
}
void Sample()
{
// Assignments can be made in any form as shown below.
int localvar = 0;
CHercules x = localvar;
*g_var = localvar;
*g_var = x + 2;
g_user->hp = 100;
// เมื่อกำหนดสตริงคงที่เช่น “TEST” สตริงต้นฉบับอาจถูกเปิดเผยต่อโค้ด
CHerculesString localString1 = <A new string downloaded from the server or generated dynamically>; // เริ่มต้นด้วยสตริง
CHerculesString localString2 = *g_securityString; // เริ่มต้นด้วยวัตถุ CHerculesString
std::string localString = *g_securityString; // CHerculesString เป็น std::string
localString2 = localString1; // CHerculesString เป็น CHerculesString
localString1 = localString.c_str(); // std::string เป็น CHerculesString
}
#include "Hercules.h"
HERCULES g_x;
HERCULES g_y;
HERCULES g_str;
void StartApp() {
// สร้างตัวแปรที่ปลอดภัย
// สามารถใช้ได้โดยการใส่ประเภทพื้นฐานและตัวแปรโครงสร้าง
int var = 0;
g_x = HerculesAddVar(&var, sizeof(var));
g_y = HerculesAddVar(&var, sizeof(var));
// เมื่อกำหนดสตริงคงที่เช่น “TEST” สตริงต้นฉบับอาจถูกเปิดเผยต่อโค้ด
g_str = HerculesAddString(<A string downloaded from the server or generated dynamically>);
}
void Sample()
{
// รับค่าของ x และเก็บไว้ใน y ในขณะนี้ พารามิเตอร์ที่สองที่ตั้งไว้ในแต่ละฟังก์ชัน
// ต้องเป็นตัวแปรที่มีขนาดเท่ากับขนาดที่ตั้งไว้เมื่อเรียกใช้ HerculesAddVar.
int var;
HerculesGetVar(g_x, &var);
HerculesSetVar(g_y, &var);
// หลังจากที่คุณได้รับสตริงที่ปลอดภัยเป็นสตริงปกติแล้ว คุณต้องปล่อยมันด้วยฟังก์ชัน HerculesFreeMem。
char *str = HerculesGetString(g_str);
HerculesFreeMem(str);
// ก่อนที่จะกำหนดตัวแปรสตริงใหม่ จะต้องลบมันออกโดยใช้ฟังก์ชัน HerculesRemoveVar
HerculesRemoveVar(g_str);
g_str = HerculesAddString(<A new string downloaded from the server or generated dynamically>);
}
อ้างอิง (C++)¶
- ใช้เมื่อมีการกำหนดค่าตัวแปรที่ปลอดภัยด้วยค่า (สถานะที่วัตถุถูกจัดสรร)
- ใช้เป็นการกำหนดผลลัพธ์สุดท้ายซึ่งถูกสร้างขึ้นหลังจากการคำนวณที่จำเป็นทั้งหมดเสร็จสิ้น
- โปรดดูตัวอย่างด้านล่าง (C++ มีการโอเวอร์โหลดตัวดำเนินการ)