シヴァのブログ

UnityやUE4や趣味とかいろいろ...

「Cocos2d-x」UserDefaultについて

UserDefaultについてメモ。

バージョン:cocos2d-x-3.13.1

書くことは、以下の3点。

  • UserDefaultの簡単な使い方
  • UserDefaultの格納場所
  • UserDefault.xmlのファイルパスを変更してみた

UserDefaultの簡単な使い方

UserDefault* _userDef = UserDefault::getInstance();

// データを保存する
_userDef->setStringForKey("key1", hogrhoge);//文字
_userDef->setIntegerForKey("key2", 1);//int型
_userDef->setFloatForKey("key3",1.0f);//float型
_userDef->setBoolForKey("key4",true);//bool型

// 保存データを呼出す
_userDef->getStringForKey("key1");//文字
_userDef->getIntegerForKey("key2");//int型
_userDef->getFloatForKey("key3");//float型
_userDef->getBoolForKey("key4");//book型

▼リファレンス
cocos2d-x: UserDefault Class Reference

UserDefaultの格納場所

基本的に、Win32の場合、
「C:\Users\ユーザ名\AppData\Local\プロジェクト名\UserDefault.xml」に格納される。

以下のコード書くと、パスが表示される。

cocos2d::log("%s", CCFileUtils::sharedFileUtils()->getWritablePath().c_str());

表示例:C:/Users/shiva/AppData/Local/myGame/

▼リファレンス
cocos2d-x: FileUtilsAndroid Class Reference

んで、CCFileUtils-win32.cppの「getWritablePath」を読んでいたら、
ファイルパスの作り方書いていて勉強になった。

UserDefault.xmlのファイルパスを変更してみた

※できたのはできたけど、何故か書き込みできないから参考にはしないでね☆
「C:\Users\ユーザ名\AppData\Local\プロジェクト名\UserDefault.xml」まで探しに行くの面倒だと思って、ファイルパスの変更ができるのかググってみたけど検索に引っかからなかった。

なので、ソース読んでみた。
「getWritablePath」があるなら、自分でUserDefault.xmlのファイルパスを変更できるだろう...。


「setWritablePath」を探してみたら、
CCFileUtils.cppに「CCFileUtils::sharedFileUtils()->setWritablePath」を見つけた。

さっそく使ってみる。「Resources」フォルダに「SaveData」フォルダ作ってそこに作成できるか検証。

CCFileUtils::sharedFileUtils()->setWritablePath("C:/Android/AndroidGame/Resources/SaveData/");

▼結果:成功
f:id:shivaT:20171113201437p:plain:w300

成功はしたが、他のPCでゲーム起動するとパスも異なるのであまりお勧めはしない。




ちなみに、「_(アンダーバー)」を入れると、Resourcesフォルダに「_UserDefault.xml」が作られる。

CCFileUtils::sharedFileUtils()->setWritablePath("_");

f:id:shivaT:20171113204108p:plain:w300


これは、CCUserDefault.cppの「void UserDefault::initXMLFilePath()」で、
以下の記述がしているため。

#define XML_FILE_NAME "UserDefault.xml"

void UserDefault::initXMLFilePath()
{
    if (! _isFilePathInitialized)
    {
        _filePath += FileUtils::getInstance()->getWritablePath() + XML_FILE_NAME;
        _isFilePathInitialized = true;
    }    
}

こんな感じでメモ終了。