ユーザ用ツール

サイト用ツール


embed_var_save

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
embed_var_save [2024/07/12 11:25] – [1.関数から引数を受け取るための実装] machiaworxembed_var_save [2024/07/27 04:32] (現在) machiaworx
行 5: 行 5:
 少なくとも管理者は以下の理由により必要がありました。 少なくとも管理者は以下の理由により必要がありました。
  
-* 敵スクリプトを書いてる時に特定タイミングで次に行動を指定したい +  * 敵スクリプトを書いてる時に1回命令を送って、行動を変えたい 
-* プレイヤーの行動に合わせて敵やボスの行動を変更したい+  * プレイヤーの行動に合わせて敵やボスの行動を変更したい 
 +  * ツールを作っていて、特定命令を1回実行したらツールの色が変わるようにしたい等
  
 上記内容について、実装がうまく行ってるのでその内容を記載します。 上記内容について、実装がうまく行ってるのでその内容を記載します。
行 83: 行 84:
 ただこのおかげでMiniScriptがプログラム本体に影響なく処理を行えるシステムになっているということではあります。 ただこのおかげでMiniScriptがプログラム本体に影響なく処理を行えるシステムになっているということではあります。
  
-これらのグローバル変数正確な計算はしてませんが、恐らく「次のスクリプト起動タイミング」までは有効かと思います。+これらのグローバル変数について正確なウォッチはしてませんが、恐らく「次のスクリプト起動タイミング」までは有効かと思います。
 よって、次の実行までに別の場所に保存する必要があります。 よって、次の実行までに別の場所に保存する必要があります。
  
-※正確に言うと変数のIndexが作られたら以降のプログラム実行後も恐らくそのままではあるんですが、グローバル変数である関係上いつ更新されるか分からないので早い段階で別の場所に保存しておく必要はあると思います。+※正確に言うと変数のIndexが作られたら以降のプログラム実行後もそのままではあるんですが、グローバル変数である関係上いつ更新されるか分からないので早い段階で別の場所に保存しておく必要はあると思います。 
 ==== 2.保存した変数をキープしておく ==== ==== 2.保存した変数をキープしておく ====
  
行 98: 行 100:
 先ほどの話の通りで、基本的にはMiniScriptの変数はInterpreterクラス上で保存されているため、もう1回起動したり開放する場合、一時的に保存した変数等もずっとアクセスできることが保証されていません。\\  先ほどの話の通りで、基本的にはMiniScriptの変数はInterpreterクラス上で保存されているため、もう1回起動したり開放する場合、一時的に保存した変数等もずっとアクセスできることが保証されていません。\\ 
 上記を回避する策として、もう1個Interpreterクラスを作り、このVM上のグローバル変数として保管する実装を行います。 上記を回避する策として、もう1個Interpreterクラスを作り、このVM上のグローバル変数として保管する実装を行います。
 +上記の例では、「SavedInterpreter」がもう1個作成したInterpreterクラスのインスタンスになります。
  
 ちなみに未使用のInterpreterのほうは実行しない想定です。そうしないと状態がキープできないですからね。 ちなみに未使用のInterpreterのほうは実行しない想定です。そうしないと状態がキープできないですからね。
 とは言うものの一度Contextを起動しないとうまく初期化ができないので、ソースコードが空の状態で起動して、上記の処理を行うことになります。 とは言うものの一度Contextを起動しないとうまく初期化ができないので、ソースコードが空の状態で起動して、上記の処理を行うことになります。
  
-=== 参照するときは未使用Interpreterの変数から ===+==== 3.未使用Interpreter上から変数を参照する ==== 
 + 
 +これでいつでも変数を参照できるようにはなりましたが、先程の話の通り利用中のInterpreter上だといつ更新されるかわかりません。 
 +よって、参照するときはコピーした未使用Interpreterクラスから参照を行います。 
 + 
 +  Value search; 
 +  search = savedInterpreter.vm->GetGlobalContext()->GetVar("_sequence0"); 
 + 
 +上記は、変数を作成し、未使用InterpreterクラスからIndexerで変数にアクセスし取得する処理です。\\  
 +ややこしいですがここまででようやく変数をContext外で保存、ないしはアクセスすることができるようになりました。 
 + 
 +ちなみに、特定のインデクサでアクセスできる事自体は「誰も管理していません」。\\  
 +すなわち何も登録していない場合、アクセスした時点で内部で例外的なアクセス扱いになります。(つまりエラー)\\  
 +よって、このインデクサで変数を登録しているよ!という管理が必要になります。 
 + 
 +自分の実装では、別途変数を設けてこのインデクサにアクセスしていることを変数を見て確認した上でアクセスできるようにしました。
  
 +==== 最後に ====
  
 +サンプルプロジェクトも用意したほうがいいかなと思い始めてます。説明がややこしいので。
embed_var_save.1720751139.txt.gz · 最終更新: 2024/07/12 11:25 by machiaworx