ボアブログ

へっぽこUnityエンジニアの色々

【RPGツクールMV】GameStrings的なアレその2

いつもの二日坊主です。
今日は昨日の記事の続き、というか少し処理を更新してみたので変更内容についてです。

JSONの中身を変更

少しだけスプレッドシートのコードを変えました。

function onOpen() {
  var menu=[
    {name: "To Json", functionName: "convert"}
  ];
  SpreadsheetApp.getActive().addMenu("Convert", menu);
}

function convert()
{
  var sheet = SpreadsheetApp.getActiveSheet();
  var keys = sheet.getRange(2, 1, 1, sheet.getLastColumn()).getValues()[0];
  var data = sheet.getRange(3, 1, sheet.getLastRow()-2, sheet.getLastColumn()).getValues();
  var list = {};
  data.forEach(function(row){
    var obj = {};
    for(var i=1; i < keys.length; i++)
    {
      obj[keys[i]] = row[i];
    }
    list[row[0]] = obj;
  });
  
  sheet.getRange(1,2).setValue(JSON.stringify(list));
}

どう変えたかは前回の記事と見比べて頂くとして、前回のコードで生成されたJSONと今回のコードで生成されたJSONを比べます。

旧
[
    {
        "en": "English.", 
        "jp": "日本語です。", 
        "key": "MESSAGE_001"
    }, 
    {
        "en": "Switch to Japanese.", 
        "jp": "英語に切り替えます。", 
        "key": "MESSAGE_002"
    }
]
新
{
    "MESSAGE_001": {
        "en": "English.", 
        "jp": "日本語です。"
    }, 
    "MESSAGE_002": {
        "en": "Switch to Japanese.", 
        "jp": "英語に切り替えます。"
    }
}

昨日までのコードではkeyまで含めた連想配列の配列としてjson形式にしていました。その場合、対象の文字列を探す時総当りなりする必要があるのですが処理的にちょっと面倒です。
その為、今回のコードでは1列目をキーにした連想配列連想配列にしました。こうしておくことでコード上では$gameString["MESSAGE001"]のような形でアクセス出来るようになり簡素化しています。
プラグイン側でもこの形に沿う用に変更してあります。

jsonファイルはdata/Translate/以下に配置

詳しくは後述しますが、ファイル数が増える設計になったため翻訳専用のフォルダを作って配置しました。

マップ毎にJSONを読み込む

昨日時点でのプラグインでは「全ての文言」をGameStrings.jsonに入れ、そこから読み込む形で翻訳していました。
この「全ての文言」には現在いるマップ以外のマップに配置されたイベントの文章等も含まれます。基本的にそれらは、該当するマップに居なければ使用しないものなのでちょっとメモリに優しくありません。

そこで文章等はマップごとのjsonに分け、MapDataと共に必要なものだけ読み込む事で少し軽減してます。

はじめにエディタ側でマップ名を設定しておきます。

f:id:weakboar:20170725233602p:plain

シート側でシートを分け、それぞれデータを入力します。出力したjsonはそれぞれ[マップ名].jsonにしてTranslate以下に配置します。

f:id:weakboar:20170725233831p:plain

f:id:weakboar:20170725233846p:plain

f:id:weakboar:20170725234053p:plain

こうしておくことで、読み込むMapDataのマップ名とファイル名を紐付けて、マップに必要なjsonを読み込むようにしてあります。

ちなみにコード上ではGameStrings.GetText(key)を使用することでマップ毎のjsonから文言を取り出せます。

GameStrings.jsonは据え置き

配置こそTranslate以下になりましたが、ゲーム開始時に読み込むGameStrings.jsonは残してあります。
メニューのコマンド等の文言、固有名詞等はマップに関わらず必要になるためです。

何も変わっていない代わりと言っては何ですが、サンプル代わりに一部固定文言の翻訳に対応しています。

マップ名表示と

f:id:weakboar:20170725235207p:plainf:id:weakboar:20170725235215p:plain

メニュー(サンプルではアイテムとスキルのみ)です。

f:id:weakboar:20170725235421p:plain f:id:weakboar:20170725235439p:plain

これらはそれぞれMapDataの表示名や用語をGameStrings.jsonのキーに指定することで実現しています。

おわり

実際にこのプラグインローカライズ対応のために用いるにはアクター名やパラメータ名、さらにいえば\N[1]なんかの制御構文まで対応する必要があります。とはいえ、ローカライズを考慮したゲーム開発の足がかりにはなるかなという感じなので今後は大きな変更がない限り更新はしないと思います。多分。

言い訳をするとRPGツクールMVはかなりプログラミングもやれる開発環境なので小学生や中学生のプログラミング初学者に触れてほしく、考える余地を残している感じです。

学生向けのキャンペーンもやっているようなので是非やってほしいですね。 学生を対象にした「RPGツクールMV」の抽選プレゼント企画が開催。通常販売も6割引きに - 4Gamer.net