Cocos学习之核心功能(六)
目录
- 前言
- 💾 本地存储(PlayerPrefs)
- **核心概念**
- **案例1:加密存档数据**
- **案例2:JSON存储复杂对象**
- **案例3:游戏设置存储(音量/语言)**
- 总结
- 📝 **本阶段任务**
- **常见问题预解答**:
前言
本地存储是提升游戏体验的关键技术,能实现用户偏好记忆、进度持久化等功能。本文基于Cocos引擎,从基础设置存储到复杂数据结构处理,层层递进解析本地存储实现方案,特别针对敏感数据提出加密建议,帮助开发者构建安全可靠的数据存储系统。
💾 本地存储(PlayerPrefs)
核心概念
-
存储方式
- 键值对存储:数据以
key: string
对应value: string | number | boolean
保存 - 数据加密:敏感数据(如金币数)建议加密后存储
- 存储位置:不同平台路径不同(如Web浏览器使用
localStorage
,移动端存于应用沙盒)
- 键值对存储:数据以
-
常用API
// 保存数据 PlayerPrefs.setInt('high_score', 100); PlayerPrefs.setString('player_name', 'Cocos'); PlayerPrefs.save(); // 立即写入磁盘(Web端可能忽略)// 读取数据(需提供默认值) const score = PlayerPrefs.getInt('high_score', 0); const name = PlayerPrefs.getString('player_name', '玩家1');// 删除数据 PlayerPrefs.deleteKey('player_name'); PlayerPrefs.clear(); // 清空所有数据
-
存储路径
- Web:浏览器 LocalStorage,浏览器原生API,直接存储字符串(推荐简单数据)
- 原生平台:系统指定目录(如Windows:
%userprofile%\AppData\Local\游戏名
)
-
数据加密
- 敏感数据建议加密后存储(如玩家密码、付费信息)
案例1:加密存档数据
目标:对金币数进行简单加密存储。
// 加密函数(示例:异或加密)
private simpleEncrypt(data: number): string {const key = 0x55;return (data ^ key).toString(16); // 转为16进制字符串
}// 解密函数
private simpleDecrypt(encrypted: string): number {const key = 0x55;return parseInt(encrypted, 16) ^ key;
}// 使用示例
saveCoins(coins: number) {PlayerPrefs.setString('coins', this.simpleEncrypt(coins));
}loadCoins(): number {const encrypted = PlayerPrefs.getString('coins', '0');return this.simpleDecrypt(encrypted);
}
案例2:JSON存储复杂对象
// 定义玩家数据接口
interface PlayerData {name: string;hp: number;inventory: string[];
}// 保存
const data: PlayerData = {name: "冒险者",hp: 100,inventory: ["sword", "potion"]
};
PlayerPrefs.setString('player_data', JSON.stringify(data));// 读取
const savedData = PlayerPrefs.getString('player_data');
if (savedData) {const loadedData: PlayerData = JSON.parse(savedData);
}
案例3:游戏设置存储(音量/语言)
// 系统设置类
class GameSettings {static get musicVolume(): number {return PlayerPrefs.getFloat('music_volume', 0.8); // 默认值0.8}static set musicVolume(value: number) {PlayerPrefs.setFloat('music_volume', value);}static get language(): string {return PlayerPrefs.getString('language', 'zh'); // 默认中文}static set language(value: string) {PlayerPrefs.setString('language', value);}
}// 使用示例
GameSettings.musicVolume = 0.5; // 设置音量
console.log(GameSettings.language); // 获取当前语言
总结
本地存储开发需注意三点:1)及时保存关键状态,如案例1通过UI事件触发存储;2)结构化数据使用JSON序列化时需配合try-catch容错,如案例2的存档损坏处理;3)敏感信息至少采用基础加密,如案例3的Base64编码。建议重要数据增加云端备份,本地存储仅作为缓存方案,同时注意5MB存储容量限制。
📝 本阶段任务
- 在现有项目中实现:
- 玩家每次击败敌人后金币+10,退出游戏后仍保留
- 创建设置界面,可调整音乐/音效音量并持久化保存
- 开发存档/读档功能:
- 允许保存最多3个存档位
- 存档包含玩家位置、HP、当前场景
- 实现 清空存档 按钮(使用
PlayerPrefs.deleteAll
)
常见问题预解答:
- Web端存储失效:检查域名是否被浏览器限制(如本地file协议)
- 读取到默认值:确认保存时使用的
key
与读取时完全一致(区分大小写) - 中文乱码:使用
encodeURIComponent
对字符串编码后再存储PlayerPrefs.setString('name', encodeURIComponent("中文名字")); const name = decodeURIComponent(PlayerPrefs.getString('name'));