JsonUtility ã§æžãåºããã»ãŒããã¡ã€ã«ã¯ãã¡ã¢åž³ã§éããšã”gold”:1200ããšãã®ãŸãŸèªããŠããŸããŸããæ°åã 999999 ã«æžãæããŠä¿åãçŽãã°ãããã ãã§å€§éæã¡ãå人ã§äœã£ãã²ãŒã ãå ¬éãããšãæå€ãšæ©ã段éã§ããããæ¹é ããããŸãã
ãã®èšäºã§ã¯ãUnityã®ã»ãŒãããŒã¿ãæå·åããæ¹æ³ããèªäœããšãã¢ã»ãããã«åããŠæ¯ã¹ãŸããåããã®ã¯ãæå·åã§é²ããããšãšé²ããªãããšãèªäœãããšãã®AESã®ã³ãŒãäŸãæå·åã«å¯Ÿå¿ããã¢ã»ãã4æ¬ã®éãïŒ2026幎10ææç¹ã®äŸ¡æ ŒãšæŽæ°æ¥ã€ãïŒããããŠèªåã®ã²ãŒã ã«ã¯ã©ããåãããã®4ã€ã§ãã
ã»ãŒã以å€ãå«ããŠãå®çªã¢ã»ããããŸãšããŠèŠãŠãããã人ã¯ãã¡ããã©ããã
- ã»ãŒãããŒã¿ã®æå·åã§é²ããããšã»é²ããªãããš
- æå·åã¯èªäœãšã¢ã»ãããã©ã¡ããéžã¶ïŒ
- èªäœãããªãïŒAESãšHMACã§ã»ãŒããæå·åããã³ãŒãäŸ
- Unityã®ã»ãŒãããŒã¿æå·åã¢ã»ãã4éž
- æå·åã¢ã»ãã4æ¬ã®æ¯èŒè¡š
- ç®çå¥ïŒã»ãŒãã®æå·åã¯ããéžã¶
- ææã®æå·åã¢ã»ããã¯ã»ãŒã«ã®ã¿ã€ãã³ã°ã§
- ãŸãšãïŒã»ãŒãã®æå·åã¯ãäœãå®ãããããã§æ±ºãã
ã»ãŒãããŒã¿ã®æå·åã§é²ããããšã»é²ããªãããš
å ã«ãæå·åã®éçãã¯ã£ãããããŠãããŸãããããç¥ããã«ã¢ã»ãããè²·ããšããæå·åããã®ã«æ¹é ãããããšãã£ããããããšã«ãªããããŸããã
é²ããããšïŒãã¡ã€ã«ãéããŠæ°åãæžãæããæ¹é
æå·åãããšãã»ãŒããã¡ã€ã«ã¯æå³ã®ãªããã€ãåã«ãªããŸããã¡ã¢åž³ããã€ããªãšãã£ã¿ã§éããŠããã©ããææéã§ã©ããã¬ãã«ãªã®ãèŠåããã€ããŸããããããã§é ãããŠãããã»ãŒããšãã£ã¿ãã®ãããªæè»œãªæ¹é ããŒã«ã¯ãã ããããã®æ®µéã§äœ¿ããªããªããŸãã
é²ããªãããšïŒéµãæãåºãæ¹é ãšãã¡ã¢ãªã®æžãæã
ã²ãŒã ã¯ã»ãŒããèªã¿èŸŒãããã«ã埩å·ã®éµïŒãã¹ã¯ãŒãïŒãå¿ ãèªåã®äžã«æã£ãŠããŸããã€ãŸãããã«ãããã²ãŒã ãè§£æãããã°éµã¯èŠã€ããããšããããšã§ããEasy Save ã®å ¬åŒããã¥ã¡ã³ãã§ããã³ãŒãã«æžãããã¹ã¯ãŒãã¯ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ã§åãåºããããããšæ³šææžãããããŸãã
ãã1ã€ãCheat Engine ã®ãããªããŒã«ã§ããã¬ã€äžã®ã¡ã¢ãªäžã®æ°å€ãçŽæ¥æžãæããæ¹é ããããŸãããã¡ãã¯ã»ãŒããã¡ã€ã«ãçµç±ããªãã®ã§ããã¡ã€ã«ã®æå·åã§ã¯æ¢ãŸããŸããã
ã©ã³ãã³ã°ã課éã¢ã€ãã ã察æŠã®æŠçžŸã®ããã«ãä»ã®ãã¬ã€ã€ãŒã«åœ±é¿ããããŒã¿ãã¯ã端æ«ã®äžã®ã»ãŒããä¿¡çšããªãäœãã«ããã®ãåºæ¬ã§ãããµãŒããŒåŽã§èšé²ã»æ€èšŒãããããããŸãããæå·åã¯ããããŸã§æ¹é ã®æéã倧ããå¢ããããã®å¯Ÿçã§ãã
ãæå·åããšãæ¹ããã®æ€ç¥ãã¯å¥ãã®
æå€ãšèŠèœãšãããã¡ãªã®ããããAESã§æå·åããã ãã®ãã¡ã€ã«ã§ãããã€ãã1ã€æžãæããããšã¯ã§ããŸãã埩å·ãããšå£ããããŒã¿ã«ãªãããéãæªããšãšã©ãŒã«ãªããã«åŠãªå€ãèªã¿èŸŒãŸããããšããããŸãã
æžãæããããããšã確å®ã«èŠæããããªããæå·åã«å ããŠã眲åïŒHMACïŒããä»ããŠãèªã¿èŸŒã¿æã«ç §åããå¿ èŠããããŸããåŸã§ç޹ä»ãã Anti-Cheat Toolkit ã¯ããã®æ¹ããæ€ç¥ã売ãã«ããŠããã¢ã»ããã§ãã
æå·åã¯èªäœãšã¢ã»ãããã©ã¡ããéžã¶ïŒ
倿ã®ç®å®ã¯ããã§ã«ã»ãŒãã®ä»çµã¿ããããã©ãããã ãšæããŸãã
JSON ã PlayerPrefs ã§ã»ãŒãæ©èœãäœãçµããŠããŠããã¡ã€ã«ãèªããªããããã ããªããèªäœã§ååã§ãã.NET ã«å ¥ã£ãŠãã AES ã®ã¯ã©ã¹ã䜿ãã°ã100è¡ãããããã«æžããŸããJSONã§ã®ã»ãŒãã®äœãæ¹ã¯ããã¡ãã®èšäºã§æé ã远ã£ãŠèª¬æããŠããŸãã
ãUnityãJSONã䜿ã£ãã»ãŒãã»ããŒãïŒåå¿è ã§ãç°¡åã«å®è£ ïŒ
å察ã«ãããããã»ãŒãæ©èœãäœã段éãªããæå·åã€ãã®ã»ãŒãã¢ã»ãããå ¥ããŠããŸãã»ããæ©ãã§ããã»ãŒãã¹ããããããã¯ã¢ãããäžç·ã«æã«å ¥ããŸãããéµã®äœãæ¹ãIVã®æ±ãã§ééããå¿é ããããŸãããã¡ã¢ãªæ¹é ãŸã§å¯Ÿçããããªããéžæè¢ã¯å®è³ª Anti-Cheat Toolkit ã«ãªããŸãã
èªäœãããªãïŒAESãšHMACã§ã»ãŒããæå·åããã³ãŒãäŸ
ããã§ã¯ãJsonUtility ã§äœã£ãæååã AES ã§æå·åããããã« HMAC-SHA256 ã®çœ²åãä»ããŠãã¡ã€ã«ã«ä¿åããã¯ã©ã¹ãäœããŸãã䜿ã£ãŠããã®ã¯ System.Security.Cryptography ã® AesãRfc2898DeriveBytesãHMACSHA256 ã§ãã©ãã Unity 6 ã®æ¢å®ã® API äºæã¬ãã«ïŒ.NET Standard 2.1ïŒã§äœ¿ããã¯ã©ã¹ã§ãã
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
[Serializable]
public class SaveData
{
public int gold;
public int level;
}
public static class SecureSave
{
// éµã®å
ã«ãªãåèšèãšãœã«ãïŒèªåã®ã²ãŒã ã§ã¯å¿
ãå¥ã®æååã«å€ããïŒ
const string Password = "change-this-password";
static readonly byte[] Salt = Encoding.UTF8.GetBytes("my-game-salt-01");
static string FilePath => Path.Combine(Application.persistentDataPath, "save.dat");
// åèšèãããæå·åçšããšãæ¹ãããã§ãã¯çšãã®éµã32ãã€ããã€äœã
static void MakeKeys(out byte[] encKey, out byte[] macKey)
{
using (var kdf = new Rfc2898DeriveBytes(Password, Salt, 100000, HashAlgorithmName.SHA256))
{
encKey = kdf.GetBytes(32);
macKey = kdf.GetBytes(32);
}
}
public static void Save(SaveData data)
{
byte[] plain = Encoding.UTF8.GetBytes(JsonUtility.ToJson(data));
MakeKeys(out byte[] encKey, out byte[] macKey);
byte[] iv, cipher;
using (Aes aes = Aes.Create())
{
aes.Key = encKey;
aes.GenerateIV(); // ä¿åã®ãã³ã«æ°ããIVãäœã
iv = aes.IV;
using (ICryptoTransform enc = aes.CreateEncryptor())
{
cipher = enc.TransformFinalBlock(plain, 0, plain.Length);
}
}
// ãã¡ã€ã«ã®äžèº«ã¯ [IV 16ãã€ã][æå·æ][眲å 32ãã€ã] ã®é
byte[] file = new byte[iv.Length + cipher.Length + 32];
Buffer.BlockCopy(iv, 0, file, 0, iv.Length);
Buffer.BlockCopy(cipher, 0, file, iv.Length, cipher.Length);
using (var hmac = new HMACSHA256(macKey))
{
byte[] mac = hmac.ComputeHash(file, 0, iv.Length + cipher.Length);
Buffer.BlockCopy(mac, 0, file, iv.Length + cipher.Length, 32);
}
File.WriteAllBytes(FilePath, file);
}
// èªããªãã£ãæïŒæžãæãã»ç ŽæïŒã¯ null ãè¿ã
public static SaveData Load()
{
if (!File.Exists(FilePath)) return new SaveData();
byte[] file = File.ReadAllBytes(FilePath);
if (file.Length < 16 + 16 + 32) return null;
MakeKeys(out byte[] encKey, out byte[] macKey);
int bodyLength = file.Length - 32;
using (var hmac = new HMACSHA256(macKey))
{
byte[] mac = hmac.ComputeHash(file, 0, bodyLength);
int diff = 0;
for (int i = 0; i < 32; i++) diff |= mac[i] ^ file[bodyLength + i];
if (diff != 0)
{
Debug.LogWarning("ã»ãŒãããŒã¿ãæžãæããããŠããŸã");
return null;
}
}
using (Aes aes = Aes.Create())
{
aes.Key = encKey;
byte[] iv = new byte[16];
Buffer.BlockCopy(file, 0, iv, 0, 16);
aes.IV = iv;
using (ICryptoTransform dec = aes.CreateDecryptor())
{
byte[] plain = dec.TransformFinalBlock(file, 16, bodyLength - 16);
return JsonUtility.FromJson<SaveData>(Encoding.UTF8.GetString(plain));
}
}
}
}
䜿ãåŽã¯ãSecureSave.Save(data) ã§ä¿åããvar data = SecureSave.Load() ã§èªã¿èŸŒãã ããLoad ã null ãè¿ããããããŒã¿ãå£ããŠãããæžãæããããŠãããã®ã§ãæ°ããããŒã¿ã§å§ãçŽãããããã¯ã¢ããããæ»ãåŠçã«ã€ãªããŸãã
ãã®ã³ãŒãã¯ãUnityã®ãšãã£ã¿ã§ã¯ãªã .NET ã®ç°å¢ã§ã.NET Standard 2.1 åãã®ãã«ããéãããšãä¿åãããã¡ã€ã«ã®1ãã€ããæžãæãããš Load ã null ãè¿ãããšã確ãããŸããïŒJsonUtility ãš Application ã®éšåã¯ä»£ããã®åŠçã«çœ®ãæããŠããŸãïŒã
ã³ãŒãã®äžã§ãã£ãŠããããš
åèšèããã®ãŸãŸéµã«ãããRfc2898DeriveBytes ã§32ãã€ãã®éµã2æ¬äœã£ãŠããã®ã¯ãæå·åçšãšçœ²åçšã§éµãåããããã§ããIVïŒåæåãã¯ãã«ïŒã¯ä¿åã®ãã³ã«äœãçŽããŠãã¡ã€ã«ã®å é ã«æžããŠãããŸãããããããšãåãããŒã¿ã2åä¿åããŠããã¡ã€ã«ã®äžèº«ãæ¯åå€ããããã©ããææéãããæ¯ã¹ãŠæ¢ãæãããããªããªããŸãã
眲åã®ç §åã§ã1ãã€ããã€èŠæ¯ã¹ãŠéäžã§æããã«æåŸãŸã§åããŠããã®ã¯ãæ¯ã¹ãã®ã«ããã£ãæéããæ£ãã眲åãæšæž¬ãããæå£ãžã®åãã§ããã»ãŒãããŒã¿ã§ãããŸã§æ°ã«ããå Žé¢ã¯å°ãªããã®ã®ãæžãæ¹ãšããŠèŠããŠãããŠæã¯ãªããšæããŸãã
èªäœã§ã€ãŸããããã3ã€ã®ããš
1ã€ç®ã¯ãåèšèããœã«ããåŸããå€ãããšããããŸã§ã®ã»ãŒããå šéšèªããªããªãããšãå ¬éåŸã«å€ãããªããå€ãéµã§èªãã§æ°ããéµã§ä¿åãçŽãç§»è¡ã®åŠçãå¿ èŠã§ãã
2ã€ç®ã¯ãæå·åãå ¥ããåã®ã»ãŒããã¡ã€ã«ãæ®ã£ãŠããããšããšãã£ã¿ã§è©Šããšãã¯ãäžåºŠã»ãŒããã¡ã€ã«ãæ¶ããŠãã確ãããŠãã ãããã»ãŒããã¡ã€ã«ãã©ãã«ãããã¯ããã¡ãã®èšäºã«OSå¥ã§ãŸãšããŠããŸãã
ãUnityãã»ãŒãããŒã¿ã®ä¿åå ŽæïœWindowsã»Androidå¥ã®ç¢ºèªãšåé€ã»å€æŽ
3ã€ç®ã¯ãéµãäœãåŠçïŒRfc2898DeriveBytesïŒãããããšæéããããããã«äœãããŠããããšã§ãããªãŒãã»ãŒããæ°ç§ããã«åŒã¶ãããªã²ãŒã ãªããæåã«1åã ãéµãäœã£ãŠå€æ°ã«æã£ãŠãã圢ã«çŽããšè»œããªããŸãã
Unityã®ã»ãŒãããŒã¿æå·åã¢ã»ãã4éž
ããããã¯ã¢ã»ããã§ããäŸ¡æ Œã¯USDãæŽæ°æ¥ã¯2026幎10ææç¹ã®ã¹ãã¢è¡šç€ºã§ãç¡æã®2æ¬ããé ã«äžŠã¹ãŸãããã»ãŒãæ©èœãã®ãã®ã®æ¯èŒã¯ææã®èšäºã§ãã£ãã®ã§ãä»åã¯ãæå·åãŸãããã«çµã£ãŠèŠãŠãããŸãã
1. Easy SaveïŒæå·åã®èšå®ãäžçªããããïŒ
2011幎ããã¹ãã¢ã«ããå®çªã®ã»ãŒãã¢ã»ããã§ãäŸ¡æ Œã¯65ãã«ãææ°çã¯2026幎7æã®å ¬éã§ãã
å ¬åŒããã¥ã¡ã³ãã«ãããšãæå·åã®æ¹åŒã¯128ãããã®AESã§ãåæç¶æ ã§ã¯ãªããããã©ã«ãèšå®ã§ãªã³ã«ããããES3Settings ãæž¡ããŠä¿åã»èªã¿èŸŒã¿ã®ãã³ã«æå®ããŸãã
// åèšèãæå®ããŠAESã§æå·åãã
var settings = new ES3Settings(ES3.EncryptionType.AES, "myPassword");
ES3.Save("gold", gold, settings);
gold = ES3.Load<int>("gold", defaultValue: 0, settings: settings);
æ¢å®å€ã¯ defaultValue: ãšååãä»ããŠæž¡ãã®ããã€ã³ããååãä»ããã«æžããšã2çªç®ã®åŒæ°ããã¡ã€ã«ã®ãã¹ãšããŠæ±ãããããšãããããšããã¥ã¡ã³ãã«ã泚æããããŸãã
èªäœã ãš30è¡ä»¥äžããã£ãåŠçããèšå®1è¡ã§æžãããã§ããå§çž®ãã»ãŒãã¹ããããããã¯ã¢ãããåãã¢ã»ããã®äžã§å®çµããŸãã
æ°ãã€ãããã®ã¯ãæå·åããªã³ã«ããŠãããããŸã§ã®æå·åãããŠããªãã»ãŒãã¯ãã®ãŸãŸæ®ãããšãããã¥ã¡ã³ãã§ã¯ããšãã£ã¿ãªã Tools > Easy Save 3 > Clear Persistent Data Path ã§æ¶ãããæ¡å ãããŠããŸãããŸããã¢ããªã¹ãã¢ã«ãã£ãŠã¯æå·åã䜿ã£ãŠããããšã®ç³åãå¿ èŠã«ãªãå Žåãããããšããæ³šææžãããããŸãããiOS ã§åºã人ã¯ç¢ºèªããŠãããŸãããã
Easy Save ã®åºæ¬ã®äœ¿ãæ¹ã¯ããã¡ãã®èšäºã§ã»ãŒããã€ã³ããäœããªãã玹ä»ããŠããŸãã
ãEasySaveãã»ãŒããã€ã³ããäœæããŠã»ãŒãïŒããŒããã
2. ESave – Save System for UnityïŒç¡æã§æå·åãéžã¹ãïŒ
Esper Code ãç¡æã§åºããŠããã»ãŒãã¢ã»ããã§ããææ°çã¯2026幎8æå ¬éãäºææ§ã®æ¬ã¯ Unity 6000.3ã
ã¹ãã¢ã®èª¬æã§ã¯ãAESã§ããã¹ãŠã®ã»ãŒãããŸãã¯éžãã ã»ãŒãã ãããæå·åã§ãããšãããŠããŸããèšå®ããŒã¿ã¯å¹³æãé²è¡ããŒã¿ã ãæå·åããšãã£ãåãæ¹ãã§ããã®ã¯äŸ¿å©ã§ããã倧ããªãã¡ã€ã«ãè£ã§èªã¿æžãããæ©èœããããç¡æã§ãããŸã§ããã£ãŠããã®ã¯è²Žéã ãšæããŸãã
äžæ¹ã§ãæ¹ããã®æ€ç¥ã«ã€ããŠã¯ã¹ãã¢ã®èª¬æã«èšèŒããããŸãããæžãæããèŠæãä»çµã¿ãŸã§æ¬²ãããªããèªäœã®HMACãè¶³ããã4æ¬ç®ã® Anti-Cheat Toolkit ãæ€èšããããšã«ãªããŸãã
3. Quick SaveïŒç¡æã»AESãšGzipå§çž®ïŒ
ç¡æã§å ¬éãããŠããã»ãŒãçšã®ã¢ã»ããã§ããã¹ãã¢ã®èª¬æã«ãããšãä¿åãããã¡ã€ã«ãAESã§æå·åã§ããGzipå§çž®ã§ãã¡ã€ã«ãå°ããããæ©èœãä»ããŠããŸããJSONã§ã®ã·ãªã¢ã©ã€ãºãCSVã®èªã¿æžãã«ã察å¿ãããœãŒã¹ã³ãŒãããã¹ãŠå ¥ã£ãŠããŸãã
ãã ãææ°çã¯2024幎2æã®å ¬éã§ãäºææ§ã®æ¬ã¯ Unity 2019.4 ã®ãŸãŸã察å¿ãã©ãããã©ãŒã ã®äžèŠ§ã« WebGL ã®èšèŒããããŸãããã¹ãã¢ã®ããŒãžã«ããããã¥ã¡ã³ããžã®å°ç·ãä»ã¯ãã©ãã«ãããUnity 6 ã§æ°ããå§ãããªããæŽæ°ãç¶ããŠãã ESave ãå ã«è©Šãã»ããå®å¿ã ãšæããŸããå€ããããžã§ã¯ãã§ãã§ã«äœ¿ã£ãŠãã人åãããšããäœçœ®ã¥ãã§ãã
4. Anti-Cheat ToolkitïŒæ¹ããæ€ç¥ãšã¡ã¢ãªæ¹é ã®å¯ŸçãŸã§ïŒ
Code Stage ã2013幎ããæŽæ°ãç¶ããŠããããŒã察çã®ã¢ã»ããã§ãäŸ¡æ Œã¯88ãã«ã2026幎10æã«ãæ°ããçãåºãŠããŠãUnity 2022.3 以éãš Unity 6 ã«å¯Ÿå¿ããŠããŸãã
ã»ãŒããŸããã§ã¯ãPlayerPrefs ã®ä»£ããã«äœ¿ã ObscuredPrefs ãšããã¡ã€ã«çšã® ObscuredFile ãå ¥ã£ãŠããŸããã©ã¡ããæå·åã«å ããŠæ¹ãããæ€ç¥ã§ããã»ãŒããç¹å®ã®ç«¯æ«ããŠãŒã¶ãŒIDã«çµã³ã€ããïŒä»äººã®ã»ãŒããæã¡èŸŒããªãããïŒããšãã§ããŸãã
using CodeStage.AntiCheat.Storage;
// PlayerPrefs ãšåãæèŠã§æžãã
ObscuredPrefs.Set("gold", 1200);
int gold = ObscuredPrefs.Get("gold", 0);
// æžãæããããããŒã¿ãèªãã æã«åŒã°ãã
ObscuredPrefs.NotGenuineDataDetected += () => Debug.LogWarning("æ¹ãããæ€ç¥");
å ¬åŒããã¥ã¡ã³ãã«ãããšãæ¢åã® PlayerPrefs ã®ããŒã¿ãç§»ãä»çµã¿ãããã®ã§ãPlayerPrefs ã§äœã£ãã²ãŒã ã«åŸããå ¥ããããã®ãç¹åŸŽã§ããããã« Obscured TypesïŒã¡ã¢ãªäžã®å€ãé ãåïŒããã¹ããŒãããã¯ã»æå»æ¹ããã®æ€ç¥ãªã©ãã»ãŒã以å€ã®ããŒã察çããŸãšããŠå ¥ã£ãŠããŸãã
ã¹ãã¢ã®èª¬æã§ãã100%é²ããã¢ã³ãããŒãã¯ãªãããšã¯ã£ããæžãããŠããŸãã課éãã©ã³ãã³ã°ãããã²ãŒã ã§ãæè»œãªæ¹é ããŸãšããŠæ¢ããã人åãã§ããã»ãŒããèªããªããããã ããªãããããŸã§ã®æ©èœã¯ãããŸããã
æå·åã¢ã»ãã4æ¬ã®æ¯èŒè¡š
| ã¢ã»ãã | äŸ¡æ Œ | ææ°ç | æå·å | æ¹ããæ€ç¥ | åããŠãã人 |
|---|---|---|---|---|---|
| Easy Save | 65ãã« | 2026幎7æ | AESïŒèšå®1è¡ïŒ | èšèŒãªã | ã»ãŒãæ©èœããšä»»ããã |
| ESave | ç¡æ | 2026幎8æ | AESïŒãã¡ã€ã«ããšã«éžã¹ãïŒ | èšèŒãªã | ç¡æã§æå·åã詊ããã |
| Quick Save | ç¡æ | 2024幎2æ | AESïŒGzipå§çž® | èšèŒãªã | å€ããããžã§ã¯ãã§äœ¿ã£ãŠãã |
| Anti-Cheat Toolkit | 88ãã« | 2026幎10æ | ObscuredPrefs / ObscuredFile | ããïŒç«¯æ«ããã¯ãïŒ | 課éã»ã©ã³ãã³ã°ããã |
ãæ¹ããæ€ç¥ãã®åã¯ãã¹ãã¢ã®èª¬æãšããã¥ã¡ã³ãã§ç¢ºèªã§ãããã©ããã§ããèšèŒãªãã®ã¢ã»ããã§ããæå·åãããŠããã°æžãæããéšåã¯æ£ããèªããªããªããŸãã
ç®çå¥ïŒã»ãŒãã®æå·åã¯ããéžã¶
ã»ãŒãæ©èœãããäœã£ãŠãã â èªäœã®AESïŒHMACïŒãã®èšäºã®ã³ãŒãïŒã§ååã§ãã
ããããã»ãŒãæ©èœãäœãã»ç¡æã§æžãŸããã â ESave
ã»ãŒãã¹ããããã¯ã©ãŠãä¿åãå«ããŠãé·ã䜿ããå®çªãã»ãã â Easy Save
課éã»ã©ã³ãã³ã°ããã£ãŠãã¡ã¢ãªæ¹é ãã¹ããŒãããã¯ãæ°ã«ãªã â Anti-Cheat ToolkitïŒã»ãŒã㯠Easy Save ãªã©ãšäœµçšãå¯ïŒ
å人çã«ã¯ããœãã§éã¶ã²ãŒã ãªãæå·åã ãã§ååã§ãæ¹ããæ€ç¥ãŸã§å¿ èŠã«ãªãã®ã¯ã©ã³ãã³ã°ã課éã絡ããšãã ãšèããŠããŸããå®ããããã®ã®å€§ããã«åãããŠéžã¶ã®ãããéãšæéããããããªãã³ãã§ãã
ã»ãŒãæ©èœãã®ãã®ãã¢ã»ããã§éžã³ãã人ã¯ãç¡æã®2æ¬ãšå®çªã® Easy Save ãæ¯ã¹ããã¡ãã®èšäºãåèã«ãªããŸãã
ææã®æå·åã¢ã»ããã¯ã»ãŒã«ã®ã¿ã€ãã³ã°ã§
Easy Save ã®65ãã«ãAnti-Cheat Toolkit ã®88ãã«ã¯ãå人éçºã ãšæ°è»œã«åºããéé¡ã§ã¯ãããŸãããUnity Asset Store ã§ã¯å¹Žã«äœåã倧ããªã»ãŒã«ããããããŒã«ç³»ã®ã¢ã»ãããåé¡ååŸã«ãªãããšããããŸããæ¥ãã§ãªããã°ãç¡æã® ESave ãèªäœã®ã³ãŒãã§ã€ãªãã§ãããŠãã»ãŒã«ã§è²·ãæ¿ããã®ãæã§ãã
ä»ã©ããªã»ãŒã«ããã£ãŠãããã¯ãæ¯ææŽæ°ããŠãããã¡ãã®ããŒãžã§ç¢ºèªã§ããŸãã
ãŸãšãïŒã»ãŒãã®æå·åã¯ãäœãå®ãããããã§æ±ºãã
ã»ãŒãããŒã¿ã®æå·åã§é²ããã®ã¯ããã¡ã€ã«ãéããŠæ°åãæžãæããæè»œãªæ¹é ãŸã§ãéµã¯ã²ãŒã ã®äžã«ããã®ã§ãæ¬æ°ã§è§£æãããã°ç ŽãããŸãããã¡ã¢ãªã®æžãæãã¯å¥ã®å¯Ÿçãå¿ èŠã§ãã
ãã¡ã€ã«ãèªããªããããã ããªããèªäœã®AESïŒHMACãç¡æã® ESave ã§è¶³ããŸããã»ãŒãæ©èœããšä»»ããããªã Easy Saveã課éãã©ã³ãã³ã°ãå®ããããªã Anti-Cheat Toolkitããã®é çªã§èãããšè¿·ãã«ããã¯ãã§ãã
ææã®2æ¬ãè²·ããªãã仿ã®Asset Storeã»ãŒã«æ å ±ãå ã«ã®ãããŠã¿ãŠãã ããã




