2019年9月23日ツクールMVの文章の表示では\V[n]でn番の変数の中身を文章内で表示することができます。今回ゲームを作成していて、文章表示に使う変数の中にも制御文字を入れたい場面が出てきました。具体的にはプラグインのYEP_MessageCoreを導入することで\I[n]でn番のアイコンを文章内に表示できるのですが、この制御文字を変数に入れておく必要がありました。ところが、これを\V[n]で表示しても「I[n]」とそのまま表示されてしまいます。これはツクマテの質問でも対応方法が回答されている内容です。上記リンクで回答されている方法でも問題なく表示できるのですが、直感的ではないので今回はプラグインを作成しました。(といっても、非常にシンプルな内容です)スポンサーリンク目次ダウンロード解説エスケープコード変数の中に制御文字を組み込めない理由プラグインでやっていることダウンロードExpandMessageVar.js上記リンクの右クリックメニューから保存できます。プラグインを有効にするだけでOKです。YEP_MessageCore.jsを使用している場合、その上下どちらに入れても問題ないことを確認しています。解説ここからはプログラム的な話なので興味のある方向けです。エスケープコード制御文字は、その内容を解析する前に\V[n]なら\x1bV[n]に変換されています。\x1bのことをエスケープコードといいます。\xは後ろに続く16進数で表現した文字コードであるという指定、1bは10進数に直すと27です。ASCIIコード表を見ると、27番がエスケープコード(ESC)であることが分かりますね。\x1bまでで1文字の文字なのですが、キーボードから入力することはできないのでこのように表現しています。エスケープコードの後ろには制御の指定が入るというお約束になっているので、エスケープコードに変換しておくことでプログラムから扱いやすくなるわけです。文章の表示で制御文字を展開する処理は以下の手順で行われています。バックスラッシュのエスケープコードへの変換\V[n]の展開その他の制御文字の展開もうお気づきでしょうか。\V[n]で展開された変数の中身に制御文字があっても、その中にあるバックスラッシュはエスケープコードには変換されていないのです。そのため、変数の中に制御文字を入れる際は\I[n]ではなく\x1bI[n]とすれば正しく表示されるわけですね。プラグインでやっていることプラグインでは、上記手順の2番目、\V[n]の展開までを行ったあと、もう一度エスケープコードへの変換から再度手順を実行するように修正しました。変数の中に入れてある制御文字についてもエスケープコードへの変換が行われるため、\x1bとつける必要がなくなりました。今回は変数に入れる制御文字に\V[n]をまた使っていて...というケースは考えていません。そこまで対応する場合は、\V[n]を見つける度にエスケープコードへの変換からやり直すような処理にする必要があります。アマガミナブログUnityエンジニア天神いなスマートフォンゲーム会社で新作ゲーム開発のリードエンジニアをしながら個人ゲームの開発もしています。当サイトでは、UnityやC#、シェーダなどゲーム開発の技術的なことを扱ったり、自作ツールの紹介などをしています。