Luaに書いてある「グローバル」変数を読み込む

  • 概要

    スクリプト言語「Lua」を用いて外部テキストを記述し、ScenarioMod内の変数へと読み込ませる。

    この章では、それらの機能の入門的利用方を解説します。

  • 一般的用途

    外部テキストファイルに、簡易な設定データ等を記述し、その値をScenarioModへと読み込む。

  • 備考

    Luaは外にテキストで記述する限り、基本的には「正しさが全く期待できない」。
    記述してあるかもしれないし、ないかもしれないし、記述が間違ってるかもしれない。
    事前に何もチェックできないため、実行してみなければわからないのだ。
    よって、何をやるにしても「例外エラーが」が極めて高い確率で発生しえる。

    このため、必ず try { } catch(...) { }のような記述で囲む必要がある。

    try ... catch ... を省略した場合でも、ScenarioModは不正終了しにくいよう、全てのメソッドにcatch防御壁が貼られている。

  • 例①

    • カスタム駆動関数.cpp

      string 読み込み変数 = "デフォ"; // この変数に、外部データから値を読み込む
      
      // 自分で定義した関数
      void Myパラメータインポート() {
          // フィアルの読み取り&実行にかかる。必ず try ... catch
          try {
              LUA::Do_ファイル("ScenarioMod.lua"); // ScenarioMod.lua というファイルを「Lua言語解釈」して実行する。
      
          // 何か例外エラーが発生した
          } catch (LUA::例外型 e) {
              デバッグ出力 << "ScenarioMod.luaで何かエラー:" << e << endl;
              return;  // このレベルでエラーしてるのはまずい。パラメタ読み取り即終了。
          }
      
          // ここまできたら、ファイルが読み込め、Luaとしても最低限実行できたようだ。
      
          // 変数の読み取りにかかる。必ず try ... catch
          try {
              読み込み変数 = LUA::Get_グローバル文字列("test_var");
          } catch(...) { }
      
          デバッグ出力 << "変数:" << 読み込み変数 << endl;
      }
      
      void カスタム::On_起動時() {
          Myパラメータインポート();
      }
      

      そして、以下のように対象となるluaファイルを「天翔記フォルダ」に用意する。

    • ScenarioMod.lua

      test_var = "ズキュキュン太"
      

      グローバル変数の読み込みは、「実数」と「文字列」の2つに対応している。
      繰り返しとなるが、必ず「try...catch...」するのが必須である。

      それを踏まえて、3種類の変数を読み込んでみよう。

  • 例②

    • カスタム駆動関数.cpp

      int 読み込み変数1 = 0;
      double 読み込み変数2 = 1.5;
      string 読み込み変数3 = "デフォ";
      
      void インポート関数() {
          try {
              LUA::Do_ファイル("MySetting.txt");
          } catch (LUA::例外型 e) {
      
              デバッグ出力 << "MySetting.txtで何かエラー:" << e << endl;
              return; // このレベルでエラーしてるのはまずい。パラメタ読み取り即終了。
          }
      
          try {
              読み込み変数1 = (int)LUA::Get_グローバル数値("test_variable"); // 返り値は小数形式の型なので、intにする
          } catch(...) { }
      
          try {
              読み込み変数2 = LUA::Get_グローバル数値("test_double");
          } catch(...) { }
      
          try {
              読み込み変数3 = LUA::Get_グローバル文字列("test_string");
          } catch(...) { }
      
      
          デバッグ出力 << "変数1:" << 読み込み変数1 << endl;
          デバッグ出力 << "変数2:" << 読み込み変数2 << endl;
          デバッグ出力 << "変数3:" << 読み込み変数3 << endl;
      }
      
      void カスタム::On_起動時() {
          インポート関数();
      }
      

      そして、以下のように対象となるtxtファイルを「天翔記フォルダ」に用意する。

    • MySetting.txt

      test_variable = "5.7"       -- 文字列であったとしても、「数字」であるため、「数値」への変換が可能。上手く読み込まれる。int変換されるので、結果として 5として読み込まれるだろう。
      test_double = "ジバニャン"  -- "ジバニャン"を「実数」として解釈することは不可能である。「例外」が発生し、読み込み代入は行われないであろう。
      test_string = 13.55         -- 数値として定義されているが、問題はない。"13.55"という文字列として、読み込まれる。