14. 値を引き継ぐ
OnTickが呼ばれるたびに前の回から数を1ずつ増やしてみます。次に転生後にも残したい値を指定します。Persistは初回Recompileで解放されます。
メソッドの外に置く値
OnTickの中でint count = 0;と書くと、呼ばれるたびに0から始まります。前の回の値を使うにはProgramのフィールドにします。
ArcaneScript
public class Program : ArcaneProgram
{
private int count = 0;
public void OnTick()
{
count++;
if (count == 3)
{
Workshop.Log.Write("Third call.");
}
}
}countの宣言をOnTickの外へ置いています。最初の呼び出しで1、次で2、その次で3になり、Third call.を出します。4回目には4になるので、この文章は出ません。
OnTickの回数は正確な経過秒数を表すものではありません。
転生しても残す値
通常のフィールドは転生すると初期化されます。Programのフィールド宣言の前に[Persist]を付けると、対応する値を転生後にも残せます。
例えば採掘目標なら[Persist] private int oreTarget = 100;と書きます。OnTickでTotal < oreTargetと比べれば、その目標を使えます。Persistは値を引き継ぐ指定であり、資源を増やしたり、以前のジョブを復元したりする操作ではありません。
いつ処理が呼ばれるか
| 名前 | 呼ばれる場面 |
|---|---|
| OnStart | 初回実行、同じセッションでの通常再開 |
| OnTick | Script実行中の定期的な処理 |
| OnRestored | 再入室後に保存実行版を再開 |
| OnPrestige | 転生後の通知 |
同じセッションで停止・通常再開した場合、フィールドの値は保たれます。再入室後は自分で再開します。転生と再開が重なる場合の順序や、残るデータの種類は転生と引き継ぎで確認できます。
練習問題
例のcountを転生後にも残すにはどの宣言をどう変えますか。
解答例を表示する解答例を閉じる
Program直下のprivate int count = 0;を[Persist] private int count = 0;に変えます。OnTickの中へ移す必要はありません。Persistを付ける場所はProgramのフィールドです。
